(模块全代码获取方式,关注微信公号,发送switch)
关注微信公众号 (airX嵌入式),获取更多项目经验!
一、何为UART
通用异步收发器(Universal Asynchronous Receiver/Transmitter),通常称作UART,是一种串行、异步、全双工的通信协议,在嵌入式领域应用的非常广泛。Can、lin、嵌入式wifi模块等都可以使用uart进行通信。
其实就是2根线,利用高低电平的时序一根收,一根发进行双向通信!当然地要接的!所以应该是3线!
二、通信原理
工作原理是将传输数据的每个二进制位一位接一位地传输。在UART通信协议中信号线上的状态为高电平时代表逻辑‘1’,信号线上的状态为低电平时代表逻辑‘0’,比如使用UART通信协议进行一个字节数据的传输时就是在信号线上产生八个高低电平的组合。
三、协议理解
既然我们想要在一条只能控制产生高低电平的线上串行的传输数据,我们只能利用实际物理上的高低电平的时序组合来做标识了,也就是协议。
下面是uart的一个数据流的格式定义,如果Data数据段是8位的话,就是一个字节的数据流了!
下面这些是协议的规定,通信双方都要以此为依据,才能正常通信!
空闲位:
UART协议规定,当总线处于空闲状态时信号线的状态为‘1’即高电平,表示当前线路上没有数据传输。
通信结束,电平都需要回到这个状态!(我遇到过通信前才进入这个状态也是可以的,但是要提前进入)
箭头就是空闲状态的电平
起始位:
每开始一次通信时发送方先发出一个逻辑”0”的信号(低电平),表示传输字符的开始。因为总线空闲时为高电平所以开始一次通信时先发送一个明显区别于空闲状态的信号即低电平。
从实际物理波形来看,是下降沿加一位长度的低电平。
起始位看下图红色时序:
数据位:
起始位之后就是我们所要传输的数据,数据位可以是5、6、7、8,9位等,构成一个字符(一般都是8位)。如ASCII码(7位),扩展BCD码(8位)。先发送最低位,最后发送最高位,使用低电平表示‘0’高电平表示‘1’完成数据位的传输。
我连续发送的0x55和0xAA;低位先走,数据段看下图红色段的数据:
奇偶校验位:
数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。校验位其实是调整个数,串口校验分几种方式:
· 1、无校验(no parity)。
· 2、奇校验(odd parity):如果数据位中“1”的数目是偶数,则校验位为“1”,如果“1”的数目是奇数,校验位为“0”。
· 3、偶校验(even parity):如果数据为中“1”的数目是偶数,则校验位为“0”,如果为奇数,校验位为“1”。
· 4、mark parity:校验位始终为1(不常用)。
· 5、parity:校验位始终为0(不常用)。
这个不常用,手上支持校验位的模块也没有,就算了。
停止位:
它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备之间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟的机会。停止位个数越多,数据传输越稳定,但是数据传输速度也越慢。
其实就是数据位后面拉高一位的时间,下图黄色部分:
我传送的数据是2个,0x58和0xAA,低位先行的!
波特率:
数据传输速率使用波特率来表示。单位bps(bits per second),常见的波特率9600bps、115200bps等等,其他标准的波特率是1200,2400,4800,19200,38400,57600。举个例子,如果串口波特率设置为4800bps,那么传输一个比特需要的时间是1/4800≈208us。
下图就是一个4800的数据的时间长度,x=210us左右;
传输方向:
即数据是从高位(MSB)开始传输还是从低位(LSB)开始传输。比如传输“A”如果是MSB那么就是01000001,如果是LSB那么就是10000010,uart传输数据的顺序就是:刚开始传输一个起始位,接着传输数据位,接着传输校验位(可不需要此位),最后传输停止位。这样一帧的数据就传输完了。接下来接着像这样一直传送。在这里还要说一个参数。 帧间隔:即传送数据的帧与帧之间的间隔大小,可以以位为计量也可以用时间(知道波特率那么位数和时间可以换算)。比如传送”A”完后,这为一帧数据,再传”B”,那么A与B之间的间隔即为帧间隔。
最后区分一下比特率和波特率的区别
1.比特率
比特率(bit rate)又称传信率、信息传输速率(简称信息速率,information rate)。其定义是:通信线路(或系统)单位时间(每秒)内传输的信息量,即每秒能传输的二进制位数,通常用Rb表示,其单位是比特/秒(bit/s或b/s,英文缩略语为bps)。
在二进制系统中,信息速率(比特率)与信号速率(波特率)相等,例如,当系统以每秒50个二进制符号传输时,信息速率为50bit/s,信号速率也为50Bd(波特)。在无调制的情况下,比特率等于波特率;采用调相技术时,比特率不等于波特率。通信系统的发送设备和接收设备必须在相同的波特率下工作,否则会出现帧同步错误。
2、波特率
波特率(Baud rate)又称传码率、码元传输速率(简称码元速率)、信号传输速率(简称信号速率,signaling rate)或调制速率。其定义是:通信线路(或系统)单位时间(每秒)内传输的码元(脉冲)个数;或者表示信号调制过程中,单位时间内调制信号波形的变换次数,通常用RB表示,单位是波特(Bd或Baud,前者规范)。如果每秒传输1个码元就称为1Bd;如果1码元的时间长短为200ms,则每秒可传输5个码元,那么码元速率(波特率)就是5Bd。