手把手一起完成 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()

五、运行结果

  1. 硬件连接

    • 使用 USB 数据线将开发板连接到电脑。
    • 在设备管理器中找到开发板的虚拟串口号(如 COM3)。
  2. 运行程序

    • 启动上位机程序,输入需要发送的数据:

      输入要发送的数据:Hello
      下位机回复: 收到数据: Hello
  3. 下位机输出

    • 通过串口监视器可以看到下位机的输出:

      收到数据: Hello

六、图解 USB 通信流程

上位机 (Python)                  下位机 (Arduino)
   输入数据:Hello  ------------------>
                              接收并解析数据
   <-- 回复数据:收到数据: Hello

七、常见问题及解决方法

7.1 端口占用

现象:运行程序时报错 Access is deniedPort is already in use
解决

  • 检查是否有其他程序占用了该串口(如串口监视器)。
  • 确保关闭其他占用串口的程序。

7.2 数据乱码

现象:收到的数据显示为乱码。
解决

  • 检查上下位机的波特率是否一致。
  • 确保使用正确的字符编码(如 UTF-8)。

7.3 下位机未响应

现象:下位机无返回数据。
解决

  • 确保 USB 数据线支持数据传输。
  • 检查下位机代码是否正常运行。

八、扩展功能

8.1 多线程实现异步通信

在实际应用中,可以使用多线程分别处理发送和接收数据,提高通信效率。

8.2 增加校验机制

为了保证通信的准确性,可以在传输的数据中添加校验位,例如 CRC 校验。

8.3 图形化界面

使用 Python 的 tkinterPyQt 库开发一个图形化界面,提升用户体验。


九、总结

通过本文,我们实现了一个基于 Python 的上位机和 Arduino 下位机之间的 USB 通信功能。希望这篇教程能够帮助你轻松掌握 USB 通信的基础知识,并为你的项目开发提供参考!

动手试试吧,你会发现 USB 通信并没有想象中那么难!

最后修改于:2024年11月30日 21:31

评论已关闭

推荐阅读

DDPG 模型解析,附Pytorch完整代码
2024年11月24日
DQN 模型解析,附Pytorch完整代码
2024年11月24日
AIGC实战——Transformer模型
2024年12月01日
Socket TCP 和 UDP 编程基础(Python)
2024年11月30日
python , tcp , udp
如何使用 ChatGPT 进行学术润色?你需要这些指令
2024年12月01日
AI
最新 Python 调用 OpenAi 详细教程实现问答、图像合成、图像理解、语音合成、语音识别(详细教程)
2024年11月24日
ChatGPT 和 DALL·E 2 配合生成故事绘本
2024年12月01日
omegaconf,一个超强的 Python 库!
2024年11月24日
【视觉AIGC识别】误差特征、人脸伪造检测、其他类型假图检测
2024年12月01日
[超级详细]如何在深度学习训练模型过程中使用 GPU 加速
2024年11月29日
Python 物理引擎pymunk最完整教程
2024年11月27日
MediaPipe 人体姿态与手指关键点检测教程
2024年11月27日
深入了解 Taipy:Python 打造 Web 应用的全面教程
2024年11月26日
基于Transformer的时间序列预测模型
2024年11月25日
Python在金融大数据分析中的AI应用(股价分析、量化交易)实战
2024年11月25日
AIGC Gradio系列学习教程之Components
2024年12月01日
Python3 `asyncio` — 异步 I/O,事件循环和并发工具
2024年11月30日
llama-factory SFT系列教程:大模型在自定义数据集 LoRA 训练与部署
2024年12月01日
Python 多线程和多进程用法
2024年11月24日
Python socket详解,全网最全教程
2024年11月27日