第二章 通讯基础概念:串口通讯、RS-232/RS-485标准、波特率、数据位、停止位、校验位
各位工程师朋友,咱们今天聊点实在的。远程IO模块要跟PLC或者上位机对话,靠的是什么?说白了,就是串口通讯。这玩意儿看着基础,但我在现场见过太多人栽在它上面。今天我就把串口通讯的底裤扒开,让你看得明明白白。
2.1 串口通讯:数据怎么“串”起来?
串口通讯,顾名思义,就是数据一位一位地串着发。你想想看,一根线,一次只能传一个比特(0或1)。就像排队过独木桥,一个一个来。
我刚开始做项目时,总觉得并行通讯快,串口太慢。后来发现,串口虽然慢,但抗干扰能力强,线也少,成本低。工业现场动不动几十米上百米,并行线早被干扰得不成样子了。串口反而稳得很。
串口通讯的核心,就是约定好“什么时候发、什么时候收”。双方得对表,不然数据就乱套了。这个“对表”的过程,就是我们接下来要聊的波特率、数据位、停止位、校验位。
2.2 RS-232 与 RS-485:两个老将
这两个标准,是串口通讯的物理层规范。说白了,就是规定电压多少、怎么接线。
2.2.1 RS-232:老当益壮,但腿短
RS-232 是早期PC机上的标配。它的信号电压是 ±12V 左右,逻辑“1”是负电压,逻辑“0”是正电压。这个电压摆幅大,抗干扰能力还行。
但它的致命伤是——距离短。一般也就15米左右。我在一个老旧工厂里见过,RS-232 线拉了20米,数据就开始丢包。后来我直接换成了 RS-485,问题立马解决。
另外,RS-232 是点对点的,一个口只能接一个设备。这在现代工业里,基本不够用。
2.2.2 RS-485:工业现场的老黄牛
RS-485 是我个人最常用的标准。它用差分信号传输,两根线(A和B),抗干扰能力极强。距离能到1200米,速度也能到10Mbps(短距离时)。
更重要的是,RS-485 支持多节点。一条总线上可以挂32个设备(标准),有些芯片能挂到256个。远程IO模块基本都是用 RS-485 组网的。
接线也简单:A接A,B接B。但要注意,总线两端要加120欧姆的终端电阻。我遇到过好几次,不加电阻,通讯时好时坏,加了就稳如老狗。
| 特性 | RS-232 | RS-485 |
|---|---|---|
| 传输方式 | 单端(非平衡) | 差分(平衡) |
| 最大距离 | 约15米 | 约1200米 |
| 最大节点数 | 1对1 | 32~256个 |
| 电压范围 | ±12V | ±5V(差分) |
| 抗干扰能力 | 一般 | 强 |
| 典型应用 | 调试口、短距离 | 工业总线、远程IO |
2.3 波特率:通讯的“心跳”
波特率,就是每秒传输的比特数。单位是 bps(bits per second)。
常见的波特率有:9600、19200、38400、115200。工业远程IO模块,我一般用9600或19200。为什么?因为距离远、干扰大,高速率容易出错。
有一次,我在一个变频器旁边调试,用了115200的波特率,数据全是乱码。降到9600,立马正常。你想想看,高速率对信号质量要求高,现场环境复杂,还是稳一点好。
波特率必须一致。发送方和接收方得对好表。差一点都不行。我见过有人设成9600和9640,结果通讯时断时续,查了半天才发现是波特率偏差。
2.4 数据位:一次传多少数据?
数据位,就是一次传输中,实际数据的位数。常见的有7位和8位。
7位数据位,一般用于传输ASCII字符(0-127)。8位数据位,可以传0-255的数值,更常用。远程IO模块,基本都是8位数据位。
我建议你,除非有特殊要求,一律用8位数据位。省得后面扩展时还要改配置。
2.5 停止位:给接收方一点缓冲
停止位,就是一帧数据结束后的空闲时间。常见的有1位、1.5位、2位。
停止位的作用,是让接收方有时间处理刚收到的数据。如果接收方处理速度慢,或者时钟有偏差,停止位长一点更安全。
我一般用1位停止位。如果通讯不稳定,可以试试2位。但说实话,现在芯片处理速度都很快,1位基本够用。
2.6 校验位:数据对不对?
校验位,是用来检测数据在传输过程中有没有出错。常见的有:
- 无校验(None):不校验,速度快,但容易出错。
- 奇校验(Odd):数据位+校验位中,1的个数为奇数。
- 偶校验(Even):数据位+校验位中,1的个数为偶数。
- 标记校验(Mark):校验位固定为1。
- 空格校验(Space):校验位固定为0。
工业现场,我推荐用无校验或偶校验。无校验速度快,偶校验能检测单比特错误。奇校验也行,但用得少。
我曾经在一个项目中,用了偶校验,结果发现数据偶尔会错。排查了半天,发现是干扰导致校验位翻转。后来我改成无校验,加了CRC校验(后面章节会讲),问题就解决了。所以,校验位只是基础,真正要可靠,还得靠更高级的校验机制。
2.7 实战配置:一个典型的远程IO模块
假设你手头有一个远程IO模块,要跟PLC通讯。典型的配置是这样的:
波特率:9600
数据位:8
停止位:1
校验位:无
流控制:无
这个配置,在工业现场最通用。我90%的项目都用这个。如果通讯距离超过500米,我会把波特率降到4800或2400。
2.8 避坑指南:我踩过的那些坑
- 地线问题:RS-485虽然差分,但最好还是共地。我遇到过地电位差太大,烧了模块的。
- 终端电阻:长距离通讯,不加终端电阻,信号会反射。我吃过这个亏。
- 接线顺序:先接GND,再接信号线。带电插拔容易烧接口。
- 波特率偏差:两个设备的晶振精度不同,会导致波特率偏差。用高精度晶振,或者用自动波特率检测功能。
好了,这一章的内容就到这里。串口通讯看着简单,但细节很多。你把这些基础概念吃透了,后面学Modbus、Profibus就轻松多了。下一章,我们聊聊Modbus RTU协议,这可是远程IO模块的“通用语言”。