MyCollege1999 2025-11-24 19:59 采纳率: 59.2%
浏览 2

gd32f103zet6芯片,come和单片机通信不上

通过串口/dev/ttyAMA1, come这边通过python脚本往串口写,单片机收到消息后会回应,现在come这边一直收不到消息。很奇怪。

    while True:
        try:
            send_msg(ser, 'check link')
            nw_mgr_logger.info('send message')
            time.sleep(0.01) #old is 0.1
            str100 = ser.readline()
            nw_mgr_logger.info('check link:%s' % str100)
            if str100 != '':
                break
        except serial.SerialException:
            nw_mgr_logger.error('Faild to read data from %s', SERIAL_PORT)
            time.sleep(1)
        except Exception as e:
            nw_mgr_logger.error(e)
            time.sleep(1)

现在单片机这边收到消息后给come发的信息,在python里面readline没有,很奇怪,可能啥原因呢?
下面是单片机发的消息(通过printf 接口,写的串口)
appeal initialization!
The link is normal.
The link is normal.
The link is normal.
The link is normal.

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2025-11-24 20:16
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    在使用 GD32F103ZET6 芯片与 COME 通过串口通信时,如果 Python 脚本无法接收到单片机的回应消息,这可能是由多个原因造成的。以下是一些可能的原因和对应的解决方案,请逐一排查:


    一、串口配置不一致

    问题描述

    Python 脚本和 GD32 单片机之间的 波特率、数据位、停止位、校验位等参数不一致,导致通信失败。

    解决方法

    • 确保 Python 中的 serial.Serial() 配置与单片机端的串口配置完全一致。
    • 常见配置如下(以 115200 波特率为例):
    ser = serial.Serial(
        port='/dev/ttyAMA1',
        baudrate=115200,
        bytesize=8,
        parity='N',
        stopbits=1,
        timeout=1
    )
    

    注意: 如果单片机使用的是 printf 接口,请确保其也使用相同的波特率和格式。


    二、单片机没有正确发送数据

    问题描述

    单片机虽然打印了信息,但可能因为缓冲区未刷新或未正确发送。

    解决方法

    • 在单片机的 printf 后添加 fflush(stdout) 或类似函数,确保数据立即发送。
    • 示例(C语言):
    printf("The link is normal.\n");
    fflush(stdout); // 确保缓冲区内容立即发送
    

    注意: 某些嵌入式平台的 printf 可能默认不自动刷新缓冲区,需要手动刷新。


    三、Python 的 readline() 方法不适用

    问题描述

    readline() 是按行读取,而单片机可能没有发送换行符 \n,导致 readline() 一直阻塞。

    解决方法

    • 使用 read() 方法代替 readline(),并设置适当的超时时间。
    • 修改代码如下:
    while True:
        try:
            send_msg(ser, 'check link')
            nw_mgr_logger.info('send message')
            time.sleep(0.01)  # 等待接收
    
            # 读取所有可用数据
            response = ser.read(ser.in_waiting or 100)  # 读取最多100字节
            nw_mgr_logger.info('Received: %s' % response)
    
            if response:
                break
        except serial.SerialException as e:
            nw_mgr_logger.error(f'Failed to read data from {SERIAL_PORT}: {e}')
            time.sleep(1)
        except Exception as e:
            nw_mgr_logger.error(e)
            time.sleep(1)
    

    说明: ser.in_waiting 获取当前缓冲区中等待读取的数据量,避免无数据时阻塞。


    四、串口连接不稳定或物理层问题

    问题描述

    串口线接触不良、电平不匹配(如 RS232 和 TTL 不兼容)、USB 转串口芯片故障等。

    解决方法

    • 检查硬件连接,确认 TXD、RXD、GND 正确连接。
    • 使用示波器或逻辑分析仪检查信号是否正常。
    • 尝试更换 USB 转串口模块或串口线。

    五、Python 未正确关闭串口或未释放资源

    问题描述

    脚本运行多次后,串口未正确释放,导致后续通信失败。

    解决方法

    • 确保每次通信结束后关闭串口,并在异常处理中释放资源。
    try:
        ser = serial.Serial(...)
        # 通信代码...
    except Exception as e:
        print(e)
    finally:
        if 'ser' in locals() and ser.is_open:
            ser.close()
    

    六、单片机未正确响应或存在逻辑错误

    问题描述

    单片机虽然发送了数据,但可能因为逻辑错误未正确处理或未发送预期内容。

    解决方法

    • 使用调试工具(如 ST-Link、J-Link)查看单片机执行流程。
    • 添加日志输出,确认 printf 是否被调用。
    • 检查串口中断服务程序是否正确处理接收数据。

    七、Python 脚本中 time.sleep(0.01) 太短

    问题描述

    发送后只等待 0.01 秒,可能不足以让单片机完成响应。

    解决方法

    • 增加等待时间,比如改为 time.sleep(0.1) 或更高。
    time.sleep(0.1)  # 增加等待时间
    

    ✅ 总结:关键检查点

    1. 串口配置一致(波特率、数据位、停止位、校验位)
    2. 单片机发送数据后刷新缓冲区
    3. Python 使用 read() 而非 readline()
    4. 检查物理连接和电平匹配
    5. 确保串口正确关闭
    6. 增加等待时间
    7. 调试单片机逻辑和 printf 输出

    如果你愿意提供单片机的串口初始化代码或 Python 脚本的完整版本,我可以进一步帮你定位问题。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月24日