如何在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
相关产品推荐
相关产品推荐

