You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux终端读取STM32串口数据失败,仅发送正常问题求助

STM32 RS232-USB单向通信问题排查方案

第一优先级:硬件链路排查

  • 确认反向接线正确性:电脑到STM32发送链路正常仅说明USB端TX → MAX3232 → STM32 UART2 RX(PA3)通路正常,需逐一核对反向链路接线:STM32 UART2 TX(PA2) → MAX3232模块对应RX引脚 → MAX3232转换后TX引脚 → RS232-USB模块RX引脚,避免TX/RX接反
  • 单步验证硬件通路:写测试固件让STM32 PA2定时输出高低电平,用万用表测量引脚电平跳变,确认STM32侧发送引脚功能正常;可替换MAX3232模块/RS232线缆,排除单通道硬件损坏问题

第二优先级:固件逻辑排查

你当前提供的回环测试代码存在两处明显问题:

  1. 无主动发送逻辑:代码仅在STM32收到串口数据时才会触发回发,若你测试时没有先从电脑端发数据,STM32不会主动输出任何内容,自然无法在电脑端读到数据
  2. 发送等待逻辑写反:TXE标志位为1时代表发送寄存器为空可以写入数据,你当前的逻辑是TXE为0时才执行发送,实际上不会触发数据发送操作

修正后的回环测试代码参考:

while(1)
{
    // 收到数据时触发回发
    if (USART_GetFlagStatus(USART2, USART_FLAG_RXNE) != RESET)
    {
        uint16_t Data = USART_ReceiveData(USART2);
        // 等待发送寄存器为空再写入
        while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
        USART_SendData(USART2, Data);
        // 可选:等待发送完成再进入下一轮,避免丢包
        while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
    }
}

建议先写最简测试固件验证发送功能,不需要依赖接收触发,直接每隔1秒发送固定字符,比如:

// 初始化后直接循环发送
while(1)
{
    while (USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
    USART_SendData(USART2, 'A');
    HAL_Delay(1000); // 可替换为你使用的固件库对应延时函数
}

同时确认UART2的GPIO配置:PA2需设置为复用推挽输出模式,波特率、数据位、停止位、校验位配置和主机侧完全一致。

第三优先级:Linux侧串口配置排查

你当前仅用stty配置了波特率,默认的串口配置会导致cat命令无法正常输出实时数据:

  1. 执行完整的串口配置命令,关闭规范模式和多余的转换逻辑:
stty -F /dev/ttyUSB0 9600 cs8 -cstopb -parenb -icanon -echo -icrnl -ixon -ixoff

参数说明:

  • cs8:8位数据位
  • -cstopb:1位停止位
  • -parenb:无校验
  • -icanon:关闭规范模式,不需要等待换行符就输出数据
  • -echo:关闭回显
  • -icrnl:不将回车转换为换行
  • -ixon/-ixoff:关闭软件流控
  1. 建议用专业串口工具测试,避免cat命令的适配问题:
# 安装picocom
sudo apt install picocom
# 启动串口监听
picocom -b 9600 /dev/ttyUSB0

若picocom可以正常收到数据,说明问题出在之前的stty配置不完善,若依然收不到数据回到前两步排查硬件和固件问题。

内容的提问来源于stack exchange,提问作者riedaug

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 22:24:03