Toggle navigation
首页
问答
文章
积分商城
专家
专区
更多专区...
文档中心
返回主站
搜索
提问
会员
中心
登录
注册
UART
rtthread最新drv_usart.c库DMA接收存在问题,问题已解决
发布于 2019-04-30 17:02:07 浏览:8453
订阅该版
[tocm] 库的位置,`rt-thread\bsp\stm32\libraries\HAL_Drivers\drv_usart.c` 使用串口解析协议数据,肯定会使用DMA的空闲中断接收不定长数据,不需要在串行数据中解析协议头, rtthread官方提供的串口驱动支持的DMA空闲中断的接收, **但是串口rx_fifo不管多大会存在溢出,由于官方库在数据溢出时,向中间件层推送了数据,导致应用层接收的数据会被拆包,影响协议的解析**。 ## 解决方法: 将DMA溢出中断中向中间件层推送数据的操作屏蔽掉。 ```c void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { // struct rt_serial_device *serial; // struct stm32_uart *uart; // rt_size_t recv_len; // rt_base_t level; // RT_ASSERT(huart != NULL); // uart = (struct stm32_uart *)huart; // serial = &uart->serial; // level = rt_hw_interrupt_disable(); // recv_len = serial->config.bufsz - uart->dma.last_index; // uart->dma.last_index = 0; // rt_hw_interrupt_enable(level); // if (recv_len) // { // rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8)); // } } ``` 2019-6-10增加最新库的解决方案,最新库drv_usart.c架构发生了变化,屏蔽如下代码: ```c void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { struct stm32_uart *uart; RT_ASSERT(huart != NULL); uart = (struct stm32_uart *)huart; //dma_isr(&uart->serial); } void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart) { struct stm32_uart *uart; RT_ASSERT(huart != NULL); uart = (struct stm32_uart *)huart; //dma_isr(&uart->serial); } ```
查看更多
43
个回答
默认排序
按发布时间排序
sober
2019-05-02
这家伙很懒,什么也没写!
>“但是串口rx_fifo不管多大会存在溢出” 这句是什么意思。 没有看懂你的问题,另外串口作为字符设备,只能 ... 空闲中断解决和摒弃了协议中的起始位和结束位,如果当做串行数据处理没有问题,但是处理器要对每个数据都要进行判断,寻找起始位和结束位,降低处理器利用率。DMA使用循环接收机制,接收缓冲区随着时间会溢出,在溢出时,缓冲区中的数据并非完整一帧数据,溢出中断将消息发给上层,应用层处理时,不是个完整的数据。 例如rx_fifio为64,映射给DMA接收缓冲区,一帧协议数据为50,当第二帧数据接收到14个字节后会触发DMA溢出中断,官方库溢出中断向上层发送了消息,应用层进行数据处理时只有14个字节并非一帧数据,如果为此应用层通过协议设计进行组包,处理器利用率比较低。
sober
2019-05-03
这家伙很懒,什么也没写!
>“空闲中断解决和摒弃了协议中的起始位和结束位,如果当做串行数据处理没有问题,但是处理器要对每个数据 ... 1、除过发送缓冲区容量的限制必须拆包,一般都是以数据帧为单位进行数据发送 2、空闲中断监测数据帧的结束 3、fifo再大总有一包需要拆包处理,只是时间问题 这个方案已经在项目中应用,通信稳定。 是否调试过官方的驱动库,在项目中应用过?
sober
2019-05-17
这家伙很懒,什么也没写!
>空闲中断是硬件寄存器做的,软件层的做不到 如果硬件层通过空闲中断解决分包问题,一般标准协议使用modbus rtu
zhangjun
2019-06-06
这家伙很懒,什么也没写!
>我也发现发送的字节数超过RT_SERIAL_RB_BUFSZ设置的就一定会拆包哦。@armink 需要怎么修改才可以不定长的数 ... 1,RT_SERIAL_RB_BUFSZ是默认的串口接收缓冲区配置,如果打开后调用了rt_device_control去配置设备,将会使用配置参数里面新的缓冲区大小。 2,要不定长接收且不拆包,那么需要使用串口空闲中断。这就要配置串口接收缓冲区大小大于最大数据包长度
ddk2006
2019-06-06
这家伙很懒,什么也没写!
我刚才已经做个试验,RT_SERIAL_RB_BUFSZ设置成128个字节,我每次发送56个字节,结果发现第一接收了56个字节,第二次接收了56个字节,第三次就拆包了,变成16+40个字节,后面基本上每次都会拆包。注释掉HAL_UART_RxCpltCallback这里面的代码,就不会拆包了。
zhangjun
2019-06-10
这家伙很懒,什么也没写!
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=49370&ptid=11097][color=#999999]sober 发表于 2019-6-10 08:20[/color][/url][/size] 是的,架构上的问题,无论有多大的缓冲,都会遇到拆包的情况,只是时间的问题 ...[/quote] 是的,目前看貌似只能屏蔽dma中断,全靠串口空闲中断。
zhangjun
2019-06-28
这家伙很懒,什么也没写!
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=50653&ptid=11097][color=#999999]sport398 发表于 2019-6-27 10:12[/color][/url][/size] 我屏蔽了DMA溢出中断,确实不会出现分包,但是我不太清楚DMA在一次接收数据之后,下一次接收的时候是怎么 ...[/quote] 因为DMA工作在循环模式
rt999
2019-07-03
Rt-Thread 6翻啦
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=49322&ptid=11097][color=#999999]ddk2006 发表于 2019-6-6 21:57[/color][/url][/size] 我刚才已经做个试验,RT_SERIAL_RB_BUFSZ设置成128个字节,我每次发送56个字节,结果发现第一接收了56个字 ...[/quote] 我也是,我都设成500了,每次还都是分包,都快哭了
面码1314
2020-03-19
这家伙很懒,什么也没写!
其实我觉得屏蔽DMA溢出中断这个方法在一些情况下并不可靠,我测试过在1s 20帧数据接收,一帧平均60个字符,波特率38400,偶尔会出现两帧数据甚至是多帧数据粘黏包的情况。但是如果采用中断去接收的话,感觉CPU大部分时间都去接收字符去了,确实不知道该怎么办了
梦想飞翔
2020-10-04
这家伙很懒,什么也没写!
你这个方法行不通,屏蔽了串口dma数据处理的回调函数,测试还是会拆包,感觉这种方法不靠谱。
撰写答案
登录
注册新账号
关注者
3
被浏览
8.5k
关于作者
sober
这家伙很懒,什么也没写!
提问
18
回答
59
被采纳
0
关注TA
发私信
相关问题
1
rt thread 2.0.2 usart 接收缓存问题
2
关于STM32串口通信的问题
3
STM32F1+RTT串口接收终端数据丢失问题
4
UART TX丢数据?
5
RTT打开串口的时候如何自定义波特率呢?
6
STM32F4的USART数据接收问题
7
串口1234使用问题
8
串口接收回调函数
9
LPC18xx UART问题讨论
10
x1000串口配置的失败问题
推荐文章
1
RT-Thread应用项目汇总
2
玩转RT-Thread系列教程
3
机器人操作系统 (ROS2) 和 RT-Thread 通信
4
五分钟玩转RT-Thread新社区
5
国产MCU移植系列教程汇总,欢迎查看!
6
【技术三千问】之《玩转ART-Pi》,看这篇就够了!干货汇总
7
关于STM32H7开发板上使用SDIO接口驱动SD卡挂载文件系统的问题总结
8
STM32的“GPU”——DMA2D实例详解
9
RT-Thread隐藏的宝藏之completion
10
【ART-PI】RT-Thread 开启RTC 与 Alarm组件
最新文章
1
RyanMqtt 移植指南(三)
2
RyanMqtt QOS质量测试(二)
3
WCH APT 零等待FLASH的思考
4
RyanMqtt使用介绍和示例代码(一)
5
RTT平台 zephyr_polling软件包 Bluenrg2 蓝牙芯片启动流程
热门标签
RT-Thread Studio
串口
Env
LWIP
AT
SPI
Bootloader
FinSH
ART-Pi
CAN总线
Hardfault
USB
文件系统
DMA
RT-Thread
SCons
线程
RT-Thread Nano
MQTT
stm32
ESP8266
rt-smart
WIZnet_W5500
RTC
flash
ota
UART
FAL
packages_软件包
I2C
freemodbus
cubemx
潘多拉开发板_Pandora
定时器
PWM
BSP
ADC
socket
AB32VG1
SDIO
keil_MDK
中断
消息队列_msg_queue
编译报错
Debug
C++_cpp
msh
QEMU
SFUD
MicroPython
本月问答贡献
出出啊
1463
个答案
324
次被采纳
小小李sunny
1379
个答案
274
次被采纳
张世争
700
个答案
155
次被采纳
crystal266
518
个答案
152
次被采纳
whj467467222
1215
个答案
146
次被采纳
本月文章贡献
出出啊
1
篇文章
11
次点赞
小小李sunny
1
篇文章
1
次点赞
张世争
4
篇文章
6
次点赞
crystal266
2
篇文章
5
次点赞
whj467467222
2
篇文章
4
次点赞
回到
顶部
发布
问题
分享
好友
手机
浏览
扫码手机浏览
投诉
建议
回到
底部