VOLTCRAFT K204温度计数据解码异常及格式问题求助
解决VOLTCRAFT K204温度计串口数据解码问题
问题本质
- 你错误地将数值型二进制数据当作文本字符用ASCII/UTF-8解码,这类字节不是可打印字符,解码必然失败。
- 所谓“2字节变为1字节”是Python的bytes对象显示特性:当字节值对应可打印ASCII字符时,会直接显示字符而非十六进制(比如
0x32显示为'2'),实际仍是两个独立字节(如b'\x012'等价于b'\x01\x32'),并非格式异常。
通用解码方案
根据设备手册的串口协议,温度数据以16位二进制数值存储,需按以下步骤转换:
1. 修正串口读取逻辑
原代码用readline()不可靠(设备输出无换行符),改用read(45)确保读取完整的45字节数据包;同时修正变量名错误(原代码中s未定义,应为读取到的数据包变量)。
2. 二进制转温度值
提取第8、9字节(索引7-9,对应切片full_data[7:9]),将其组合为16位整数,再除以10得到实际温度(℃)。
修正后的代码
import serial ser = serial.Serial( 'COM1', baudrate=9600, parity='N', bytesize=8, stopbits=1, rtscts=True, dsrdtr=True, timeout=1 ) ser.write(b'A') # 发送命令触发设备输出数据 # 读取完整的45字节数据包 full_data = ser.read(45) if len(full_data) != 45: print("警告:未读取到完整数据包") ser.close() exit() # 提取温度对应的2字节数据(第8、9位,索引7和8) temp_bytes = full_data[7:9] # 转换为16位整数(大端字节序,若支持负温需添加signed=True) temp_raw = int.from_bytes(temp_bytes, byteorder='big') # 转换为实际温度(单位为0.1℃,需除以10) temperature = temp_raw / 10.0 print(f"原始字节十六进制: {temp_bytes.hex()}") print(f"当前温度: {temperature}℃") ser.close()
验证示例
- 23.2℃时的字节
b'\x00\xe8':十六进制为00e8,对应整数232,232/10=23.2℃,完全匹配实际温度。 - ~30.5℃时的字节
b'\x012':实际是0x01和0x32,十六进制为0132,对应整数306,306/10=30.6℃,误差在设备精度范围内。
注意事项
- 若设备支持负温度(如-200℃),需在
int.from_bytes中添加signed=True参数(按补码解析)。 - 确保串口参数(波特率、奇偶校验等)与手册完全一致,参数不匹配会导致数据乱码。
内容的提问来源于stack exchange,提问作者Marlon
相关产品推荐
相关产品推荐

