本文主要是介绍RT-Thread系统 STM32 DMA驱动接收数据包被自动拆包的解决办法,实现不定长数据包完整接收,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言
使用串口解析协议数据,肯定会使用DMA的空闲中断接收不定长数据,不需要在串行数据中解析协议头,rtthread官方提供的串口驱动支持的DMA空闲中断的接收,但是串口rx_fifo不管多大会存在溢出,由于官方库在数据溢出时,向中间件层推送了数据,导致应用层接收的数据会被拆包,影响协议的解析。
开启DMA功能
1.使用DMA功能首先需要在RT-Thread Settings中打开DMA驱动支持,并根据接收的数据包最大长度适当增加缓冲区大小,如果超出缓冲区的数据将会覆盖起始数据。
2.在board.h中打开对应串口和DMA串口接收功能的定义
#define BSP_USING_UART2
#define BSP_UART2_RX_USING_DMA
#define BSP_UART2_TX_PIN "PA2"
#define BSP_UART2_RX_PIN "PA3"
修改DMA驱动程序
在drivers/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);
}
这里参考了RT-Thread论坛中的解决办法
https://club.rt-thread.org/ask/question/11097.html?order=date
一点改进
修改后DMA接收确实不会拆包了,但有时候修改RT-Thread Settings的某些参数会重新生成drv_usart.c文件,导致修改的地方被还原。
于是我把屏蔽掉的两个函数的引用部分全部屏蔽,所有引用都在\libraries\STM32F1xx_HAL_Driver\Src\stm32f1xx_hal_uart.c
这个文件并不会被自动修改覆盖。
这篇关于RT-Thread系统 STM32 DMA驱动接收数据包被自动拆包的解决办法,实现不定长数据包完整接收的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!