1
完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
问题描述: 串口2 DMA方式接收不定长度的数据,每次接收完数据后会调用回调函数并传入字节数,现在的问题是前4次都很正常,但是到第5次就会出现断帧(自己这么叫)的情况,就是一条消息会进入两次回调函数; 在回调函数中加了log打印,截图如下: 不知道有没有大佬可以解惑的。 下面是贴出了几段与问题相关的代码: #define BSP_USING_UART2 #define BSP_UART2_TX_PIN "PA2" #define BSP_UART2_RX_PIN "PA3" #define BSP_UART2_RX_USING_DMA //线程初始化
//设置回调函数
{
} void u2_rx_entry(void *parameter)//线程入口函数 {
} |
|
相关推荐
7个回答
|
|
串口设备是数据流设备,数据包被拆包很正常,这个需要你自己在应用层自己进行整合和包边界检测。
这个跟 dma fifo 概念没有任何干系!!! 因为 dma fifo 根本不知道你的应用数据包有多长,协议规范是怎么定义的。而这些问题恰恰是应用层的责任! 首先,定义数据协议格式,要么定长,要么带包头包尾长度等。 然后,应用层根据前边的协议进行拼包,界定不同包数据,放到应用层缓冲区。 最后,整包(帧)数据进行数据处理。 无论定长还是变长,校验很重要 |
|
|
|
这个你要去看底层drv_uart.c哪里中断接收的时候,是如何调回调函数的。你这种情况很常见,通常有可能是FIFO满了,触发两次中断,一次是数据接收结束中断,一个是FIFO满,中断,可能FIFO满中断又调了一次回调。
|
|
|
|
刚验证了下你的思路:
我把发送的数据长度缩短,正常接收的次数会变多; 消息加长,正常接收的消息会变少; 所以你的思路是对的,那么有API可以让我在回调函数中清空DMA中的FIFO区域吗? |
|
|
|
|
|
|
|
|
|
|
|
RTthread 串口DMA接收,会开启DMA半传输中断,和传输完成中断。这个回调函数会在这两个中断触发和串口空闲中断触发时调用。举个栗子,假设DMA接收配置的64个字节,一次发送10个字节到这个串口,前三次会在串口空闲中断触发时,调用回调函数。第4次发送,前2个字节接收完成就会触发DMA半传输中断,调用一次回调函数,后8个字节接收完成,触发串口空闲中断,再调用一次回调函数
|
|
|
|
每次空闲中断读取放入队列,然后再用定时器作超时处理
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
590 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
2241 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1233 浏览 0 评论
1788 浏览 0 评论
1464 浏览 0 评论
74840 浏览 21 评论
小黑屋| 手机版| Archiver| 德赢Vwin官网 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 09:27 , Processed in 0.802826 second(s), Total 81, Slave 65 queries .
Powered by 德赢Vwin官网 网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
德赢Vwin官网 观察
版权所有 © 湖南华秋数字科技有限公司
德赢Vwin官网 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号