UART 即通用异步接收器/发送器,是最常用的设备间通信协议之一
硬件电路
- 简单的双向串口通讯有两根通讯线(发送端TX,接受端RX)
- TX与RX需要交叉连接当只需要单向传输时,可以直接一根线
- 电平不一致时,需要加电平转换芯片
听到串口通讯时时常会想到RS232和RS485通讯,其实UART是软件协议,RS232和RS485是硬件协议
RS232和RS485他们都是基于UART软件协议运行的
电平标准
电平标准是数据0和1的表达方式,是传输线缆中认为规定的电压与数据的对应关系,常用串口电平标准如下
- TTL电平:+3.3V或5V表示1,0V表示0;芯片中通讯用此标准
- RS232电平:-3~-15表示1,+3~+15表示0;用了反逻辑,因为电压较大,所以不适合热插拔
- RS485电平:两线电压+2~+6表示1,-2~-6表示0;差分信号
串口参数及时序
- 波特率:串口通讯的速率
- 因为是异步通讯,交互双方需要默认一个统一的通讯速率
- 在0和1的数据传输中,读取方每个周期都会检查线路的电平信号,波特率一致,则读取周期一致
- 起始位:标志一个数据真的开始,固定位低电平
- 当RX脚侦测一个周期内到电平信号从高电平变化为低电平时,则设备进入获取数据帧阶段
- 数据位:数据帧的有效载荷,1为高电平,0为低电平,低位先行
- 低位先行的意思是8位的数据从低位开始发送,一直发送8次,一共经历8个周期。
- 有些地方说数据位能到9位,其实是把校验位放到数据位中达成8+1=9位数据位
- 校验位:用于数据验证,更具数据位计算得来
- 奇校验,偶校验,无校验
- 奇校验:数据位后多了一位,当数据位中有偶数个1,则在此位补1;当数据位中有奇数个1时,不用补
- 偶校验:数据位后多了一位,当数据位中有奇数个1,则在此位补1;当数据位中有偶数个1时,不用补
- 无校验,数据位后没有多余位
- 引申有CRC校验
- 停止位:用于数据帧与帧之间的间隔,固定为高电平
- 停止位长度可以控制,比如设置1位或者2位,这个是为了调整数据帧与帧之间的间隔,1位值固定高电平一个周期,2位则固定高电平2个周期
当起始位从高电平拉低到低电平,经过了数据位,校验位,直到停止位将电平信号拉高到高电平,一个数据帧的发送便完成了。
帧结构
帧结构=起始位+数据位+校验位+停止位
思考问题
为什么同样基于UART标准的RS232只能一主一从通讯而RS485则能一主多从通讯?
他们是改变了硬件还是软件,如何改变的呢?