hixon 发表于 2022-11-23 15:41:58

环保HJ212-2017协议 CRC16校验

本帖最后由 hixon 于 2022-11-23 16:14 编辑

关于HJ212协议,需要注意的是它里面有一个 CRC16的校验,其算法有别于Modbus的CRC16,下面是我们用JavaScript来实现的HJ212 CRC16校验方法。

var crc16 = function(msg, msg_len) {
    var i, j, crc, check;
    crc = 0xFFFF;
    for(i = 0; i < msg_len ; i++) {
      crc = ((crc >> 8)) ^ msg.charCodeAt(i);
      for(j = 0; j < 8; j++) {
            check = crc & 0x0001;
            crc >>= 1;
            if(check == 0x0001) {
                crc ^= 0xA001;
         }
      }
    }
    // 返回16进制表示的大写字符串,如 "6E80"
    return crc.toString(16).toUpperCase();
};
下面我们给一段测试数据,看一下计算的结果是否正确,黄底部分为参与CRC计算的数据


开始测试:var data = "QN=20210320163101890;ST=32;CN=2011;PW=123456;MN=81733553213013;Flag=4;CP=&&DataTime=20210320013400;w00000-Rtd=181.682,w00000-Flag=N;w21001-SampleTime=20210320005400,w21001-Rtd=45.160,w21001-Flag=N;w21011-SampleTime=20210320013400,w21011-Rtd=1.970,w21011-Flag=N;w21003-SampleTime=20210320013400,w21003-Rtd=53.131,w21003-Flag=N;w01018-SampleTime=20210320013400,w01018-Rtd=194.200,w01018-Flag=N;w01001-SampleTime=20210320013406,w01001-Rtd=7.496,w01001-Flag=N&&";
var crc = crc16(data, data.length);
util.console.log('crc: ' + crc); // 计算结果应该为6E80








页: [1]
查看完整版本: 环保HJ212-2017协议 CRC16校验