对最先问题的回答。
仔细看了UART2的实现源码,慢慢理解了UART2_Mode_CALLBACK模式的工作过程,才明白版主给的答案。
问题:实现接收0x10 02开头,0x10 03结尾的数据包。
答案:
a. 准备好一个用户缓冲(rx_my_buf)。
b. 配置串口参数:readmode= UART2_Mode_CALLBACK
c. 执行UART2_read(handle, rx_my_buf, sizeof(rx_my_buf));
d. 在read的回调函数(如readCallback)中实现:处理刚刚接收的N个数据,并当bytesRead == readCount时,!!重新调用UART2_read()。
这样,就一直read下去,不断地、默默地读取着。读到的数据放在了UART2驱动自带的RingBuf,再放入用户缓冲rx_my_buf。
e. 用户处理数据时,就在readCallback()。就能判断读到的数据:是否有0x10 02的头,0x10, 03的尾。这样再发消息过去。
从UART2源码,知道一个方法:传输必用DMA。
疑惑的是RingBuf的环形缓冲,怎么应对DMA的自动自增模式,不怕越出Ringbuf的边界吗。
20220214补充:RingBuf中,做了和DMA的匹配,即将RingBuf当前位置至Ringbuf的边界之间的个数作为本次DMA的传输个数,这样,DMA对地址自增时,不会越界RingBuf的buf的边界。
Cherry Zhou:
感谢您的分享,关于您的问题会再反馈到工程师看下,有新的消息会尽快给到您。
,
Cherry Zhou:
感谢您的分享!
zhiyong chen 说:疑惑的是RingBuf的环形缓冲,怎么应对DMA的自动自增模式,不怕越出Ringbuf的边界吗。
UART2 驱动程序将环缓冲器从应用程序中隐藏,因此只要应用程序获得中断 /SEM_posts 并持续读取,缓冲器应该就不会填充和过载。