1、UART 全称Universal Asynchronous Receiver/Transmitter通用异步收发器。是一种通用串行数据总线,用于异步通信(发送每个字节的间隔不一定一样,每个字节内的bite位间隔是相同的)

2、UART是按照bite位,一位一位发送的,发送的单位是字节,每个字节包含有效数据位,5、6、7或8位长。

3、串行异步通信中,由于没有时钟,通信双方需要约定好波特率,波特率4800、9600、115200等,单位是比特每秒,可以理解为发送一个bite的时钟周期为1/9600秒(9600为例),则频率为9600HZ。

4、UART 只需要控制两根线,一根发送线Tx,一根接收线Rx。因为收发是单独分开的两根线,可以同时独立的收发数据,所以是全双工的工作模式。

5、发送和接收都遵循以下原则:

        开始位 :将收发线路的电平拉低(初始是为1),作为开始位。

        数据位 :利用线性序列机,在指定的位置收发数据。

        停止位 :发送位是指发送端,发送完8位数据后(忽略校验位),将发送端的TX线电平拉高,可以时一个停止位,也可以是两个(本质是,判断发送下一个数据,开始位的必要条件是TX信号线从高到低的跳变)。

        校验位一般有奇校验和偶校验,可以添加在数据位的后面,需要发送和接收双方都约定好,按照发送的格式去发送和接收。

6、用16倍的波特率(9600bit/s波特率为例)去发送和接收数据,在接收端可以取中间的第七位数据,提高数据接收到的稳定。(即在9600分之1秒内连续发送同一个bit数据16次,取值在第7或第8次,保证数据的稳定性和正确性)

                                               16倍波特率接收发送时序图:

cubemx串口发送最大传输时间_异步通信

7、在代码描述中,使用16*9600hz的频率计数:

        接收端:Rx从高电平跳变为低电平0时开始计数,在cnt=7+16*1时取第一个值,依次cnt=7+16*2时取第二个值,........  直到取完所有数据。当计到所有数据都接收完,清零。

        cnt的值大小可以通过计算得到,假设8个有效数据位,加上一个开始位那么当cnt= 16(开始位)+8*16(数据位)数据接收完毕(更精确位置是cnt= 16+8*16-8时,数据就全部采集完毕,冗余一些不影响结果)。

        注意计数开始的条件是Rx=0时,计数结束的跳出条件是cnt计到最大值;数据的接收利用线性序列机,在指定的计数节拍上接收数据;建议用两个always语句块描述

        发送端:同理Tx为低电平0时开始计数,当cnt=0时将Tx拉低,cnt=16*1时发送第一个数,cnt=16*2时发送第一个数,直到停止位发完。