Foxtable(狐表)用户栏目专家坐堂 → crc16验证


  共有1738人关注过本帖树形打印复制链接

主题:crc16验证

帅哥哟,离线,有人找我吗?
fubblyc
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2355 积分:16187 威望:0 精华:0 注册:2013/9/1 8:09:00
crc16验证  发帖心情 Post By:2017/10/7 16:52:00 [只看该作者]

各位老师好,有一个关于 crc16验证的问题:

手机通过ble蓝牙连接扫码枪后,得到数据后,要通过如下的crc16 js 进行验证。


ble通信文档

传输命令格式:

OP (1 BYTE)

Len(1 BYTE)

CRC16(2 BYTE)

Data(0~250BYTE)

 

1OP定义如下:

NORMAL_PACKET         0X37

END_PACKET             0X38

一个长条码可能会分成多帧进行传输,一次最多传输250个字节的条码内容。

如果发送的不是最后一个包,OP填入NORMAL_PACKET

如果发送的是最后一个包,OP填入END_PACKET

 

2Len定义如下:

是指Data域里面的数据长度,不包括CRC16的长度。

 

3CRC16

Data域里面所有数据的校验和。校验方式为自定义校验方式,不是标准的CRC16.

 

4Data定义如下:

Data为扫码枪扫到的数据,如果条码过长会分多个报文进行传输。



js代码:

function crcCheck(msg, len) {

    var crc = Number(0);

    var current = Number(0);

    for (var i = 0; i < len; i++) {

        current = (msg[i] & 0x000000FF) << 8;

        for (var j = 0; j < 8; j++) {

            if ((crc ^ current) & 0x8000) {

                crc = (crc << 1) ^ 0x1021;

            }  

            else { 

                crc <<= 1;

            }

            crc &= 0x0000FFFF;

            current <<= 1;

        }

    }

    return crc;

};


问题在这里,扫入的条码怎么变成这个 buffer的格式呢。。。


var buf = new Buffer([0xEA, 0xAE, 0x01, 0x02,0x59,0xAE]);   //填BLE的条码数据(扫码枪扫入的条码)+秘钥(我这边已设置的8位数)  总长度14+8 =22

var crc16 = crcCheck(buf, buf.length);

console.log("crc16[%j]=%j",buf.length,crc16.toString(16) );

[此贴子已经被作者于2017/10/7 16:51:53编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2017/10/7 17:03:00 [只看该作者]

1、你扫描枪扫描的内容是什么?

 

2、Buffer就是一个数组,你把扫描的内容转换成一个数组即可。


 回到顶部
帅哥哟,离线,有人找我吗?
fubblyc
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2355 积分:16187 威望:0 精华:0 注册:2013/9/1 8:09:00
  发帖心情 Post By:2017/10/7 17:09:00 [只看该作者]

哦哦,谢谢有点甜老师,
扫码枪的内容:(扫码枪扫入的条码14位数字)+秘钥(我这边已设置的8位数)
如:6949907605380 abc12345 (有一个空格)
甜老师,怎么转换成数组呢。。。
[此贴子已经被作者于2017/10/7 17:09:40编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2017/10/7 17:17:00 [只看该作者]

你扫描的字符要如何转换成数组?两个字符分割?规则是什么?

 回到顶部
帅哥哟,离线,有人找我吗?
fubblyc
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2355 积分:16187 威望:0 精华:0 注册:2013/9/1 8:09:00
  发帖心情 Post By:2017/10/7 17:25:00 [只看该作者]

我也不知道用不用数组,只是这个js的代码示例是这样。
var buf = new Buffer([0xEA, 0xAE, 0x01, 0x02,0x59,0xAE])

那如果不用的话,我就直接把6949907605380 abc12345 填入就可以哈。
var buf = new Buffer("6949907605380 abc12345"
这样符合 buffer的写法吗?


[此贴子已经被作者于2017/10/7 17:25:37编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2017/10/7 17:29:00 [只看该作者]

你直接填入扫描的内容,能否运算得到结果?

 

或者说,你如何填入数据后可以运算得到结果?


 回到顶部
帅哥哟,离线,有人找我吗?
fubblyc
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2355 积分:16187 威望:0 精华:0 注册:2013/9/1 8:09:00
  发帖心情 Post By:2017/10/7 17:36:00 [只看该作者]

恩恩,甜老师,我测试一下,之前一直在找 new Buffer([0xEA, 0xAE, 0x01, 0x02,0x59,0xAE]);怎么写,没想到可以直接用字符进去。

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2017/10/7 17:41:00 [只看该作者]

一般是把你扫描到的字符分拆成数组然后校验的,关键是看规则是怎么分拆,比如一个字符、两个字符。

 回到顶部
帅哥哟,离线,有人找我吗?
fubblyc
  9楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:九尾狐 帖子:2355 积分:16187 威望:0 精华:0 注册:2013/9/1 8:09:00
  发帖心情 Post By:2017/10/7 18:05:00 [只看该作者]

这是他们给的示例代码:

var buf = new Buffer([0xEA, 0xAE, 0x01, 0x02,0x59,0xAE]);   //填BLE的条码数据(扫码枪扫入的条码13位和回车)+秘钥(我这边已设置的8位数)  总长度14+8 =22

能看出规则吗?

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  10楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2017/10/7 18:12:00 [只看该作者]

 试试

 

var buf =  "6949907605380abc12345";

var crc16 = crcCheck(buf, buf.length);


console.log("crc16[%j]=%j",buf.length,crc16.toString(16) );


 回到顶部
总数 15 1 2 下一页