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

如何在Python中发送完整AT响应?解决树莓派返回内容被截断问题

解决Raspberry Pi串口响应被截断的问题

问题根源

老旧设备对串口参数匹配要求严格,你的代码仅设置了波特率,缺少数据位、停止位、奇偶校验、流控制等关键配置,导致设备无法正确接收完整响应;另外,发送数据后未等待缓冲区清空,也可能造成数据截断。

修改方案

1. 补全串口参数配置

初始化serial.Serial时,添加老旧设备通用的串口参数,确保和设备通信协议匹配:

  • bytesize=serial.EIGHTBITS:8位数据位(多数串口设备默认值)
  • parity=serial.PARITY_NONE:无奇偶校验
  • stopbits=serial.STOPBITS_ONE:1位停止位
  • xonxoff=False:关闭软件流控制
  • rtscts=False:关闭硬件流控制
  • dsrdtr=False:禁用DSR/DTR流控制

2. 确保数据发送完成

发送响应后调用ser.flush(),等待串口缓冲区数据全部发送出去,避免数据残留截断。

3. 优化文件操作(可选但推荐)

用with语句管理文件,自动处理关闭逻辑,避免资源泄漏。

修改后的完整代码

import serial

# 补全串口参数,匹配老旧设备通信要求
ser = serial.Serial(
    port='/dev/ttyUSB0',
    baudrate=19200,
    bytesize=serial.EIGHTBITS,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    xonxoff=False,
    rtscts=False,
    dsrdtr=False
)

# 使用with语句自动管理文件生命周期
with open("AT.dat", "a") as at_file, open("serial.dat", "a") as serial_file:
    while True:
        data = ser.readline()
        if not data:
            continue  # 跳过空数据
        data_str = data.decode("cp1252").strip()

        if "AT+CGMM" in data_str:
            response = "C35i\r\n"
            ser.write(response.encode("cp1252"))
            ser.flush()  # 确保响应完整发送
            print(response.strip())
            at_file.write(data_str + "\n")
        else:
            serial_file.write(data_str + "\n")

额外检查点

  • 确认USB转串口适配器支持19200波特率,驱动正常
  • 检查设备与Raspberry Pi的接线是否牢固,避免信号干扰
  • 若问题仍存在,可尝试降低波特率(如9600)测试,老旧设备对高波特率兼容性可能较差

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 01:57:47