-
uart通信
串口通信是一种应用十分广泛的通讯接口,两个设备之间的通信连接方式如下: 串口通信参数: 波特率:串口通信的速率
起始位:标志一个数据帧的开始,固定为低电平
数据位:数据帧的有效载荷,低位先行;数据位有8位和9位两种格式
校验位:用于数据验证,可配置 奇/偶/无 校验位
停止位:固定为高电平;可配置位 0.5/1/1.5位停止位
串口时序图:
-
下面以stm32为例描述串口通信过程:
stm32 UART支持硬件流控制、DMA等功能。
stm32硬件流控制:当发送方发送过快,导致接收方接收不过来(接收方会丢弃新数据或发生数据覆盖),如果有硬件流控制(在硬件电路上会多出一条线),此时接收方没有准备好就置高电平,准备好了置低电平,发送方根据接收方反馈的信号从而决定是否发送数据。
如上图所示为stm32 USART通信框图。
整个收发数据过程中最主要的是发送数据寄存器、接收数据寄存器、发送移位寄存器、接收移位寄存器、控制寄存器CR和状态寄存器SR相互配合工作,其中TDR和RDR是一个寄存器DR。采用中断模式,在进行发送数据操作时,当SR中TXE被硬件置为1产生一个UART中断表示发送数据寄存器TDR为空,此时通过CPU或DMA方式将数据写入TDR中,随后发送移位寄存器会将数据一位一位(低位先行)通过TX口发送出去,当一帧数据发送完成后SR中TC位为1表示发送完成。
在进行数据接收时,接收移位寄存器通过RX口一位一位(向右移位)接收数据,并当接收移位寄存器中的数据被转移动RDR中时,SR中RXNE位被硬件置1产生一个UART中断表示RDR非空,此时通过CPU或DMA数据读走。 -
带数据缓存的UART收发
1.数据对列收发
这种方式较为常用,需配合UART中断使用。
当发送数据时并不直接将数据写入TDR中,而是写进一个ringbuffer中。然后当SR中TXE被硬件置1产生一个UART中断时读取ringbuffer并将读到的字节写入TDR,然后在下一次中断时送入下一个字节,如此往复,直到ringbuffer为空。
在接收数据时,当SR中RXNE位被硬件置1产生一个UART中断,将接收到的数据写入ringbuffer,读数据时可直接从ringbuffer中读取数据。
在具体实施时,可分别创建一个发送和接收的task,用于处理上述数据逻辑。这种设计的优点是可以有效地处理实时数据,避免了数据的丢失。但是,如果Queue的大小设置不当,可能会导致数据的溢出。因此,我们需要根据实际的应用场景来合理地设置Queue的大小。2.带硬件FIFO的UART收发
很多先进的单片机的UART收发用上了硬件FIFO。没有硬件FIFO的单片机在收发数据时每收发一个字节就要执行一次中断函数,在高波特率通信时单片机会频繁进入中断,从而影响单片机主任务的处理。而硬件FIFO则可以缓解这种矛盾。例如单片机的UART FIFO是16字节,单片机在发送数据时一次最多可以传输16字节数据,等16字节数据发送完毕后才产生UART TX发送完毕中断。接收数据时通常是“半满”中断和“超时”中断,即接收FIFO中的字节数超过8字节,或者接收FIFO不为空但是超过1字节的时间内没有收到新的字节数据,产生一次UART RX接收中断。通常带硬件FIFO的UART会和数据队列的方式相结合使用,在高波特率通信下传输效率更高。3.带DMA的UART收发
当UART接收到数据时,数据可直接写入到DMA控制的内存区域中,然后触发中断。在中断服务程序中,我们可以从DMA控制的内存区域中取出数据,进行数据处理。
使用DMA对连续多条数据的传输帮助特别大。连续发送多条数据流时,可以把数据流放在多个不同的缓冲区,然后DMA直接指向缓冲区地址,待DMA传输完毕后产生一个中断,然后在中断处理中把DMA指向下一个缓冲区地址。接收数据时也可以预约一个接收缓冲区,DMA传输的数据传输到该缓冲区,传输满了后产生中断再指向下一个接收缓冲区,同时可以让主程序处理已收满数据的缓冲区的内容。
uart通信
最新推荐文章于 2024-08-14 11:27:55 发布