24-ESP8266 SDK开发基础入门篇--Android TCP客户端.控制 Wi-Fi输出PWM的占空比,调节LED亮度

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;
    }

先去烧壶水,今天需要熬夜写文章,测试东西....

猜你喜欢

转载自www.cnblogs.com/yangfengwu/p/11324411.html