myeclipse/eclipse
传感器
电脑
传感器和电脑都在同一个交换机下面
电脑是服务器,发送一组添加校验码的数据给传感器,传感器返回数据; 这个过程中,肯定是有rs485协议或者是modbus协议等等,把rs232转换为其他信号; 的来说,根据设备探测器来进行协议的转换。传感器是和电脑都在一个交换机下面。由于我是做软件的,这个硬件具体的我也不是太清楚。
crc16校验码的原理如下:假设数据传输过程中需要发送15位的二进制信息g=101,那么这串二进制码可表示为代数多项式g(x) = x^14 + x^12 + x^9 + x^8 + x^7 + x^5 + 1。将g(x)乘以x^m,既将g后加m个0,然后除以m阶多项式h(x),得到的(m-1)阶余项r(x)对应的二进制码r就是CRC编码。备注:g(x)和h(x)的除运算,可以通过g和h做xor(异或)运算。比如将11001与10101做xor运算
CRC-16校验码计算方法:常用查表法和计算法。计算方法一般都是:(1)、预置1个16位的寄存器为十六进制FFFF(即全为1),称此寄存器为CRC寄存器;(2)、把第一个8位二进制数据(既通讯信息帧的第一个字节)与16位的CRC寄存器的低 8位相异或,把结果放于CRC寄存器,高八位数据不变;(3)、把CRC寄存器的内容右移一位(朝低位)用0填补最高位,并检查右移后的移出位;(4)、如果移出位为0:重复第3步(再次右移一位);如果移出位为1,CRC寄存器与多 项式A001(1010 0000 0000 0001)进行异或;(5)、重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理;(6)、重复步骤2到步骤5,进行通讯信息帧下一个字节的处理;(7)、将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低 字节进行交换;(8)、最后得到的CRC寄存器内容即为:CRC码
理论知识看着特别复杂,只有自己亲自计算以后,才会发现其中的规律,我附上自己计算的7张图纸,有不懂得可以看一下,也许就会豁然开朗的!顺序我视乎乱了,不过仔细看一下是可以分出来顺序的!!
package cn.com.pd;public class Crc { public static int [] getCrc(byte[] data) { int flag; // 16位寄存器,所有数位均为1 int wcrc = 0xffff; for (int i = 0; i < data.length; i++) { // 16 位寄存器的低位字节 // 取被校验串的一个字节与 16 位寄存器的低位字节进行“异或”运算 wcrc = wcrc ^ data[i]; for (int j = 0; j < 8; j++) { flag = wcrc & 0x0001; // 把这个 16 寄存器向右移一位 wcrc = wcrc >> 1; // 若向右(标记位)移出的数位是 1,则生成多项式 1010 0000 0000 0001 和这个寄存器进行“异或”运算 if (flag == 1) wcrc ^= 0xa001; } } //获取低八位 int low=wcrc>>8;//或者wcrc/256 int up=wcrc%256;//获取高八位 int [] crc={up,low}; return crc;}}
实践结果,控制台打印出36 40;对应的十六进制就是24 28而且socket返回了数据,就说明无论是以16进制还是10进制发送数据给传感器,都是可以的,可行的!