完善资料让更多小伙伴认识你,还能领取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个字节接收完成,触发串口空闲中断,再调用一次回调函数
|
|
|
|
|
|
每次空闲中断读取放入队列,然后再用定时器作超时处理
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1033 浏览 0 评论
2877 浏览 0 评论
图腾柱PFC无法上升至400V,且电感电流为正弦波形,但是幅值极小
9386 浏览 0 评论
飞凌嵌入式ElfBoard-Vim编辑器之静态链接和动态链接
2898 浏览 0 评论
使用 LinkBoy 将程序导出为 C 语言代码并烧录至 Arduino ESP32 开发板
2302 浏览 1 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 00:25 , Processed in 1.011852 second(s), Total 85, Slave 68 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
6423