1. 课程导论与开发环境搭建
各位同学,欢迎来到《Python硬件接口编程与UART串口工业通信驱动开发实战》的第一章。我是你们这门课的主讲,一个在嵌入式与工控领域摸爬滚打了十几年的老工程师。
说实话,每次带新人或者开新课,我第一件事不是讲什么高大上的协议栈,而是先把「地基」打牢。这一章,我们就来聊聊UART通信到底是个啥、工业上常用的协议有哪些,以及怎么把咱们的Python开发环境搭起来。嗯,别小看这一步,环境搭不好,后面全是坑。
1.1 UART通信基础:从物理层到数据帧
UART,全称是Universal Asynchronous Receiver/Transmitter,通用异步收发器。说白了,它就是让两个设备之间,通过两根线(TX和RX)就能互相说话的一种方式。
为什么叫「异步」?因为没有独立的时钟线。收发双方得事先约定好一个「说话速度」,也就是波特率。比如9600、115200,这些都是常见的速率。
核心要点:UART通信只需要三根线:TX(发送)、RX(接收)、GND(地线)。TX接对方的RX,RX接对方的TX,GND共地。千万别接反了,我见过太多人因为这个原因调了一整天。
咱们来看看一个标准的UART数据帧长什么样:
| 起始位 | 数据位(5~8位) | 校验位(可选) | 停止位(1/1.5/2位) |
|---|---|---|---|
| 0(低电平) | LSB → MSB | 奇/偶/无 | 1(高电平) |
举个例子,你发送一个字符'A'(ASCII码0x41,二进制01000001),如果配置是8N1(8数据位、无校验、1停止位),那线上实际传输的就是:
起始位(0) + 数据位(10000010) + 停止位(1)
注意,数据位是先发低位(LSB),所以0x41的二进制01000001,在线上是反过来的10000010。这个细节,我在做第一个串口项目时就被坑过——拿着逻辑分析仪看波形,怎么都对不上,后来才发现是字节序的问题。
1.2 工业通信协议概览:不止是传字节
UART只是物理层的「管道」,真正让设备之间能「听懂」对方,还得靠上层的协议。工业现场最常见的几种,我列个表:
| 协议名称 | 物理层 | 特点 | 典型应用 |
|---|---|---|---|
| RS-232 | 单端信号,±12V | 点对点,距离短(15m) | 老式PC串口、调试口 |
| RS-485 | 差分信号,半双工 | 多点通信,距离远(1200m) | Modbus RTU、PLC网络 |
| Modbus RTU | RS-232/485 | 主从架构,帧格式固定 | 工业仪表、传感器 |
| 自定义协议 | UART | 灵活,但需自行定义帧头/校验 | 嵌入式设备间通信 |
我个人习惯把RS-232和RS-485看作是「物理层的不同方言」,而Modbus RTU则是「应用层的通用语言」。你想想看,一个温度传感器通过RS-485总线,用Modbus RTU协议把数据传给PLC,这就是典型的工业现场场景。
经验之谈:如果你刚开始接触工业通信,我建议先从Modbus RTU入手。它结构清晰,资料多,而且市面上绝大多数工业设备都支持。我曾经用一个下午,就用Python的pymodbus库把一个老旧的电表数据读出来了,那种感觉,很爽。
1.3 Python环境与pyserial库安装
好,理论说完了,咱们来动手。Python环境搭建,我推荐用Anaconda或者直接装官方Python 3.8+。为什么?因为pyserial库对Python 3的支持已经很成熟了,没必要用太老的版本。
安装pyserial,就一行命令:
pip install pyserial
如果你用的是Anaconda,也可以:
conda install -c conda-forge pyserial
装完之后,怎么验证?打开Python交互环境,输入:
import serial
print(serial.__version__)
如果能正常输出版本号,比如3.5,那就说明装好了。如果报错,大概率是pip源的问题,换成国内镜像试试:
pip install pyserial -i https://pypi.tuna.tsinghua.edu.cn/simple
注意:在Windows系统上,如果你同时装了多个Python版本,记得用 python -m pip install pyserial 来指定当前环境的pip。我曾经因为没注意这个,把库装到了另一个Python版本里,折腾了半小时才找到原因。
1.4 硬件准备:USB转串口模块
现在的电脑,尤其是笔记本,基本都没有原生串口了。所以我们需要一个USB转串口模块,把电脑的USB口模拟成一个COM口。
市面上最常见的方案是FT232和CH340。我个人推荐初学者用CH340,便宜(几块钱),而且驱动好找。FT232虽然稳定,但假货太多,你想想看,花几十块买个假芯片,还不如几块钱的CH340靠谱。
连接方式很简单:
- 模块的TX → 目标设备的RX
- 模块的RX → 目标设备的TX
- 模块的GND → 目标设备的GND
插上电脑后,在设备管理器里会多出一个COM口(Windows)或者/dev/ttyUSB0(Linux)。记下这个端口号,后面写代码要用。
一个小技巧:如果你不确定模块是否工作正常,可以把TX和RX短接(也就是自收发模式)。然后用串口助手发数据,如果能收到自己发的,说明模块和驱动都没问题。这个办法我用了十年,屡试不爽。
1.5 本章知识体系总览
为了让大家对本章内容有个整体印象,我画了一张结构图。你可以把它当作一个「地图」,后面每学一个知识点,都能在这张图上找到它的位置。
这张图把本章的四个核心模块串起来了。从左到右,从理论到实践,每一步都是下一章的基础。你想想看,如果连UART的帧结构都搞不清楚,后面写Modbus驱动肯定会一头雾水。
1.6 本章小结
这一章我们干了三件事:
- 搞懂了UART通信的本质——就是两根线加一个约定好的速度
- 了解了工业上常用的几种协议——RS-232、RS-485、Modbus RTU
- 搭好了Python开发环境,准备好了USB转串口硬件
嗯,到这里,你的「工具箱」已经准备好了。下一章开始,我们就要真正用Python去操作串口了。到时候你会发现,原来让两个设备「说话」,其实没那么难。
课后小作业:拿出你的USB转串口模块,短接TX和RX,用串口助手发一个字节0x55(二进制01010101),看看能不能收到。如果能,恭喜你,环境完全OK!