无法通过QModBus或pySerial正常连接SHT20 RS485传感器求助
RS485接口SHT20传感器无响应问题排查
问题概况
- 尝试通过Python脚本、多款串口工具连接RS485接口的SHT20传感器,传感器对所有命令无正常响应,仅返回乱码,红灯持续闪烁
- 线缆通断正常,已按手册要求提供5V DC供电
- 更换两个同型号传感器,问题完全一致
- 使用QModBus测试时,从机返回异常十六进制数据:
01 81 01 81 90
所用Python脚本
import serial import time ser = serial.Serial( port='COM5', baudrate=9600, parity=serial.PARITY_EVEN, stopbits=serial.STOPBITS_ONE, bytesize=serial.EIGHTBITS, timeout=3) def readtempandhum(): print ("reading temperature-humidity") x= b'\x01\x04\x00\x01\x00\x02\x20\x0B' for i in x: envio=chr(i) ser.write(envio.encode()) ser.isOpen() readtempandhum() while True: line=ser.readline() if len(line)>0: print(line) try: temp=float((line[3]*256+line[4])/100) #温度数据转换 hum=float((line[5]*256+line[6])/100) #湿度数据转换 print (str(temp)+' '+str(hum)) except Exception as e: print("read error "+str(e)) ser.flush() readtempandhum() time.sleep(2) #每2秒重复一次
可能的原因及排查步骤
- RS485接线反接:RS485的A(+)、B(-)引脚必须一一对应连接,接反会直接导致通信失败。立刻检查传感器与转换器的接线,确认A对A、B对B。
- ModBus参数不匹配:
- 校验位错误:当前脚本用的是偶校验,但部分RS485 SHT20传感器默认用无校验,尝试把
parity=serial.PARITY_EVEN改成serial.PARITY_NONE测试。 - 从机地址错误:脚本中指令的从机地址是0x01,若传感器默认地址不是01,指令会被忽略。查手册确认默认地址,或尝试常见的0x02、0x03地址。
- 校验位错误:当前脚本用的是偶校验,但部分RS485 SHT20传感器默认用无校验,尝试把
- RS485转换器故障:
- 廉价转换器兼容性差,或未正确工作。换一个靠谱的RS485-USB转换器测试,优先选带指示灯的型号,观察发送/接收灯是否正常闪烁。
- 部分无源转换器供电不足,若传感器距离远,需用有源RS485转换器。
- 指令CRC校验错误:
- 你发送的指令中CRC位是
0x20 0x0B,用在线ModBus CRC计算器重新计算01 04 00 01 00 02的CRC16值,若不一致,传感器会返回错误响应(比如你看到的01 81...,81代表功能码错误)。
- 你发送的指令中CRC位是
- 供电电流不足:
- 5V供电电压够,但电流不够也会导致传感器异常。换一个输出电流≥100mA的5V电源测试,避免用电脑USB口直接供电(部分USB口带负载能力弱)。
- 总线干扰与匹配问题:
- 通信距离超过10米的话,在RS485总线两端加120Ω终端电阻,减少信号反射。
- 必须用屏蔽双绞线作为RS485线缆,普通导线易受干扰导致乱码。
内容的提问来源于stack exchange,提问作者Alf
相关产品推荐
相关产品推荐

