Qt串口通信与驱动交互故障排查 - 第1节
一、串口通信基础:RS232/RS485/RS422 标准对比
串口通信,说白了就是设备之间「按位聊天」的方式。我做了十几年嵌入式,跟串口打交道的次数比跟老婆说话还多。很多初学者一上来就纠结RS232、RS485、RS422的区别,其实没那么玄乎。
这三种标准,本质上是物理层的差异。它们定义了电压怎么摆、线怎么接、能传多远。我当年第一次做项目,选错了RS232,结果现场距离差了20米,数据全乱码。嗯,从那以后我再也不敢小看物理层了。
1.1 三种标准的核心差异
| 特性 | RS232 | RS485 | RS422 |
|---|---|---|---|
| 传输方式 | 单端(不平衡) | 差分(平衡) | 差分(平衡) |
| 最大距离 | 约15米 | 约1200米 | 约1200米 |
| 最大节点数 | 1发1收 | 32个(可扩展) | 1发10收 |
| 电压范围 | ±3V ~ ±15V | ±1.5V ~ ±6V | ±2V ~ ±6V |
| 常用场景 | 调试口、短距设备 | 工业总线、多机通信 | 长距点对多点 |
你想想看,RS232用单端信号,地线一长就容易受干扰。RS485和RS422用差分对,两根线拧在一起,噪声在两根线上同时出现,一减就没了。这就是为什么工业现场清一色用RS485。
我的经验: 做Qt串口调试时,如果发现数据偶尔错位,先别急着查代码。拿万用表量一下RS232的TX和GND之间的电压。正常空闲状态应该是-3V到-15V。如果量出来是0V,八成是线断了或者芯片烧了。
1.2 RS232 引脚定义与接线
RS232最常见的接口是DB9,9个针脚。但实际项目中,我们只用其中3根:TX、RX、GND。我见过太多人把2、3脚接反,结果数据发出去收不到,还以为是程序写错了。
| 引脚号 | 信号名 | 方向(DTE侧) | 说明 |
|---|---|---|---|
| 2 | RXD | 输入 | 接收数据 |
| 3 | TXD | 输出 | 发送数据 |
| 5 | GND | - | 信号地 |
| 7 | RTS | 输出 | 请求发送(流控用) |
| 8 | CTS | 输入 | 允许发送(流控用) |
注意: 我曾经遇到一个坑——某工控机的DB9定义跟标准相反,它的2脚是TX,3脚是RX。所以拿到设备第一件事,拿示波器或者逻辑分析仪确认一下引脚定义,别信标签。
二、波特率/数据位/停止位/校验位详解
这些参数决定了串口通信的「语速」和「语法」。两边必须完全一致,否则收到的全是乱码。我调试时最常犯的错误就是波特率设错——9600和115200差了一个数量级,数据根本对不上。
2.1 波特率
波特率就是每秒传输的符号数。常见的有:9600、19200、38400、115200、921600。
- 9600:最通用,抗干扰强,适合长距离
- 115200:速度快,适合短距调试
- 921600:高速传输,但线缆质量要求高
我个人习惯:调试阶段用115200,速度快,刷日志不卡。现场部署如果距离超过10米,降到9600或19200,稳当。
2.2 数据位
数据位通常是7位或8位。7位用于ASCII字符传输(比如老式电传机),8位用于二进制数据。现在99%的场景都用8位。你想想看,一个字节8位,用7位还得拼凑,何必呢?
2.3 停止位
停止位是每个字节结束后的间隔,可以是1位、1.5位或2位。1位最常用。2位用于慢速设备或机械式设备,给接收端更多时间处理。
小技巧: 如果通信偶尔丢字节,试试把停止位从1改成2。相当于给接收端多喘口气的时间。我在一个老式PLC项目里就这么解决的。
2.4 校验位
校验位用于简单的错误检测。有三种模式:
- 无校验(None):最常用,不额外开销
- 奇校验(Odd):数据位+校验位中1的个数为奇数
- 偶校验(Even):数据位+校验位中1的个数为偶数
说实话,校验位只能检测奇数个位翻转,实际用处有限。真正要可靠传输,得上CRC或者应用层校验。我一般只在调试时开校验,看看是不是有干扰。
三、串口硬件接线与引脚定义
接线是串口通信的第一步,也是最容易出问题的一步。我见过有人把RS485的A、B线接反,结果数据全反相,折腾了两天。
3.1 标准接线方式
RS232 三线制接线:
设备A TX —— 设备B RX
设备A RX —— 设备B TX
设备A GND —— 设备B GND
RS485 两线制接线:
设备A A(+) —— 设备B A(+)
设备A B(-) —— 设备B B(-)
设备A GND —— 设备B GND(建议接)
RS422 四线制接线:
设备A TX+ —— 设备B RX+
设备A TX- —— 设备B RX-
设备A RX+ —— 设备B TX+
设备A RX- —— 设备B TX-
设备A GND —— 设备B GND(建议接)
避坑指南: 我曾经在RS485总线上没接终端电阻,结果长距离通信时信号反射严重,数据错得一塌糊涂。120欧姆电阻并接在总线最远两端,这是标准做法,别省。
3.2 常见接线错误
- TX/RX接反:数据发出去收不到,但能收到自己发的(回环)
- GND没接:RS232必须共地,否则电压参考点不同
- RS485 A/B接反:数据反相,逻辑0变1,1变0
- 终端电阻缺失:长距离信号反射,数据错位
四、知识体系结构图
下面这张图把本章的核心知识点串起来了。你可以把它当作串口通信的「地图」,以后遇到问题先看这张图定位。
五、实战要点总结
这一章的内容,说白了就是串口通信的「基本功」。我建议你记住三件事:
- 先看物理层:电压对不对?线接对了没?地线接了没?
- 再对参数:波特率、数据位、停止位、校验位,两边一字不差
- 最后查协议:如果前两步都对了,数据还是不对,那就是协议层的问题了
我的习惯: 每次新项目拿到设备,第一件事就是拿串口助手发个0x55(二进制01010101),用示波器看波形。如果波形规整、幅度正确,说明硬件没问题。这一步能省掉后面80%的排查时间。