串口通信协议–UART、RS-232、RS-485、RS-422

近期学习了单片机及数电相关知识,故决定系统地学习一些通信协议。手边书本仅介绍了串口低速接口的相关协议。

串行通信
是指通过使用一条数据线(需要地线或控制线),将数据一位一位地一次传输,每一位数据占据一个固定的时间长度。
特点:抗干扰,节省数据线,但速度慢

串行通信时:数据一位一位地排列,按照时序信号控制发送与接收,发送端通过发送始终确定数据位的开始与结束,接收端需要在适当的时间间隔对数据流进行采样并解码。
分为:同步串行通信异步串行通信

同步串行通信的信息帧由同步信号字符(SYNC)、数据字符和校验字符(CRC)组成。在传输数据时需要保持发送时钟与接收时钟的严格同步,但受限于不同厂家间的同步字符不统一,使用范围小。
异步串行通信有两个重要的指标:字符帧格式和波特率。数据通常以字符或者字节为单位组成字符帧传输,字符帧被逐帧发送、接收。发送和接收时钟源彼此独立。
字符帧格式为:一位起始位,八位数据位,一位奇偶校验位,一位停止位。
数据位、奇偶校验位在不同协议中存在不同类别。


串行通信按照工作模式可以分为单工、半双工、双工。
单工 — 发送端、接收端的角色固定;
半双工(RS-485) — 既可以发送也可以接收数据,在各端口存在收发切换电子开关,一般不可以同时发生;
全双工(PS-232)— 由两根可以同时发送和接收的传输线进行通信。


通信端口的初始化
明确编码、解码方式,设置波特率等操作。
波特率:每秒钟发送的位的个数。发送设备与接收设备的波特率不同,会导致解码错误。波特率为9600bps时发送每位的时间约为0.1ms。
数据位:通信中实际数据的位数。如何选择数据位,取决于想传输数据的位数。
停止位:用于表示数据帧的发送结束及设备矫正时钟同步,典型值是1位。停止位的位数越多,不同设备时钟同步的容忍度越大。
奇偶校验位:有三种检验模式,奇校验、偶校验和无校验。奇、偶校验的思想均不是统计数据位中0\1的个数,而是出奇、偶的规律。现大多选择无校验。


RS – (Recommend Standard)
RS-232标准(DB-9)

一般有9个引脚,通信范围在15m以内,属于单端信号传输,存在共地噪声和不能抑制共模干扰等问题,工作时需要保证电平在±(3-15)V以内,各信号线分别代表的含义是:
CD (Carried Detect):载波侦听。表示调制解调器是否检测到了通信设备发出的载波信号。
RD (Receive Data):接收数据。表示从外部设备接收数据的信号线。
TD (Transmit Data):发送数据。表示将数据发送到外部设备的信号线。
DTR (Data Terminal Ready):数据终端就绪。表示计算机已准备好接收或发送数据。
GND (Ground):地线。连接电路的共同接地点。
DSR(Data Set Ready):数据集就绪。表示调制解调器已经启动并可以进行通信。
RTS(Ready to Send):准备好发送。表示计算机已准备好发送数据并要求外部设备做好接收准备。
CTS(Clear to Send):清除发送。表示外部设备已经准备好接收来自计算机的数据
RI(Ring Indicator):振铃指示。表示当电话线路上有来电时的信号。

RS-232的主要缺陷是:
①接口的信号电平较高,容易损坏接口电路的芯片,与TTL电路不相同;
②传输速率较低,波特率<115kbps;
③单端驱动,容易产生共模干扰,需要增加滤波器;
④传输距离有限。


RS-485标准
最高传输速率为10Mb/s,采用平衡驱动器和差分接收器的组合,抗噪声干扰性好,具有多机通信能力,传输距离达1200m(差分传输)
单端驱动与平衡驱动的区别详见度娘


RS-422标准
与RS-485几乎一样,区别在于:
RS-422有四根信号线,可以实现全双工模式;主机从机比可达32,从机之间不可通信,为点对多的双向通信;接收段需要接120Ω的终端电阻,发送端可以不接。


RS-232与RS-485的区别
唯一的区别是,RS-485有发送器的控制信号DE(Drive Enable)而RS-232不需要此信号。

RS-485不能同时接收和发送,需要切换收发。RS-232的发送信号TXD与接收信号RXD各用一根线,不会矛盾。
在进行RS-232 到RS-485的转化时,可以选择将握手信号RTS改造成DE控制信号,同时进行电平转换。在每次编写串行通信程序时,必须先置RTS有效,,当接收完信号后,置RTS无效,避免同一个总线上,多个主机同时处于发送状态的冲突。


UART串口
Universal Asynchronous Receiver\Transmitter,通用异步接发设备,用于支持多机通信,通过设置SCON寄存器的参数可实现。

多机通信需要多传输一个地址码(ID)。在主机传输数据前,每个从机处于待机接收的状态。主机发送数据流中包含地址码,每个从机的串口都会收到主机发出的地址码,程序会判断是否与自己的地址码相同,若相同则会开始启动程序。

在串行传输线上,每次数据流包含11位。第十位用于区分地址和数据。当单片机需要进行多机传输时,传输时包含TB8位,接收包含RB8位,当TB8=1时,表示正在传输一个地址码,含八位,可以连接256个从机。当TB8 =0 时,表示传输数据。接收端可以通过格式判断传输的地址还是数据。

在从机中,通常以串行中断的方式来对待进来的数据,若把 SCON 寄存器的 SM2 位设置成为 1时,即允许串行接口进行多从机的地址判断,在这个模式下,从机只在接收地址值 (其 RB8=1) 时才产生中断请求。

在串行中断的服务程序上,只要由 SBUF 内读回地址值,就做一个判断是否被调用。若为 YES 时则跳去执行程序设置的操作,若为 NO 时则不做任何操作,随即结束此中断服务程序并返回主程序,特定的从机先设置成 SM2,然后开始发送或者接收数据,而其他的从机并未启动传输。

在此瞬间仍然是一对一的通信,当主机在最初的发送地址阶段却是一对多的通信。

单片机的串口是 TTL 电平的,也就是 5 V,传输距离最远只有 5 m。如果想要远距离传输,还应将 TTL 电平转换为 RS-485 电平。


改日学ModBus协议。

物联沃分享整理
物联沃-IOTWORD物联网 » 串口通信协议–UART、RS-232、RS-485、RS-422

发表评论