RS232协议

一文读懂 RS232:从基础概念到实操,说得明明白白
咱们先抛开复杂术语,用大白话把 RS232 的核心逻辑讲清楚 —— 它就是设备间 “传小数据” 的常用接口,比如单片机跟电脑、传感器跟控制器之间通信,很多时候都靠它。下面从基础概念、协议规则、自定义优化到实操接线,一步步说透:
一、先搞懂:RS232 到底是个啥?跟 “串口”“UART” 啥关系?
很多人容易把这些词搞混,其实可以这么理解:
串口是个大类别,就像水果;RS232、RS485 是串口里的具体品种,就像苹果、橘子。
UART是串口的工作方式(异步通信),不用额外的时钟线,靠约定好的规则传数据;如果加了时钟线,就叫 USRT(同步通信)。咱们平时说的 RS232,基本都是 UART 方式,所以常说串口≈RS232≈UART。
再说说 RS232 的优缺点,为啥大家又爱又恨:
优点:简单、便宜!不管是单片机、ARM 还是电脑,基本都带这个接口,不用额外加复杂电路。
缺点:抗干扰差、传不远!它靠 TXD 线和 GND 线之间的电压传数据(比如 + 12V 代表 0,-12V 代表 1),这种方式容易受外界干扰,一般最多传 15 米,再远数据就乱了。
还有个关键细节:设备内部用的是 TTL 电平(0V 代表 0,5V 代表 1),但真正跟外部设备通信时,必须把 TTL 电平转成 RS232 电平(比如用 MAX232 芯片),不然俩设备说不到一块儿去。
二、RS232 的 “通信规则”:怎么保证数据传不错?
RS232 是异步通信 —— 没有时钟线同步,那怎么让接收方知道哪段是有效数据?就靠起始位、数据位、校验位、停止位这四个小管家,每一个数据(比如一个字节)都要带着这四位一起传:
起始位:告诉接收方要开始传数据了,一般是 1 个低电平。
数据位:真正要传的内容,比如 8 位(1 个字节),像 0x66(二进制 01100110)。
校验位:简单检查数据错没错,比如奇校验(数据位里 1 的个数要为奇数,不够就补 1)、偶校验(1 的个数为偶数)。但这招很粗糙 —— 如果错了 2 个 bit,校验位根本查不出来。
停止位:告诉接收方这个数据传完了,一般是 1 个或 2 个高电平。
但光靠这四个小管家,还是会出问题:
- 校验位查错能力差,传错了不知道;
- 数据错了没法让对方重传;
- 如果总线上接了好几个设备(比如 1 个主机带 3 个传感器),主机分不清数据是哪个设备发的;
- 要是没传完停止位,接收方会一直等,导致后续数据都乱了。
所以大家想了个办法:把数据 “打包成帧”—— 一帧数据包含多个字节,每个字节带起始 / 停止位,再加上额外的 “功能段”,解决上面的问题。
三、自定义协议:给数据 “打包”,让通信更靠谱
自定义协议就是根据实际需求,给一帧数据设计固定结构,比如分成帧起始、命令域、地址域、长度域、数据域、校验域这几个部分,举个实际例子你就懂了:
-
帧起始:用 0x55 或 0xaa 当开头标志。为啥选这两个数?因为 0x55 是二进制 01010101,0xaa 是 10101010,0 和 1 交替出现 —— 一来接收方能通过 0 和 1 的时间间隔,自动识别波特率(比如 9600bps、115200bps);二来如果用 0xff(全 1),外界一点干扰就可能被误认成起始信号。
-
命令域:定义数据的用途,比如上行数据(设备发往主机)用 0x1d,下行数据(主机发往设备)用 0x3a,请求重传用 0xb7,应答用 0x89。
-
地址域(可选):给每个设备分配唯一地址,比如设备 A 是 0x0a,设备 B 是 0x0b。这样主机发数据时带地址,只有对应地址的设备才会接收,解决 “分不清设备” 的问题;也能把多个设备设成同一地址,实现 “一对多” 通信。
-
长度域(可选):如果每次传的数据长度不一样,就用这个字段说明数据域有多少个字节;如果长度固定,就可以省略。
-
数据域:真正要传的业务数据。比如要传 3 个数据 0xa0、0xb0、0xc0,数据域就是 0x03(数据个数)+0xa0+0xb0+0xc0。
-
校验域:比之前的校验位靠谱,常用 CRC16 校验(占 2 个字节)。计算时除了帧起始,其他字段都参与校验,能精准查出数据有没有错。
举个完整例子:要给地址 0x0a 的设备发一帧上行数据,包含 3 个数据 0xa0、0xb0、0xc0,一帧数据就是 0x55(帧起始)+0x1d(命令域)+0x0a(地址域)+0x03(数据个数)+0xa0+0xb0+0xc0(数据域)+0x53+0xfb(CRC16 校验)。
另外,还要加 “应答和重传” 机制:接收方校验数据没错,就发一帧应答帧(比如 0x55+0x89 + 校验值);如果有错,就发重传帧(比如 0x55+0xb7 + 校验值),让对方重新发,这样通信就靠谱多了。
四、实操关键:就接 3 根线,别漏了地线!
想让两个设备通过 RS232 通信,其实不用接很多线,核心就 3 根:
TXD(发送线):甲设备的 TXD 接乙设备的 RXD(接收线),别接反了,不然发不出去数据。
RXD(接收线):跟上面对应,乙设备的 RXD 接甲设备的 TXD。
GND(地线):这根线一定要接!如果不共地,两个设备识别的电压会差很多,数据会乱飘,比如本该是 0 的数据变成 1,根本没法用。
最后总结
不管是 RS232 还是其他通信协议,传数据基本都以字节为单位。比如要传 12 位的 ADC 数据(范围 0-4095),就得拆成两个字节(高位补 0)再传。
从 RS232 到 USB、以太网,能发现物理接口变化不大,但协议越来越复杂 —— 这说明光靠硬件层保证数据可靠不够,还得靠协议里的校验、重传这些机制,才能让数据传得又准又稳。
本文参考了网上的一些内容,侵权联删
友情链接
服务范围
工业自动化产品专业代理,品质保证
技术领先,价格优势,报价迅速,产品全面
技术选型,产品报价,销售安装,工程售后,为您提供工业自动化一站式服务
自动化专业销售
Tel. 19925440503(微信同号) WhatsApp: +86 18576429229
联系工程师
扫码添加WhatsApp
