完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
库的位置,rt-thread\bsp\stm32\libraries\HAL_Drivers\drv_usart.c 使用串口解析协议数据,肯定会使用DMA的空闲中断接收不定长数据,不需要在串行数据中解析协议头, rtthread官方提供的串口驱动支持的DMA空闲中断的接收, 但是串口rx_fifo不管多大会存在溢出,由于官方库在数据溢出时, 解决方法: 将DMA溢出中断中向中间件层推送数据的操作屏蔽掉。 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) |
|
相关推荐
7个回答
|
|
空闲中断解决和摒弃了协议中的起始位和结束位,如果当做串行数据处理没有问题,但是处理器要对每个数据都要进行判断,寻找起始位和结束位,降低处理器利用率。DMA使用循环接收机制,接收缓冲区随着时间会溢出,在溢出时,缓冲区中的数据并非完整一帧数据,溢出中断将消息发给上层,应用层处理时,不是个完整的数据。
例如rx_fifio为64,映射给DMA接收缓冲区,一帧协议数据为50,当第二帧数据接收到14个字节后会触发DMA溢出中断,官方库溢出中断向上层发送了消息,应用层进行数据处理时只有14个字节并非一帧数据,如果为此应用层通过协议设计进行组包,处理器利用率比较低。 |
|
|
|
1、除过发送缓冲区容量的限制必须拆包,一般都是以数据帧为单位进行数据发送
2、空闲中断监测数据帧的结束 3、fifo再大总有一包需要拆包处理,只是时间问题 这个方案已经在项目中应用,通信稳定。 是否调试过官方的驱动库,在项目中应用过? |
|
|
|
如果硬件层通过空闲中断解决分包问题,一般标准协议使用modbus rtu
|
|
|
|
1,RT_SERIAL_RB_BUFSZ是默认的串口接收缓冲区配置,如果打开后调用了rt_device_control去配置设备,将会使用配置参数里面新的缓冲区大小。
2,要不定长接收且不拆包,那么需要使用串口空闲中断。这就要配置串口接收缓冲区大小大于最大数据包长度 |
|
|
|
我刚才已经做个试验,RT_SERIAL_RB_BUFSZ设置成128个字节,我每次发送56个字节,结果发现第一接收了56个字节,第二次接收了56个字节,第三次就拆包了,变成16+40个字节,后面基本上每次都会拆包。注释掉HAL_UART_RxCpltCallback这里面的代码,就不会拆包了。
|
|
|
|
其实我觉得屏蔽DMA溢出中断这个方法在一些情况下并不可靠,我测试过在1s 20帧数据接收,一帧平均60个字符,波特率38400,偶尔会出现两帧数据甚至是多帧数据粘黏包的情况。但是如果采用中断去接收的话,感觉CPU大部分时间都去接收字符去了,确实不知道该怎么办了
|
|
|
|
你这个方法行不通,屏蔽了串口dma数据处理的回调函数,测试还是会拆包,感觉这种方法不靠谱。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
786 浏览 0 评论
4210 浏览 0 评论
如何使用python调起UDE STK5.2进行下载自动化下载呢?
2520 浏览 0 评论
开启全新AI时代 智能嵌入式系统快速发展——“第六届国产嵌入式操作系统技术与产业发展论坛”圆满结束
2926 浏览 0 评论
获奖公布!2024 RT-Thread全球巡回线下培训火热来袭!报名提问有奖!
31442 浏览 11 评论
72901 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 05:26 , Processed in 1.039137 second(s), Total 84, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号