目录
UART介绍
UART全称Universal Asynchronous Receiver/Transmitter,通用异步收发传输器,是一种串行、异步、全双工的通信协议。
- 串行通信:通过单条数据线或差分线逐位传输数据,每次仅传输一个二进制位(bit),按顺序完成整个字节或数据块的传输。其特点是线路简单、成本低,适用于远距离通信,
- 并行通信:通过多条数据线同时传输一组数据的多个位(如8位、16位),以字节或字为单位进行数据交换。其优势在于短距离下传输速率高,但线路复杂且成本较高。
- 同步通信:要求发送端和接收端共享同一时钟信号或严格同步的时钟频率,数据以连续比特流形式传输,通常以数据块(包含同步字符、数据字段和校验码)为单位。
- 异步通信:无需共享时钟,数据以字符为单位传输,通过起始位和停止位标识每个字符的边界,允许发送端和接收端时钟存在一定误差。
- 单工通信:在一个通信系统中,发送数据的一方叫发送发,接受数据的一方叫接受方,一旦角色确定下来后,永远不会改变。(遥控器)
- 半双工通信:在一个通信系统中,一个设备既可以作为发送方发送数据,也可以作为接收方接受数据,但是同一时刻只能拥有一种身份。----可以切换方向的单工 (对讲机)
- 全双工通信:在一个通信系统中,同一个设备同一时刻既是发送方,也是接收方,同时收发数据。(电话,手机)
物理层
UART是通信协议,而RS232/RS485等是物理接口标准,二者需结合使用才能完成完整通信链路,UART是通信协议的核心,RS232、RS485则是物理层实现的不同选择。
RS232/RS485规定了总线的电气特性,由于历史原因,IBM的PC外部接口为RS232,成为PC界的默认标准,而在工业控制领域,常用的接口标准为RS485。这里以RS232接口标准讲述uart的物理接口。

设备A和设备B通过DB9串口链接起来,串口信号线中使用RS-232标准传输数据信号。由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个电平转换芯片转换成控制器能识别的TTL校准的电平信号,实现设备间信号通信。
电平标准
| 物理层通信标准 | 电平标准 |
| TTL | 逻辑1:3.3V或者5V 逻辑0:0V |
| RS232 | 逻辑1:-3V到-15V, 逻辑0:+3V到+15V |
物理接口

- DCD:接收线信号检出,用来表示DCE已接通通信链路,告知DTE准备接收数据。当本地的 MODEM收到由通信链路另一端(远地)的MODEM送来的载波信号时,使RLSD信号有效,通知终端准备接收,并且由MODEM将接收下来的载波信号解调成数字数据后,沿接收数据线RXD送到终端。此线也叫作数据载波检出(Data Carrier detection,DCD)线。
- RXD:接收数据
- TXD:发送数据
- DTR:数据终端准备好,有效时(ON)状态 ,表明数据终端可以使用。
- GND:地线。
- DSR:数据装置准备好,有效时(ON)状态,表明通信装置处于可以使用的状态。
- RTS:请求发送,用来表示DTE请求DCE发送数据,即当终端要发送数据时,使该信号有效(ON状态),向 MODEM请求发送。它用来控制 MODEM是否要进入发送状态。
- CTS:清除发送,用来表示DCE准备好接收DTE发来的数据,是对请求发送信号RTS的响应信号。当 MODEM已准备好接收终端传来的数据并向前发送时,使该信号有效,通知终端开始沿发送数据线TXD发送数据。
- RI:振铃指示,当 MODEM收到交换台送来的振铃呼叫信号时,使该信号有效(ON状态),通知终端,已被呼叫。
协议层
波特率
波特率:波特率表示单位时间内传送的码元符号的个数,它是对符号传输速率的一种度量,它用单位时间内载波调制状态改变的次数来表示,波特率即指一个单位时间内传输符号的个数。
码元:在数字通信中常常用时间间隔相同的符号来表示一个二进制数字,这样的时间间隔内的信号称为(二进制)码元。 而这个间隔被称为码元长度。值得注意的是当码元的离散状态有大于2个时(如M大于2个),此时码元为M进制码元。
比特率:对信息传输速率(传信率)的度量。比特率指单位时间内通过信道传输的信息量(也称为位传输速率),即单位时间内传送的二进制位数,用来表示有效数据的传输速率,用b/s 、bit/s、比特/秒。
波特率与比特率的关系:1波特每秒即指每秒传输1个码元符号(通过不同的调制方式,可以在一个码元符号上负载多个bit位信息),1比特每秒是指每秒传输1比特(bit)。存在一种特殊的情况,一个码元负载一个bit位信息的时候,波特率=比特率。RS232波特率的码元就是负载一个bit位信息。
数据帧格式

- 起始位:每开始一次通信时发送方先发出一个逻辑”0”的信号(低电平),表示传输字符的开始。因为总线空闲时为高电平所以开始一次通信时先发送一个明显区别于空闲状态的信号即低电平。
- 数据位:起始位之后就是我们所要传输的数据,数据位可以是5、6、7、8,9位等,构成一个字符(一般都是8位)。如ASCII码(7位),扩展BCD码(8位)。先发送最低位,最后发送最高位,使用低电平表示‘0’高电平表示‘1’完成数据位的传输。
- 校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。校验位其实是调整个数,串口校验分几种方式:
- 无校验(no parity):在数据帧中不设置校验位。
- 奇校验(odd parity):如果数据位中“1”的数目是偶数,则校验位为“1”,如果“1”的数目是奇数,校验位为“0”。
- 偶校验(even parity):如果数据为中“1”的数目是偶数,则校验位为“0”,如果为奇数,校验位为“1”。
- mark parity:校验位始终为1(不常用)。
- space parity:校验位始终为0(不常用)。
- 停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。 由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备之间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟的机会。停止位个数越多,数据传输越稳定,但是数据传输速度也越慢。
- 空闲位:UART协议规定,当总线处于空闲状态时信号线的状态为‘1’即高电平,表示当前线路上没有数据传输。
tx发送两个字节数据的波形示例:

波特率自适应
发送特定字符
原理:发送固定前导字符'A',接收端遍历预设波特率列表,匹配成功后锁定正确值
流程:
- 发送端以固定波特率发送特征字符‘A’
- 接收端轮询波特率列表,检测是否收到匹配字符

- 匹配成功则回复确认帧,否则重试
硬件波特率自适应
串口波特率计算公式:baudRate = (UINT32)(UART_CLOCK / (16L * divisor))
UART_CLOCK:串口通信的时钟频率
divisor:分频系数,divisor越大,波特率越小
原理:芯片内置自动波特率检测模块,通过硬件计数器直接测量起始位宽度,计算波特率分频参数
流程:
- 根据公式,产生一个串口时钟源UART_CLOCK,一般串口芯片的工作频率为14.857MHz。
- 开启波特率自适应后,串口来数据时,控制器会自动将起始位周期个数保存到ACR寄存器中
- 计算波特率,控制器自动计算不需要软件参与
波特率计算原理如下:
- 读取ACR寄存器获取起始位的周期个数a,由周期个数计算起始脉宽间t=T*a,
- T就是串口芯片的工作频率f的倒数,T=1/f
- 由上述波特率的定义可知:baud是每秒钟传输的位数,1个起始位的传输的时间为1/baud
- 由上述可得:baud=f/a
上述波特率计算是uart控制器自动完成的,自适应完成后divisor寄存器会自动更新,软件可通过读取divisor寄存器得到分频系数反推得到自适应之后的波特率。
硬件流控
当设备处于发送端,检测CTS信号是否有效,若无效(下图的高电平)则表示接收端不能继续接收数据,此时暂停发送,直到CTS信号有效再重新发送。

当设备处于接收端,通过RTS信号通知对端自己是否还能继续接收数据。若不能接收则使RTS信号处于OFF状态(高电平)。
串口通信误差
为什么串口通信一般误差要小于±2%?
串口通讯由起始位、数据位、校验位、停止位组成。以常见的8N1为例,即1位起始位,8位数据位,无校验,1位停止位。也就是说传输一个字节需要10bits。每一个字节都有一个起始位做同步,所以误差只会在一个字节内累计。不难看出,在最后一个位采样时,误差最大,允许极限误差为0.5位。按照每个字节10位计算,最大允许误差为±0.05,即±5%。考虑到串口通讯涉及收发两端,两端都可能存在误差,所以,每端的误差最好控制在±2.5%以内。当数据位、校验位等较多时,要求的时钟误差就更高一些。一般来说,当时钟误差小于±2%时,串口通信是比较可靠的。
当你能认认真真看到这里,再给你灌一口心灵鸡汤:做一些事,不辜负自己的精神状态。不要太过积极,不要太过热情。自己知道自己该有的热情的尺度。——尼采

422

被折叠的 条评论
为什么被折叠?



