手把手一起完成 Python 上位机与下位机 USB 通信

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