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

PySerial无法读取LoRa E5 Mini返回响应的问题排查

PySerial读取LoRa-E5 mini无响应修复方案

你的代码存在多个直接导致通信失败的问题,逐一修复即可正常读取数据:

  • 端口配置错误:你标注设备实际连接在COM5,但代码里硬编码的端口是COM4,端口不匹配根本无法和设备建立连接。
  • 未设置读超时:PySerial默认初始化时timeout=None,调用readline()会永久阻塞等待换行符,只要设备没有返回带\n结尾的数据,程序会直接卡死在读操作上,不会抛出任何异常。
  • 发送的测试指令不符合设备协议:LoRa-E5 mini出厂默认使用AT指令集交互,所有有效指令必须以\r\n(CR+LF)作为结尾,你发送的test既不是合法AT指令,也没有带协议要求的结束符,设备不会返回任何响应。
  • 异常捕获逻辑错误:你使用了裸except捕获所有类型的异常,还统一打印"Keyboard Interrupt",把端口连接失败、数据解码错误、格式转换错误全部和手动中断混为一谈,根本看不到实际报错原因,无法排查问题。
  • 数据解析逻辑过于激进:你读取到数据后直接截断字节强制转换为float,只要设备返回非数字内容(比如AT响应的+OK、LoRa接收报文前缀、报错信息),就会触发异常直接跳出循环,根本等不到有效数据。
  • 缺少设备启动等待时间:USB转串口芯片在打开串口的瞬间会触发LoRa模块复位,模块上电启动需要数百毫秒,打开串口立刻发指令会直接丢失。

修复后的测试代码

先运行这段代码验证基础通信是否正常:

import serial
import time

print("串口测试启动")
# 初始化串口,显式配置所有通信参数
ser = serial.Serial()
ser.baudrate = 9600  # LoRa-E5出厂默认波特率为9600,如果你改过就换成实际值
ser.port = 'COM5'    # 修正为设备实际连接的端口号
ser.timeout = 1      # 设置1秒读超时,避免读操作永久阻塞
ser.bytesize = serial.EIGHTBITS
ser.parity = serial.PARITY_NONE
ser.stopbits = serial.STOPBITS_ONE

ser.open()
print(f"串口打开状态: {ser.is_open}")
time.sleep(0.5)  # 等待模块复位完成,进入稳定工作状态

# 发送AT测试指令验证连通性,注意必须带\r\n结尾
ser.write(b"AT\r\n")
print("已发送AT测试指令,等待设备响应...")
time.sleep(0.2)

while True:
    try:
        ser_bytes = ser.readline()
        # 超时没读到数据会返回空字节,直接跳过进入下一轮循环
        if not ser_bytes:
            continue
        # 解码字符串,去掉首尾的换行、回车、空格,忽略无法解码的异常字节
        recv_str = ser_bytes.decode("utf-8", errors="ignore").strip()
        print(f"收到串口数据: {recv_str}")
        
        # 如果你后续需要解析数值类数据,先判断字符串格式再转float,不要直接强转
        # 示例逻辑:
        # if recv_str.replace('.', '', 1).lstrip('-').isdigit():
        #     sensor_val = float(recv_str)
        #     print(f"解析到数值: {sensor_val}")
    except KeyboardInterrupt:
        print("\n检测到用户手动中断,退出程序")
        break
    except Exception as e:
        print(f"运行出错: {str(e)}")
        break

ser.close()
print("串口已关闭")

后续验证注意事项
  • 运行代码前先打开Windows设备管理器,在「端口(COM和LPT)」分类下确认LoRa-E5对应的端口号确实是COM5,避免端口号被系统动态分配后记错。
  • 运行上述代码如果通信正常,会收到LoRa-E5返回的+OK字符串,证明串口链路完全正常。
  • 如果你的需求是读取LoRa射频端收到的远端节点数据,不需要主动发送测试指令,保持循环读取即可——LoRa-E5收到射频数据后会主动通过串口上报+RECV: <数据长度>,<原始数据>格式的报文,你再根据自己的传输协议解析对应字段就行。
  • 如果运行后还是没有响应,先确认你没有修改过LoRa-E5的串口波特率,如果之前改过,把代码里的baudrate参数改成你设置的实际值即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 14:57:18