使用RT-Thread的串口空闲+DMA收发数据

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

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值