RT-Thread的串口空闲+DMA目前发现一个问题,对于没有任何格式的串口帧来说,有时候用空闲中断是最方便的处理方,。因为每次接收过来的就是完整的一帧,而不用判断帧格式。但是RT底层会向中间件层推送数据,导致应用层接收的数据会被拆包。
解决方法:见注释部分(位于drv_usart.c)针对RT版本:v4.0.2
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);
}
验证工程:将每次收到的字节数量打印到recv_count数组里观察。
#include <rtthread.h>
#include <rtdevice.h>
#include <board.h>
#include <ulog.h>
#define UART2_485_PIN GET_PIN(A, 1)
static struct rt_messagequeue rx_mq;
rt_thread_t led_thread;
static rt_device_t serial2;
struct serial_configure uart2_config = RT_SERIAL_CON

本文探讨了RT-Thread v4.0.2版本中串口使用DMA接收时遇到的问题,即数据在应用层被错误地拆包。通过修改HAL_UART_RxCpltCallback和HAL_UART_RxHalfCpltCallback函数,阻止了底层向中间件推送数据,从而避免了数据拆包问题。同时,提供了一个验证工程,用于检查接收数据的完整性。
最低0.47元/天 解锁文章
1416

被折叠的 条评论
为什么被折叠?



