qq_37446782 2026-01-26 13:05 采纳率: 0%
浏览 2

python代码收不到esp8266串口数据


import serial
# 打开 COM3,将波特率配置为115200, 读超时时间为1秒
ser = serial.Serial(port="COM3", baudrate=115200, timeout=1)
# 读取串口输入信息并输出。
while True:
    com_input = ser.read(10)
    if com_input:   # 如果读取结果非空,则输出
        print(com_input)
ser.close()

想用这个代码接收esp8266发来的数据,用串口助手和arduino ide都能收到数据,但是这个代码不行,但是用虚拟串口和串口助手调试,就能收到数据,太奇怪了?

  • 写回答

2条回答 默认 最新

  • 檀越@新空间 2026-01-26 13:06
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    你提到的代码无法接收到 ESP8266 的串口数据,但使用 串口助手Arduino IDE 可以正常接收,这说明 ESP8266 本身没有问题,而是你的 Python 代码可能在某些细节上存在问题。下面我将详细分析可能的原因,并提供解决方案。


    🔍 问题原因分析

    1. 串口配置错误(波特率、数据位、停止位、校验位)

      • 虽然你设置了 baudrate=115200,但 ESP8266 的默认波特率可能不是这个值。
      • 检查 ESP8266 的 AT 命令设置是否为 115200,或者是否被修改过。
    2. 串口未正确打开或关闭

      • 如果串口没有正确打开或在读取过程中被意外关闭,可能导致无数据。
    3. 读取方式不正确

      • 使用 ser.read(10) 会读取固定长度的数据,如果数据量小于 10 字节,可能会返回空。
      • 更推荐使用 ser.readline()ser.in_waiting 来检测是否有数据。
    4. 超时设置问题

      • timeout=1 表示等待最多 1 秒后读取,但如果数据发送较慢,可能无法及时读取。
    5. 串口驱动问题

      • 在某些系统中(如 Windows),需要安装正确的串口驱动才能与 ESP8266 正常通信。

    ✅ 解决方案

    第一步:确认 ESP8266 的串口配置

    • 运行以下命令检查 ESP8266 的波特率:

      import serial
      ser = serial.Serial("COM3", 115200, timeout=1)
      print(ser.baudrate)  # 应该输出 115200
      
    • 如果你不确定 ESP8266 的波特率,可以尝试以下常见值:

      • 9600
      • 115200
      • 230400
      • 460800

    第二步:修改 Python 代码以提高兼容性

    以下是优化后的代码:

    import serial
    import time
    
    # 配置串口参数
    ser = serial.Serial(
        port="COM3",
        baudrate=115200,
        bytesize=serial.EIGHTBITS,  # 数据位
        parity=serial.PARITY_NONE,  # 校验位
        stopbits=serial.STOPBITS_ONE,  # 停止位
        timeout=1  # 读取超时时间
    )
    
    print("串口已打开,准备接收数据...")
    
    try:
        while True:
            if ser.in_waiting > 0:  # 检查是否有数据可读
                com_input = ser.readline()  # 读取一行数据
                print(f"接收到数据: {com_input.decode('utf-8').strip()}")  # 打印解码后的字符串
            time.sleep(0.1)  # 防止 CPU 占用过高
    except KeyboardInterrupt:
        print("程序终止")
    finally:
        ser.close()
        print("串口已关闭")
    

    第三步:验证 ESP8266 是否发送了数据

    • 使用 Arduino IDE 的串口监视器 发送一些测试数据(例如 Hello)。
    • 确认 ESP8266 是否确实发送了这些数据。

    第四步:检查 COM 端口是否正确

    • 在设备管理器中查看 ESP8266 对应的 COM 端口号是否是 COM3
    • 有些情况下,USB 转串口芯片可能会动态分配端口号,建议在每次运行前重新确认。

    第五步:使用虚拟串口进行调试

    • 如果你已经通过虚拟串口和串口助手能收到数据,那说明你的 Python 代码逻辑没有问题。
    • 尝试使用虚拟串口模拟 ESP8266 的行为,看是否能成功接收数据。

    🧪 测试步骤总结

    1. 确认 ESP8266 的串口参数是否为 115200
    2. 使用 ser.in_waiting 判断是否有数据
    3. 使用 ser.readline() 替代 ser.read(10)
    4. 确保 COM 端口正确且驱动正常
    5. 使用 Arduino IDE 或串口助手验证 ESP8266 是否发送了数据

    ✅ 最终建议

    如果你仍然无法接收数据,可能是硬件连接问题,比如:

    • ESP8266 与 USB 转串口模块的 TX/RX 接线是否正确。
    • 电源是否稳定。
    • 是否有电平转换(ESP8266 电压为 3.3V,需注意与 5V 串口模块兼容性)。

    📌 总结

    | 问题 | 解决方法 | |------|----------| | 波特率不一致 | 确认 ESP8266 的波特率并调整代码 | | 读取方式错误 | 使用 ser.readline() 代替 ser.read(10) | | COM 端口错误 | 检查设备管理器中的 COM 端口号 | | 串口未正确打开 | 确保 ser.open() 被调用或使用上下文管理器 | | 驱动问题 | 安装正确的 USB 转串口驱动 |


    如有更多关于 ESP8266 的 AT 命令或数据格式的问题,欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 1月26日