打印
[其它应用]

RT-Thread官方串口驱动支持的DDMA接收存在问题如何解决

[复制链接]
643|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
七毛钱|  楼主 | 2023-9-1 16:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
库的位置,rt-thread\bsp\stm32\libraries\HAL_Drivers\drv_usart.c

使用串口解析协议数据,肯定会使用DMA的空闲中断接收不定长数据,不需要在串行数据中解析协议头,

rtthread官方提供的串口驱动支持的DMA空闲中断的接收,

但是串口rx_fifo不管多大会存在溢出,由于官方库在数据溢出时,
向中间件层推送了数据,导致应用层接收的数据会被拆包,影响协议的解析。

解决方法:

将DMA溢出中断中向中间件层推送数据的操作屏蔽掉。

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架构发生了变化,屏蔽如下代码:

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);
}

使用特权

评论回复
沙发
caigang13| | 2023-9-2 21:36 | 只看该作者
看下RT技术社区有没有人能回答

使用特权

评论回复
板凳
juventus9554| | 2023-9-5 22:27 | 只看该作者
2019-6-10?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

342

主题

2359

帖子

4

粉丝