

根据提供的代码和问题描述,UART 数据传输不正确可能由以下原因引起:
size(接收到的数据长度)发送到消息队列,但 未传递实际数据。rt_device_read() 调用,导致数据滞留在硬件缓冲区中未被读取(后续数据会覆盖旧数据)。// 定义数据接收缓冲区(根据实际数据长度调整)
#define RC_RX_BUF_SIZE 128
static rt_uint8_t rc_rx_buf[RC_RX_BUF_SIZE];
// 回调函数(发送实际数据 + 长度)
static rt_err_t rc_rx_cbk(rt_device_t dev, rt_size_t size) {
if (size > RC_RX_BUF_SIZE) size = RC_RX_BUF_SIZE;
// 立即读取数据到缓冲区
rt_size_t read_size = rt_device_read(dev, 0, rc_rx_buf, size);
// 发送数据和实际读取长度到消息队列
struct {
rt_uint8_t data[RC_RX_BUF_SIZE];
rt_size_t size;
} msg;
memcpy(msg.data, rc_rx_buf, read_size);
msg.size = read_size;
rt_mq_send(&rc_rx_mq, &msg, sizeof(msg));
return RT_EOK;
}
// 接收线程(完整处理数据)
void rc_rx_thread_entry(void *parameter) {
rt_device_t rc_serial = rt_device_find("uart4");
RT_ASSERT(rc_serial);
// 开启中断接收模式
rt_device_open(rc_serial, RT_DEVICE_FLAG_INT_RX);
rt_device_set_rx_indicate(rc_serial, rc_rx_cbk);
while (1) {
struct {
rt_uint8_t data[RC_RX_BUF_SIZE];
rt_size_t size;
} msg;
// 等待消息队列
if (rt_mq_recv(&rc_rx_mq, &msg, sizeof(msg), RT_WAITING_FOREVER) > 0) {
// 处理数据(示例:打印内容)
for (int i = 0; i < msg.size; i++) {
rt_kprintf("%02X ", msg.data[i]);
}
rt_kprintf("n");
}
}
}struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
config.baud_rate = BAUD_RATE; // 如 115200
config.data_bits = DATA_BITS_8; // 常用 8 位数据
config.stop_bits = STOP_BITS_1; // 常用 1 位停止位
config.parity = PARITY_NONE; // 无校验
rt_device_control(rc_serial, RT_DEVICE_CTRL_CONFIG, &config);__HAL_RCC_GPIOC_CLK_ENABLE();
GPIO_InitTypeDef GPIO_Init = {0};
GPIO_Init.Pin = GPIO_PIN_10 | GPIO_PIN_11;
GPIO_Init.Mode = GPIO_MODE_AF_PP;
GPIO_Init.Pull = GPIO_PULLUP;
GPIO_Init.Speed = GPIO_SPEED_FREQ_HIGH;
GPIO_Init.Alternate = GPIO_AF8_UART4; // 根据实际复用值调整
HAL_GPIO_Init(GPIOC, &GPIO_Init);// 开启 DMA 模式
rt_device_open(rc_serial, RT_DEVICE_FLAG_DMA_RX);
// 设置 DMA 缓冲区
rt_device_control(rc_serial, RT_DEVICE_CTRL_CONFIG, (void*)RT_DEVICE_FLAG_DMA_RX);// 在回调函数中添加日志
rt_kprintf("[UART] Received %d bytesn", size);__HAL_RCC_UART4_CLK_ENABLE();| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 数据完全乱码 | 波特率不匹配 | 校准发送端/接收端波特率 |
| 数据部分丢失 | 缓冲区溢出或未及时读取 | 增大缓冲区或用 DMA 模式 |
| 仅收到第一个字节 | 未清除中断标志 | 检查 UART 中断服务程序 |
| 周期性数据错误 | 时钟源不稳定 | 切换时钟源(如 HSI→HSE) |
提示:若问题依旧,请提供以下信息:
- UART 初始化完整代码
- 电路原理图(UART 部分)
- 逻辑分析仪抓取的波形图
举报
更多回帖