库的位置,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);
} |