手把手一起完成 Python 上位机与下位机 USB 通信
warning:
这篇文章距离上次修改已过189天,其中的内容可能已经有所变动。
手把手一起完成 Python 上位机与下位机 USB 通信
USB 通信是嵌入式开发中常见的功能之一,上位机(通常是电脑)可以通过 USB 接口与下位机(通常是 MCU 开发板或其他硬件设备)进行数据交换。本文将带你一步步完成基于 Python 的上位机与下位机 USB 通信示例,包括代码实现、图解和详细说明。
一、USB 通信的基础概念
1.1 什么是 USB 通信?
USB(Universal Serial Bus)是计算机与外部设备之间通信的标准接口。通过 USB 通信,上位机和下位机可以交换指令和数据。
1.2 常见的 USB 通信模式
- HID(Human Interface Device):用于鼠标、键盘等设备。
- CDC(Communications Device Class):用于串口通信。
- Bulk(大容量传输):用于文件传输。
- ISO(同步传输):用于音频或视频设备。
1.3 本文通信模型
我们将采用 虚拟串口通信(CDC 模式) 的方式。即:
- 下位机通过 USB 转换为虚拟串口。
- 上位机通过 Python 访问该虚拟串口进行通信。
二、环境准备
2.1 硬件
- 一块支持 USB 串口通信的开发板(如 Arduino、ESP32、STM32)。
- USB 数据线。
2.2 软件
- Python(建议使用 Python 3.7+)。
- 必要的 Python 库:
pyserial
。
安装 pyserial
:
pip install pyserial
三、下位机程序示例
以 Arduino 为例,实现一个简单的 USB 通信功能。
3.1 Arduino 下位机代码
void setup() {
Serial.begin(9600); // 初始化串口,波特率为 9600
}
void loop() {
if (Serial.available() > 0) { // 检测是否有数据从上位机发送过来
String data = Serial.readString(); // 读取上位机发送的数据
Serial.print("收到数据: "); // 返回收到的数据
Serial.println(data);
}
}
说明:
- 使用
Serial
类与上位机通信。 - 上位机发送任意数据,下位机将其接收并回复。
- 使用
3.2 上传代码到开发板
- 使用 Arduino IDE 或其他编程工具,将代码上传到开发板。
四、上位机 Python 程序
使用 pyserial
库与下位机通信。
4.1 代码示例
import serial
import time
# 配置串口
ser = serial.Serial(
port="COM3", # 替换为你的设备端口
baudrate=9600, # 波特率,与下位机一致
timeout=1 # 超时时间(秒)
)
# 等待设备初始化
time.sleep(2)
print("开始通信...")
try:
while True:
# 发送数据到下位机
data_to_send = input("输入要发送的数据:")
ser.write(data_to_send.encode("utf-8")) # 编码后发送
# 接收下位机返回的数据
response = ser.readline().decode("utf-8").strip()
if response:
print(f"下位机回复: {response}")
except KeyboardInterrupt:
print("通信结束!")
ser.close()
五、运行结果
硬件连接
- 使用 USB 数据线将开发板连接到电脑。
- 在设备管理器中找到开发板的虚拟串口号(如 COM3)。
运行程序
启动上位机程序,输入需要发送的数据:
输入要发送的数据:Hello 下位机回复: 收到数据: Hello
下位机输出
通过串口监视器可以看到下位机的输出:
收到数据: Hello
六、图解 USB 通信流程
上位机 (Python) 下位机 (Arduino)
输入数据:Hello ------------------>
接收并解析数据
<-- 回复数据:收到数据: Hello
七、常见问题及解决方法
7.1 端口占用
现象:运行程序时报错 Access is denied
或 Port is already in use
。
解决:
- 检查是否有其他程序占用了该串口(如串口监视器)。
- 确保关闭其他占用串口的程序。
7.2 数据乱码
现象:收到的数据显示为乱码。
解决:
- 检查上下位机的波特率是否一致。
- 确保使用正确的字符编码(如 UTF-8)。
7.3 下位机未响应
现象:下位机无返回数据。
解决:
- 确保 USB 数据线支持数据传输。
- 检查下位机代码是否正常运行。
八、扩展功能
8.1 多线程实现异步通信
在实际应用中,可以使用多线程分别处理发送和接收数据,提高通信效率。
8.2 增加校验机制
为了保证通信的准确性,可以在传输的数据中添加校验位,例如 CRC 校验。
8.3 图形化界面
使用 Python 的 tkinter
或 PyQt
库开发一个图形化界面,提升用户体验。
九、总结
通过本文,我们实现了一个基于 Python 的上位机和 Arduino 下位机之间的 USB 通信功能。希望这篇教程能够帮助你轻松掌握 USB 通信的基础知识,并为你的项目开发提供参考!
动手试试吧,你会发现 USB 通信并没有想象中那么难!
评论已关闭