工具

校验和 / 异或校验 / LRC 计算器

串口私有协议、Modbus ASCII、NMEA 语句里用的简单校验,一次全算出来。手册只写了「校验和」三个字时,拿示例帧逐行对照就知道是哪一种。

识别到 6 字节:01 03 00 00 00 0A
SUM8 累加和0E
所有字节相加取低 8 位 · 又叫校验和 / 和校验
SUM8 补码 = LRCF2
(0x100 − SUM8) & 0xFF · Modbus ASCII 的 LRC
XOR / BCC 异或08
所有字节逐个异或 · 又叫异或校验 / BCC
SUM8 反码F1
SUM8 按位取反 · 部分协议叫「校验和取反」
SUM16 累加和000E
所有字节相加取低 16 位

全部计算在你浏览器本地完成,不上传任何数据。需要 CRC 校验的话用 CRC/Modbus 校验计算器。

怎么用

把参与校验的那部分数据贴进来——不含校验字节本身,也不含协议规定不参与计算的帧头帧尾。 十六进制字节选「HEX 字节」;像 NMEA 这种对字符算校验的,选「ASCII 文本」,贴 $ 与 * 之间的内容,取「XOR / BCC」那一行。

五种结果同时列出,是因为各家手册对同一个算法的叫法很乱。最快的确认办法:找手册里一条带校验的示例帧,贴数据部分,看哪一行等于示例的校验字节。

五种校验分别在算什么

  • SUM8 累加和:所有字节加起来,只留低 8 位。最简单,但字节顺序颠倒查不出来。
  • SUM8 补码:(0x100 − SUM8) & 0xFF。好处是接收方把数据和校验字节一起相加,低 8 位恰好为 0,判断很省事。Modbus ASCII 的 LRC 就是它。
  • SUM8 反码:SUM8 按位取反,比补码少了「加一」。和补码只差 1,最容易混,对不上时先看是不是差了 1。
  • XOR / BCC 异或:所有字节逐个异或。NMEA 0183 语句结尾 * 后面的两位十六进制就是它。
  • SUM16:相加后保留低 16 位,占两个字节,部分协议用它换取更宽的取值范围;两个字节谁在前按手册来。

举个可以手算的例子:数据 01 03 00 00 00 0A,相加得 0x0E; 补码是 0x100 − 0x0E = 0xF2,反码是 0xF1,异或结果是 01 ^ 03 ^ 0A = 0x08。

常见问题

手册上写「校验和」,到底是累加和、补码还是反码?
「校验和」在中文手册里是个很宽的叫法,至少有三种可能:所有字节相加取低 8 位(SUM8)、在此基础上取补码(取反加一,常见于要求「整帧相加为 0」的协议)、或者取反码(只取反不加一)。最稳的办法是找手册里的一条示例帧,把数据部分贴进上面的计算器,看哪一行和示例里的校验字节对得上,就是哪一种。
Modbus ASCII 的 LRC 怎么算?为什么我算的对不上?
LRC 是对「地址 + 功能码 + 数据」这些原始字节求和取低 8 位,再取二进制补码。最常见的错误有两个:一是把 ASCII 字符本身拿去算(比如把 "01" 当成 0x30 0x31 两个字节),正确做法是先把两个 ASCII 字符还原成一个字节再算;二是把起始的冒号和结尾的 CR LF 也算进去了,它们都不参与计算。用本工具时选「HEX 字节」,只贴地址到数据的部分。
异或校验(XOR / BCC)和 CRC 该选哪个?
异或校验实现最简单,但检错能力弱:同一位上出现两次翻转会互相抵消,字节顺序颠倒也查不出来。CRC 计算稍复杂,却能以很高概率抓出突发干扰和多比特错误。如果协议是你自己设计的,线路又比较长或干扰大(比如 RS-485 现场总线),优先用 CRC-16;只是板内或短距离通信、追求最省资源时,异或校验够用。对接现成设备则没得选,照手册来。

延伸阅读

Modbus RTU 用的是 CRC-16 而不是这几种简单校验,算它用 CRC/Modbus 校验计算器; HEX 与 ASCII 来回换算用 进制/波特率换算器; 读到的浮点寄存器对不上,见 Modbus 浮点数转换。 帧拼好了想直接发给设备,用 串口调试助手网页版。

这个页面有问题?

提交时会附带当前页面地址和浏览器信息,帮助我们定位问题。不填联系方式即为匿名。