手把手一起完成 Python 上位机与下位机 USB 通信
    		       		warning:
    		            这篇文章距离上次修改已过338天,其中的内容可能已经有所变动。
    		        
        		                
                手把手一起完成 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 通信并没有想象中那么难!
评论已关闭