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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 09:57:03