使用Pyserial发送串口数据设备接收为空、Teraterm发送正常的问题求助
Pyserial串口发送设备无响应问题修复方案
核心问题排查方向
- 发送内容类型不匹配
你需求是向设备传入十六进制值,但现有代码中downlink = 'ABCD\r\n'经过encode后发送的是ASCII字符对应的字节(0x41 0x42 0x43 0x44),和十六进制值0xAB 0xCD完全不同。如果设备要求接收十六进制字节,直接定义字节类型变量即可,不需要做字符串编码转换。 - 多余读操作清空请求标识
匹配到设备请求后执行的ser.read(ser.in_waiting)会清空串口缓冲区所有未读数据,部分设备的下行接收逻辑依赖请求后发送的特定触发标识,该操作会导致设备判定当前请求周期结束,后续发送的数据不会被识别为下行响应,直接删除该行即可。 - 行尾符配置不匹配
Teraterm中按下回车发送的行尾符可能和代码中写死的\r\n不一致,可先查看Teraterm串口设置中的换行符规则,将代码发送的行尾符和Teraterm配置对齐。 - 流控配置不一致
现有代码关闭了所有流控,需确认Teraterm的流控配置和代码完全一致,部分设备需要开启dsrdtr或rtscts才可正常接收数据,可尝试将对应参数改为True测试。
修复后参考代码
import serial import time com_port = "替换为实际串口号" with serial.Serial( port = com_port, baudrate = 115200, bytesize = serial.EIGHTBITS, parity = serial.PARITY_NONE, stopbits = serial.STOPBITS_ONE, timeout = 1, xonxoff = False, rtscts = False, dsrdtr = False ) as ser: while True: line = ser.readline().strip() # 加入编码容错,避免特殊字符导致程序崩溃 line = line.decode('utf-8', errors='ignore') if line: print(f"收到串口数据:{line}") # 按需修改为实际要发送的十六进制字节与行尾符 downlink = b'\xAB\xCD\r\n' if 'Waiting for Downlink Timeout' in line: # 缩短等待时间,避免设备请求超时 time.sleep(0.5) send_bytes = ser.write(downlink) # 打印实际发送的字节数和十六进制值,方便排查 print(f"发送成功,字节数:{send_bytes},内容:{downlink.hex()}") time.sleep(1)
内容的提问来源于stack exchange,提问作者Swatam Pattnaik
相关产品推荐
相关产品推荐

