https://www.cnblogs.com/yangfengwu/p/11204436.html
刚才有人说需要点鸡汤....
我想想哈;我还没问关于哪方面的鸡汤呢!!!
增加一个SeekBar
一个 Switch
协议:
00 01 70 C0 控制LED点亮 70 C0 为CRC高位和低位
00 00 B0 01 控制LED熄灭 B0 01 为CRC高位和低位
PWM数据
01固定 后四位为PWM数据(高位在前低位在后,按照IEEE754规约) 最后两位为CRC16校验位,高位在前,低位在后
列如:举几个例子,PWM数据是0-1000
01 03 E8 00 00 B0 99 注:03 E8 00 00 为1000 B0 99 为CRC检验数据高位在前,低位在后
01 01 F4 00 00 CE 59 500
01 64 00 00 00 F0 06 100
01 00 00 00 00 C0 19 0
大家可以用此工具生成CRC,用于验证咱写的CRC程序.
注:01 03 E8 00 00 B0 99 其实可以省掉两个0 01 03 E8 B0 99
但是我所用过的大部分的仪器仪表都是4位的所以咱就还是用四位
现在看Android 端怎么写
现在呢给大家计算CRC的程序,判断数据CRC是不是正确的程序
/** * CRC检验值 * @param modbusdata * @param length * @return CRC检验值 */ protected int crc16_modbus(byte[] modbusdata, int length) { int i=0, j=0; int crc = 0xffff;//有的用0,有的用0xff try { for (i = 0; i < length; i++) { //注意这里要&0xff,因为byte是-128~127,&0xff 就是0x0000 0000 0000 0000 0000 0000 1111 1111 //参见:https://blog.csdn.net/ido1ok/article/details/85235955 crc ^= (modbusdata[i]&(0xff)); for (j = 0; j < 8; j++) { if ((crc & 0x01) == 1) { crc = (crc >> 1) ; crc = crc ^ 0xa001; } else { crc >>= 1; } } } } catch (Exception e) { } return crc; } /** * CRC校验正确标志 * @param modbusdata * @param length * @return 0-failed 1-success */ protected int crc16_flage(byte[] modbusdata, int length) { int Receive_CRC = 0, calculation = 0;//接收到的CRC,计算的CRC Receive_CRC = crc16_modbus(modbusdata, length); calculation = modbusdata[length + 1]; calculation <<= 8; calculation += modbusdata[length]; if (calculation != Receive_CRC) { return 0; } return 1; }
先去烧壶水,今天需要熬夜写文章,测试东西....