|
本帖最后由 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
复制代码
|
|