串口通信基础:RS-232标准、RS-485标准、串口参数配置、硬件握手

各位工程师朋友,咱们今天聊聊串口通信。说实话,串口这玩意儿虽然老,但在工控圈子里,它就像老黄牛一样,踏实可靠。我入行那会儿,第一个项目就是跟串口打交道,当时被RS-232的接地问题折腾得够呛。今天咱们就把RS-232、RS-485、参数配置和硬件握手这几个硬骨头啃下来。

RS-232标准:老牌劲旅,但脾气不小

RS-232,全称是Recommended Standard 232。它诞生于1960年代,比咱们大多数人的年龄都大。你想想看,一个标准能活半个多世纪,说明它确实有两把刷子。

电气特性上,RS-232用的是单端信号传输。什么意思呢?就是一根信号线对地线,用电压差来表示逻辑状态。具体来说:

  • 逻辑"1"(Mark):-3V ~ -15V
  • 逻辑"0"(Space):+3V ~ +15V
  • -3V ~ +3V 这个区间是无效区,说白了就是噪声容限

关键参数一览:

参数RS-232 典型值
最大传输距离约15米(实际看波特率)
最高波特率115200 bps(常用)
信号电平±12V 左右
连接器DB9(最常见)
通信方式全双工

我记得有一次在工厂调试一台老式PLC,RS-232线拉了20米,结果数据全是乱码。后来一查,是线太长,信号衰减太厉害。所以啊,RS-232的15米限制不是闹着玩的。

避坑指南:我曾经遇到过RS-232通信时好时坏的情况,排查了半天,最后发现是DB9接头的地线虚焊。RS-232对地线质量非常敏感,地线接触不良,信号就会飘忽不定。所以焊接DB9接头时,地线一定要焊牢。

RS-485标准:工业现场的"长跑冠军"

RS-485跟RS-232最大的区别是什么?说白了,RS-485用的是差分信号传输。两根线(A和B)之间的电压差来表示逻辑状态:

  • 逻辑"1":A线比B线高 +200mV 以上
  • 逻辑"0":A线比B线低 -200mV 以上

差分信号的好处很明显——抗共模干扰能力强。你想想看,工业现场电机一启动,电磁干扰满天飞,RS-232那种单端信号很容易被干扰。但RS-485用两根线互相做参考,干扰来了两根线一起跳,电压差基本不变。这就是它能在工业现场站稳脚跟的原因。

RS-485 核心优势:

  • 传输距离远:最远可达1200米(波特率越低距离越远)
  • 支持多节点:一条总线上最多挂32个节点(标准情况)
  • 抗干扰强:差分信号,共模抑制比高
  • 半双工:同一时刻只能发送或接收

我建议大家在设计RS-485网络时,一定要在总线两端加120欧姆的终端电阻。为什么?因为信号在长线上传输时,遇到阻抗不匹配会产生反射,导致数据错误。终端电阻就是用来吸收这些反射波的。我曾经见过一个项目,RS-485通信偶尔丢包,加了终端电阻后问题就解决了。

小技巧:RS-485的A/B线不要接反。虽然有些设备有自动极性检测功能,但大多数设备没有。接反了就是通信不上。我习惯的做法是:A线接A线,B线接B线,屏蔽层单端接地。

串口参数配置:五要素必须对齐

串口通信要成功,通信双方的五要素必须完全一致。这五个参数就像五把钥匙,少一把都打不开门。

  1. 波特率(Baud Rate):每秒传输的符号数。常见的有9600、19200、38400、115200。波特率越高,传输越快,但抗干扰能力越差。
  2. 数据位(Data Bits):每个数据包中实际数据的位数。通常是8位,也有5、6、7位的。
  3. 停止位(Stop Bits):每个数据包结束的标志位。常见的是1位,也有1.5位和2位的。
  4. 校验位(Parity):用于简单的错误检测。有奇校验(Odd)、偶校验(Even)、无校验(None)三种。
  5. 流控制(Flow Control):控制数据发送和接收的节奏。有硬件流控制和软件流控制两种。

举个例子,最常见的配置是:9600, 8, N, 1。意思就是波特率9600,8位数据位,无校验,1位停止位。这个配置在工控领域非常普遍。

参数配置示例(C语言):

// Linux 下串口配置示例
struct termios options;
tcgetattr(fd, &options);

// 设置波特率 9600
cfsetispeed(&options, B9600);
cfsetospeed(&options, B9600);

// 8位数据位,无校验,1位停止位
options.c_cflag &= ~PARENB;   // 无校验
options.c_cflag &= ~CSTOPB;   // 1位停止位
options.c_cflag &= ~CSIZE;    // 清除数据位设置
options.c_cflag |= CS8;       // 8位数据位

// 应用配置
tcsetattr(fd, TCSANOW, &options);

我遇到过最头疼的问题是什么?就是通信双方参数不一致。有一次调试一台变频器,怎么都连不上,折腾了两个小时。最后发现变频器默认是19200波特率,而我程序里写的是9600。所以啊,拿到新设备第一件事,就是确认它的串口参数。

硬件握手:让数据流"有秩序"

硬件握手,也叫硬件流控制。它的作用是防止数据发送太快,接收方来不及处理。说白了,就是让接收方告诉发送方:"你慢点,我快撑不住了。"

RS-232标准中,硬件握手主要用到两个信号:

  • RTS(Request To Send):发送请求。DTE(数据终端设备)告诉DCE(数据通信设备)"我要发数据了"。
  • CTS(Clear To Send):清除发送。DCE告诉DTE"可以发了,我准备好了"。

实际工作中,硬件握手的流程是这样的:

  1. DTE想要发送数据,先拉高RTS信号。
  2. DCE如果准备好了,就拉高CTS信号作为回应。
  3. DTE看到CTS为高,开始发送数据。
  4. 如果DCE来不及处理,就拉低CTS,DTE看到后暂停发送。

个人经验:在工控现场,我一般不建议使用硬件握手。为什么?因为很多工控设备的RS-232接口只用了三根线(TXD、RXD、GND),RTS和CTS根本没接。你如果程序里配置了硬件流控制,通信就会卡死。我习惯的做法是:能用软件流控制就用软件流控制,实在不行就无流控制,靠协议层来保证数据完整性。

RS-485因为是半双工,没有专门的硬件握手信号。它的"握手"是通过使能控制来实现的。发送数据时,使能发送器;发送完毕,使能接收器。这个切换时机非常关键,切换早了数据没发完,切换晚了会丢失接收数据。

注意:我曾经在RS-485的使能切换上吃过亏。当时用的是MAX485芯片,发送完最后一个字节后立即切换为接收模式。结果发现最后一个字节总是发不出去。后来查手册才知道,MAX485的发送使能到数据真正发完之间有延迟。正确的做法是:发送完最后一个字节后,等待一个字节的传输时间再切换。这个时间可以用 1/波特率 × 10 来估算。

总结一下

RS-232和RS-485各有各的用武之地。RS-232适合短距离、点对点的通信,比如调试口、控制台。RS-485适合长距离、多节点的工业现场总线。串口参数配置的核心就是"五要素对齐",硬件握手则要根据实际硬件情况来选择。

嗯,今天就聊到这儿。下一章咱们会深入讲Modbus协议,那可是工控通信的"通用语言"。到时候我会分享一些我在Modbus调试中踩过的坑,保证让你少走弯路。