ELAI S.r.l.

传感器发送两个字节,AI 为什么读错温度?

传感器发送两个字节,AI 为什么读错温度? 通过完整算例解释方法、假设与局限。

传感器发送两个字节,AI 为什么读错温度?

AI 之前,先有字节契约

传感器发送两个字节,软件转换为温度给 AI。包完整、长度正确,模型却看到不可能的数,或更隐蔽的“错误但合理”数值。我们用合成协议解释传输数据到物理值间的选择,不归于商业传感器或 EL-AI 设备规格。

两个字节本身并未定义整数

每字节八位,编码 0–255。十六进制 9c ff 对应 156、255。小端 u=156+256·255=65436,大端 u=256·156+255=40191。位没变,位置权重变了。倒序读数字只是帮助理解权重的类比,不能靠它猜协议。

u_little = b_0 + 256 b_1; u_big = 256 b_0 + b_1

字节序不是字节内位序,也不决定符号。十六位二补码有符号数中,u<32768 时值为 u,否则 u−65536。这是格式语义,不是读数奇怪时才修补。该字节给出小端有符号 −100、大端有符号 −25345。

v = u if u<2^15, otherwise u−2^16

编码到物理值之间还有尺度

假设协议每计数为 0.01 °C、偏移为零,T=s·v+o。s 单位是 °C/计数,v 为解释后的整数,o 用 °C。正确解码得 −1 °C,改序或符号则得 654.36、−253.45、401.91 °C。这是同一字节的四种解释,不是四次环境实测。下游 AI 无法自动知道预期契约。

格式整数温度(°C)
<h-100-1.0
<H65436654.36
>h-25345-253.45
>H40191401.91
相同字节 9c ff 因序与符号产生四个数。柱是合成协议的解释,并非四个实测温度。
相同字节 9c ff 因序与符号产生四个数。柱是合成协议的解释,并非四个实测温度。

Python 的 < h 明确为标准两字节有符号小端,> h 为大端,H 无符号。原生 @ 依赖平台,复合格式还可能含对齐。外部交换应明确契约,不能假设两端机器约定一致。查阅文档版本与执行 Python 版本在附件中区分。

合理性检查也会放过错误

假设工作范围 −40 至 125 °C,首例三种误读会被拒绝。但 01 02 有符号小端为 5.13 °C,大端为 2.58,均合理。交换字节可逃过报警却改变 AI 决策。范围检查有用,但不能证明格式正确,还需已知协议样本。

字节完整性是另一性质。校验和可确认收发字节一致,却不验证符号、尺度或单位。本文未做传输或校验和实验;逻辑区别是消息完整不等于在错误接收契约下含义正确。

传感器状态与温度不是同类数据

协议可保留“无测量”编码。本例假设 0x7fff,即 ff 7f,作为哨兵,不能当 327.67 °C 输入 AI。decode 先查两字节长度,再查哨兵,之后处理符号与尺度,缺失返回 None,不自动换成零,因为零度也可能是真实测量。

脚本对全部 65536 个十六位有符号码比较手算、int.from_bytes 与 struct,验证所选转换,不证明真实传感器协议、电缆可靠或校准。两字节解析在模型中为常量工作量,但未测微控制器延迟、内存或能耗;执行环境为主机 Python 3.14.0。

首先要验证的是消息模型

网络尚未计算,温度就可能已错。字节序、符号、尺度、偏移与状态码须明确并版本化。连接嵌入式模型应沿全链核查已知字节与预期物理值,再测真实平台。更准确 AI 无法自动修复被反向解释的采集契约。

Python struct — Byte order, standard size and alignment.

import struct,json,sys
from pathlib import Path
raw=bytes.fromhex('9c ff');rows=[]
for order in ['little','big']:
 for signed in [True,False]:
  value=int.from_bytes(raw,byteorder=order,signed=signed);rows.append(dict(order=order,signed=signed,count=value,temperatureC=.01*value))
assert int.from_bytes(raw,'little',signed=True)==-100
def decode(data):
 if len(data)!=2:raise ValueError('Expected exactly two bytes')
 u=int.from_bytes(data,'little',signed=False)
 if u==0x7fff:return None
 signed=u if u<32768 else u-65536
 return .01*signed
assert decode(raw)==-1 and decode(bytes.fromhex('ff 7f')) is None
try:decode(b'')
except ValueError:pass
else:raise AssertionError('Invalid length accepted')
for value in range(-32768,32768):
 data=struct.pack('<h',value);u=data[0]+256*data[1];manual=u if u<32768 else u-65536
 assert struct.unpack('<h',data)[0]==value==manual==int.from_bytes(data,'little',signed=True)
ambiguous=bytes.fromhex('01 02');both=[.01*int.from_bytes(ambiguous,x,signed=True) for x in ['little','big']]
assert both==[5.13,2.58]
r=dict(python=sys.version.split()[0],seed=None,scope='Hypothetical signed 16-bit sensor protocol, not a real sensor datasheet or device measurement',wireHex=raw.hex(' '),scaleCPerCount=.01,rows=rows,ambiguousHex=ambiguous.hex(' '),bothPlausibleC=both,exhaustiveCodesChecked=65536,reservedExample='0x7fff hypothetically reserved: must decode status rather than a numeric temperature')
Path(__file__).with_name('results.json').write_text(json.dumps(r,indent=2),encoding='utf8')

代码、数据与说明 · JSON. 教学计算使用 Python 3.14.0,图使用 Matplotlib 3.11.2。分析由 AI 辅助,不声称经过同行评审或人工审核。原创 ImageGen 封面仅作示意,不记录 EL-AI 人员、场所或实际安装。来源查阅于 2026 年 10 月 25 日。