尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Python 实战:利用 pyserial 库解析 RS-485 温湿度传感器数据协议
1. RS-485温湿度传感器通信基础第一次接触RS-485传感器时我被它稳定的长距离通信能力惊艳到了。相比常见的I2C和SPI接口RS-485特别适合工业环境下的数据采集。最近在做一个温室监控项目时就遇到了需要通过Python读取RS-485温湿度传感器的需求。RS-485采用差分信号传输抗干扰能力极强最远通信距离可达1200米。典型的温湿度传感器比如我使用的AHT20-485型号会遵循Modbus RTU协议通过串口与主机通信。这里有个容易踩的坑虽然RS-485和RS-232都是串口通信但电气特性完全不同必须通过转换器才能连接电脑。实际接线时你需要准备USB转RS-485转换器我用的是UT-890双绞线建议带屏蔽层终端电阻120Ω长距离时必须加装2. 搭建Python开发环境在开始编码前我们需要准备好Python环境。推荐使用Python 3.7版本我实测过3.6会有字节处理兼容性问题。核心依赖库就一个pip install pyserial如果你遇到权限问题可以加上--user参数。我习惯用VS Code开发但PyCharm的串口调试工具也很方便。这里分享一个排查设备节点的小技巧import serial.tools.list_ports print([port.device for port in serial.tools.list_ports.comports()])在Windows上会输出像COM3这样的端口号而在Linux下通常是/dev/ttyUSB0。特别注意如果同时插着多个转换器设备节点可能会变建议写死前先动态检测。3. 传感器通信协议解析以常见的Modbus RTU协议为例一个完整的请求帧包含这些部分字段设备地址功能码起始地址数据长度CRC校验示例0x010x030x00000x00020xC40B对应的Python构造代码def build_request(device_addr0x01, reg_addr0x0000, length0x0002): request [ device_addr, # 设备地址 0x03, # 读取保持寄存器功能码 reg_addr 8, # 寄存器地址高字节 reg_addr 0xFF,# 寄存器地址低字节 length 8, # 数据长度高字节 length 0xFF, # 数据长度低字节 ] crc calculate_crc(bytes(request)) # CRC计算后面会讲 return bytes(request [crc 0xFF, crc 8])传感器返回的数据帧结构更复杂些。以我的项目为例返回的温湿度数据采用16位有符号整数温度值需要除以10得到实际值01 03 04 01 18 FF 9F 7A 63 └─┬─┬─┬─┬──┬──┬──┬─────┘ │ │ │ │ │ │ └─ CRC校验 │ │ │ │ └──┴── 湿度(0x0118)→28.0% │ │ │ └────── 温度(0xFF9F)→-9.7℃ │ │ └──────── 数据字节数(0x04) │ └────────── 功能码(0x03) └──────────── 设备地址(0x01)4. 完整的数据采集实现下面是我在实际项目中验证过的完整代码包含几个关键处理技巧import serial import struct class RS485Sensor: def __init__(self, port, baudrate9600, timeout1): self.ser serial.Serial( portport, baudratebaudrate, bytesizeserial.EIGHTBITS, parityserial.PARITY_NONE, stopbitsserial.STOPBITS_ONE, timeouttimeout ) def _calculate_crc(self, data): Modbus CRC16计算 crc 0xFFFF for byte in data: crc ^ byte for _ in range(8): if crc 0x0001: crc 1 crc ^ 0xA001 else: crc 1 return crc def read_registers(self, addr, length): 读取保持寄存器 request self._build_request(addr, length) self.ser.write(request) # 读取响应头地址功能码数据长度 header self.ser.read(3) if len(header) ! 3: raise IOError(响应超时) # 读取数据部分 data_len header[2] data self.ser.read(data_len 2) # 数据CRC # 校验CRC received_crc struct.unpack(H, data[-2:])[0] calculated_crc self._calculate_crc(header data[:-2]) if received_crc ! calculated_crc: raise ValueError(CRC校验失败) return data[:-2] def read_temperature_humidity(self): 读取温湿度值 data self.read_registers(0x0000, 0x0002) # 解析16位有符号整数 humidity struct.unpack(h, data[0:2])[0] / 10.0 temp_raw struct.unpack(h, data[2:4])[0] # 处理负数补码转换 temperature temp_raw / 10.0 if temp_raw 0x8000 else (temp_raw - 0x10000) / 10.0 return temperature, humidity # 使用示例 sensor RS485Sensor(COM3) temp, humi sensor.read_temperature_humidity() print(f温度: {temp:.1f}℃, 湿度: {humi:.1f}%)这段代码有几个值得注意的技术点CRC校验采用查表法会更高效但这里用直接计算方便理解struct.unpack处理字节序时h表示大端16位有符号整数温度值的补码处理是关键否则会得到错误的正值5. 常见问题排查指南在调试RS-485通信时我遇到过不少坑这里总结几个典型问题问题1收不到任何数据检查接线A/B线是否接反可以尝试调换确认终端电阻线路超过100米时需要加120Ω电阻验证设备地址有些传感器默认地址是0xFF问题2收到乱码数据# 典型表现 b\x01\x03\x04\x01\x18\xff\x9f\x00\x00 # 最后CRC位错误检查波特率必须与传感器设置完全一致测试线路干扰改用屏蔽双绞线远离电源线确认停止位常见配置是1个停止位问题3CRC校验频繁失败建议添加调试代码打印原始数据print(原始数据:, data.hex( )) # 输出类似 01 03 04 01 18 ff 9f 7a 63对于需要长时间运行的系统建议增加重试机制def safe_read(sensor, max_retry3): for _ in range(max_retry): try: return sensor.read_temperature_humidity() except (IOError, ValueError) as e: print(f读取失败: {e}, 重试中...) time.sleep(0.5) raise Exception(超过最大重试次数)最后分享一个性能优化技巧批量读取多个寄存器可以减少通信次数。比如有些传感器同时提供温度、湿度和光照度数据可以一次性读取多个寄存器。
RELATED

相关推荐

AI TreasureBox项目架构深度剖析:如何构建可扩展的AI资源管理系统

AI TreasureBox项目架构深度剖析:如何构建可扩展的AI资源管理系统

AI TreasureBox项目架构深度剖析:如何构建可扩展的AI资源管理系统 【免费下载链接】AiTreasureBox 🤖 Automatically collected AI repos, tools, websites, papers & tutorials. 实用AI百宝箱 💎 项目地址: https://gitcode.com/gh_mi…

📅 2026/10/8 19:09:44
新加坡国立大学提出“扩散模型自我进化“方案

新加坡国立大学提出“扩散模型自我进化“方案

这项由新加坡国立大学研究团队开展的工作,于2026年7月以预印本形式发布,编号为arXiv:2607.04428,有兴趣深入了解的读者可通过该编号查询完整论文。研究提出了一种名为dOPSD的新型训练方法,专门针对一类叫做"扩散大语言模型&q…

📅 2026/9/13 11:31:23
上海AI实验室等联合发布:训练大模型选哪个优化器?

上海AI实验室等联合发布:训练大模型选哪个优化器?

这项由上海人工智能实验室、上海大学、西湖大学、上海交通大学、中国科学院大学、浙江大学、南方科技大学等多家机构联合开展的研究,于2026年7月以预印本形式发布,论文编号为arXiv:2607.04033。感兴趣的读者可以通过这个编号在arXiv平台找到完整论文。**…

📅 2026/10/6 0:45:23
MORE NEWS

更多资讯

📰

特种作业质监局操作证过期了怎么复审?上岗必备证书别掉链子

特种作业质监局操作证过期了怎么复审?上岗必备证书别掉链子 证书过期了不知道怎么复审延期?很多南阳房建工程从业者都遇到过这个问题,尤其是特种作业质监局操作证,一旦过期就等于失去了“上岗必备”的资格,轻则影响工作安排,重则面临法律责任。今天就来…

📰

北京通州区电工证报考怎么走?上岗必备全流程揭秘

北京通州区电工证报考怎么走?上岗必备全流程揭秘 你是不是也这样,听说电工证是 上岗必备 ,但一听说要自己跑流程、找地方报名,就怕被中介坑?别急,今天就给你讲明白, 北京通州区电工证报考 到底怎么走,不走弯路,不花冤枉钱。…

📰

特种工免考条件怎么报名才能省事又合规

特种工免考条件怎么报名才能省事又合规 证书过期了不知道怎么复审延期,这是很多特种作业人员的共同困扰。尤其是在洛阳涧西区这样的施工企业密集区域,项目经理和安全负责人每天都面临证件有效期管理、合规性检查等压力。今天就来聊聊 特种工免考条件…

📰

丹江口查电工证怎么查?全国通用证书怎么续期不被坑

丹江口查电工证怎么查?全国通用证书怎么续期不被坑 证书过期了不知道怎么复审延期,是不是你最近遇到的糟心事?别急,今天我就从一线操作手的角度,告诉你 丹江口查电工证 的全攻略,还有怎么避免被坑、如何顺利续期,关键是这个证还能 全国通用…

📰

从化区电工证补贴内部消息:外省证怎么转?补贴怎么领?

从化区电工证补贴内部消息:外省证怎么转?补贴怎么领? 之前考的证在外省能不能转过来?这个问题我遇到过不下20次,尤其是像你这样在开封干建筑工的兄弟,手里拿着老家的电工证,想在从化区干点活,但又怕证过不了审、用不上。别急,内部消息来了,我来给…

📰

陇南市特种作业操作证多久拿证,证书过期了不知道怎么复审延期?这几点必须知道

陇南市特种作业操作证多久拿证,证书过期了不知道怎么复审延期?这几点必须知道 证书过期了不知道怎么复审延期?你不是一个人在战斗,很多人在特种作业领域摸爬滚打多年,最后因为证书没按时复审而丢了饭碗,甚至被单位追责。尤其是在陇南市,特种作业操作证…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬