尧图网络 高端网站定制 · 原创设计
免费咨询热线
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/8/24 2:34:59
新加坡国立大学提出“扩散模型自我进化“方案

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

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

📅 2026/9/12 1:58:05
上海AI实验室等联合发布:训练大模型选哪个优化器?

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

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

📅 2026/8/24 2:34:59
MORE NEWS

更多资讯

📰

qwen-code 工具搜索预加载阈值:tools.toolSearch.threshold 的设计、实现与调优

qwen-code 工具搜索预加载阈值:tools.toolSearch.threshold 的设计、实现与调优 【免费下载链接】qwen-code An open-source AI coding agent that lives in your terminal. 项目地址: https://gitcode.com/GitHub_Trending/qw/qwen-code 本篇文章深入解析 q…

📰

AI音乐创作入门:Minimax工具零基础指南

1. AI音乐创作新体验:用灵芽社区Minimax工具生成你的第一首歌第一次听说AI能写歌时,我脑海里浮现的是科幻电影里机器人指挥交响乐的画面。直到在灵芽社区亲手用Minimax工具生成了自己的第一首歌,才发现AI音乐创作早已不是遥不可及的未来科技。…

📰

在 Mojo 中优化 Blackwell 矩阵乘法(二):TMA、Tensor Core 与 Swizzling 实战指南

在 Mojo 中优化 Blackwell 矩阵乘法(二):TMA、Tensor Core 与 Swizzling 实战指南 【免费下载链接】mojo The Modular Platform (includes MAX & Mojo) 项目地址: https://gitcode.com/GitHub_Trending/mo/mojo 本篇文章是 Mojo/M…

📰

MaaAssistantArknights 专用 VS Code 插件实战指南:tasks.json 语义编辑、截图裁剪与调试全流程

MaaAssistantArknights 专用 VS Code 插件实战指南:tasks.json 语义编辑、截图裁剪与调试全流程 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手,全日常一键长草!| A one-click tool for the daily tasks of Arknights, supporti…

📰

WorkBuddy金融版深度解析:Agent安全合规落地的关键设计与实践

WorkBuddy金融版正式发布之后,我这边收到最多的私信就是同一个问题:这个版本和普通企业版到底差在哪?问的人里有券商的技术负责人、银行数字化团队的架构师,也有整天在搞Agent外包开发的独立开发者。大家真正的关注点其实出奇一致…

📰

RemoveWindowsAI:一条命令彻底移除 Windows 11 的 Copilot 与 Recall,免费

RemoveWindowsAI:一条命令彻底移除 Windows 11 的 Copilot 与 Recall,免费 【免费下载链接】RemoveWindowsAI Force Remove Copilot, Recall and More in Windows 11 项目地址: https://gitcode.com/GitHub_Trending/re/RemoveWindowsAI 笔记本一…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

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

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

📞 💬