混合式应用开发之串口通讯(1)
程序员文章站
2022-10-03 21:06:55
CRC校验 循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。在数据传输过程中,无论传输系统的设计再怎么完美,差 ......
CRC校验
循环冗余校验(Cyclic Redundancy Check, CRC)是一种根据网络数据包或电脑文件等数据产生简短固定位数校验码的一种散列函数,主要用来检测或校验数据传输或者保存后可能出现的错误。它是利用除法及余数的原理来作错误侦测的。在数据传输过程中,无论传输系统的设计再怎么完美,差错总会存在,这种差错可能会导致在链路上传输的一个或者多个帧被破坏(出现比特差错,0变为1,或者1变为0),从而接受方接收到错误的数据。为尽量提高接受方收到数据的正确率,在接收方接收数据之前需要对数据进行差错检测,当且仅当检测的结果为正确时接收方才真正收下数据。检测的方式有多种,常见的有奇偶校验、因特网校验和循环冗余校验等。
1 var order = { 2 begin : '3A', 3 number : '00', 4 CommandCode:{ 5 Inventory : '01', 6 StayQuiet : '02', 7 Select : '03', 8 ResetToReady : '04', 9 WriteAFI : '05', 10 LockAFI : '06', 11 ReadBlock : '07' 12 }, 13 dataLen : '0200', 14 orderWay : { 15 anyAsk : '06', 16 anyFsk : '07', 17 oneAsk : '26', 18 oneFsk : '27' 19 }, 20 checkCode : '', 21 end : '0D0A' 22 23 }; 24 var orderString = ''; 25 function makeOrder(a,b) { 26 // 拼接指令(0001020027) 27 orderString = order.number + order.CommandCode[a] + order.dataLen + order.orderWay[b]; 28 //生成校验码 29 order.checkCode = CRC.ToModbusCRC16(orderString); 30 //拼接指令 31 orderString = orderString + order.checkCode; 32 //处理指令字符串 33 orderString = orderString.split(''); 34 function topow(x) { 35 return x.charCodeAt().toString(16); 36 }; 37 orderString = orderString.map(topow).join(''); 38 //拼接最终指令 39 orderString = order.begin + orderString + order.end; 40 //编号+ 41 // order.number++; 42 43 }; 44 45 //crc校验码生成 46 var CRC = {}; 47 48 CRC.CRC16 = function (data) { 49 var len = data.length; 50 if (len > 0) { 51 var crc = 0xFFFF; 52 53 for (var i = 0; i < len; i++) { 54 crc = (crc ^ (data[i])); 55 for (var j = 0; j < 8; j++) { 56 crc = (crc & 1) != 0 ? ((crc >> 1) ^ 0x8408) : (crc >> 1); 57 } 58 } 59 var hi = ((crc & 0xFF00) >> 8); //高位置 60 var lo = (crc & 0x00FF); //低位置 61 62 return [hi, lo]; 63 } 64 return [0, 0]; 65 }; 66 67 CRC.isArray = function (arr) { 68 return Object.prototype.toString.call(arr) === '[object Array]'; 69 }; 70 71 CRC.ToCRC16 = function (str, isReverse) { 72 return CRC.toString(CRC.CRC16(CRC.isArray(str) ? str : CRC.strToByte(str)), isReverse); 73 }; 74 75 CRC.ToModbusCRC16 = function (str, isReverse) { 76 return CRC.toString(CRC.CRC16(CRC.isArray(str) ? str : CRC.strToHex(str)), isReverse); 77 }; 78 79 CRC.strToByte = function (str) { 80 var tmp = str.split(''), arr = []; 81 for (var i = 0, c = tmp.length; i < c; i++) { 82 var j = encodeURI(tmp[i]); 83 if (j.length == 1) { 84 arr.push(j.charCodeAt()); 85 } else { 86 var b = j.split('%'); 87 for (var m = 1; m < b.length; m++) { 88 arr.push(parseInt('0x' + b[m])); 89 } 90 } 91 } 92 return arr; 93 }; 94 95 CRC.convertChinese = function (str) { 96 var tmp = str.split(''), arr = []; 97 for (var i = 0, c = tmp.length; i < c; i++) { 98 var s = tmp[i].charCodeAt(); 99 if (s <= 0 || s >= 127) { 100 arr.push(s.toString(16)); 101 } 102 else { 103 arr.push(tmp[i]); 104 } 105 } 106 return arr; 107 }; 108 109 CRC.filterChinese = function (str) { 110 var tmp = str.split(''), arr = []; 111 for (var i = 0, c = tmp.length; i < c; i++) { 112 var s = tmp[i].charCodeAt(); 113 if (s > 0 && s < 127) { 114 arr.push(tmp[i]); 115 } 116 } 117 return arr; 118 }; 119 120 CRC.strToHex = function (hex, isFilterChinese) { 121 hex = isFilterChinese ? CRC.filterChinese(hex).join('') : CRC.convertChinese(hex).join(''); 122 123 //清除所有空格 124 hex = hex.replace(/\s/g, ""); 125 //若字符个数为奇数,补一个空格 126 hex += hex.length % 2 != 0 ? " " : ""; 127 128 var c = hex.length / 2, arr = []; 129 for (var i = 0; i < c; i++) { 130 arr.push(parseInt(hex.substr(i * 2, 2), 16)); 131 } 132 return arr; 133 }; 134 135 CRC.padLeft = function (s, w, pc) { 136 if (pc == undefined) { 137 pc = '0'; 138 } 139 for (var i = 0, c = w - s.length; i < c; i++) { 140 s = pc + s; 141 } 142 return s; 143 }; 144 145 CRC.toString = function (arr, isReverse) { 146 if (typeof isReverse == 'undefined') { 147 isReverse = true; 148 } 149 var hi = arr[0], lo = arr[1]; 150 return CRC.padLeft((isReverse ? hi + lo * 0x100 : hi * 0x100 + lo).toString(16).toUpperCase(), 4, '0'); 151 }; 152 // makeOrder('Inventory','oneFsk');
上一篇: flash怎么给图片中的柳条添加随风飘荡的动画效果?
下一篇: DNS攻击的主要方式有哪些