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通信基础 工业协议概览 Python环境搭建 硬件准备 • 异步通信原理 • 数据帧结构 • 波特率与时序 • TX/RX/GND接线 • RS-232 vs RS-485 • Modbus RTU帧格式 • 主从架构 • 自定义协议设计 • Python 3.8+安装 • pip换源 • pyserial库安装 • 版本验证 • CH340/FT232选型 • 驱动安装 • 端口识别 • 自收发测试 目标:能写第一行串口代码,能连上第一个设备

这张图把本章的四个核心模块串起来了。从左到右,从理论到实践,每一步都是下一章的基础。你想想看,如果连UART的帧结构都搞不清楚,后面写Modbus驱动肯定会一头雾水。

1.6 本章小结

这一章我们干了三件事:

  • 搞懂了UART通信的本质——就是两根线加一个约定好的速度
  • 了解了工业上常用的几种协议——RS-232、RS-485、Modbus RTU
  • 搭好了Python开发环境,准备好了USB转串口硬件

嗯,到这里,你的「工具箱」已经准备好了。下一章开始,我们就要真正用Python去操作串口了。到时候你会发现,原来让两个设备「说话」,其实没那么难。

课后小作业:拿出你的USB转串口模块,短接TX和RX,用串口助手发一个字节0x55(二进制01010101),看看能不能收到。如果能,恭喜你,环境完全OK!