常见的UART收发方式

描述

在很多单片机系统中,都会提供UART Read和UART Write这样的接口函数。一些高级的单片机甚至还有UART Read Callback和UART Write Callback这样的回调函数来收发数据。通常很多单片机的数据处理能力相对UART通信来说要快得多,因此像采用上述接口函数的单片机系统都使用了数据缓存来辅助UART收发。常见的UART收发方式有这几种:

1、数据队列(Queue)收发

这种方式适合大多数单片机,只要有中断就行。使用UART Write发送数据时,数据并不是直接写入到UART发送器,而是放进了一个环形缓冲区中。然后在UART TX发送完毕中断服务函数中读取环形缓冲区并把读到的字节送入UART发送器,然后等待TX发送完毕中断服务函数再次执行时送入下一个字节,直到把环形缓冲区的数据送完为止。环形缓冲区通常有一个标记头和尾的变量,只要头和尾的变量值不相等就说明缓冲区有数据。使用UART Read接收数据时,也不是直接从UART接收器中获取数据,而是从环形缓冲区中获取数据。UART RX收到中断服务函数中把UART接收器收到的字节送进环形缓冲区,单片机执行UART Read时获取到的数据是环形缓冲区的数据,这样可以保证单片机程序不用一直等待UART接收器。这种设计的优点是可以有效地处理实时数据,避免了数据的丢失。但是,如果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收发

DMA(Direct Memory Access)是一种可以将计算机的某个存储区域直接映射到内存地址空间的技术,从而实现对内存和其他外设的统一访问。当UART接收到数据时,数据会被直接写入到DMA控制的内存区域中,然后触发中断。在中断服务程序中,我们可以从DMA控制的内存区域中取出数据,进行必要的处理,然后再通过UART发送出去。

使用DMA进行UART传输对连续多条数据的传输帮助特别大,例如前面提到的UART Read Callback和UART Write Callback回调函数的方式。连续发送多条数据流时,可以把数据流放在单片机的多个不同的缓冲区,然后DMA直接指向缓冲区地址,待DMA传输完毕后产生UART Write Callback,然后在UART Write Callback中把DMA指向下一个缓冲区地址。接收数据时也可以预约一个接收缓冲区,DMA传输的数据传输到该缓冲区,传输满了后产生UART Read Callback再指向下一个接收缓冲区,同时可以让单片机主程序处理已收满数据的缓冲区的内容。

审核编辑:黄飞

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分