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

    https://www.cnblogs.com/yangfengwu/p/11204436.html

    刚才有人说需要点鸡汤....

    我想想哈;我还没问关于哪方面的鸡汤呢!!!

    我所一直走的路线

    第一:能够帮到人
    第二:能够获得好的人气
    第三:获取利益,养活自己

    其实第一和第二只要你有哪一方面的优点,又肯吃苦,那么就很好走到.

    但是至于第三点,既要全心全意的帮助别人又要从别人那里获取利益养活自己.....其实不容易

    很多人只能走到第一,第二,然后走到沾一点第三的边.

    这个时候的人们就开始浮躁了,大部分人都会走极端,要么舍弃不干了,要么突然把自己的东西开始全部利益化......

    怎么说呢!走到这个时候,你应该静下心来好好的想想自己的初心,很多时候人们都在说:不忘初心!!!

    注意:事情总会有解决的办法,可能在那个时候你没有想出来很好的办法,就走了极端,你是否想过,你再坚持坚持自己的初心,无论何时都

    不能动摇自己的初心.你要知道很多时候都是在人们感觉一点希望都没有的时候,才会想到办法,才看到了希望!所以才会有了那句:天道酬勤

    其实我本身就是经历过这种日子,我曾经也动摇过初心,但是怎么说呢!我动摇过后不到3天就会立马改过来,因为我不敢欺骗自己的心.会让我难受!

    那个马爸爸说过一句话:迷茫和彷徨过后,知道自己应该干什么才是最重要的!

    关键还是放平自己的心态,现在遍地都是浮躁的人,一口吃不了胖子!

    虽然说是金子总会发光,,但是我的理解是:谁一开始都不是金子,是经过了炼金的过程最终把自己炼成了金子.

    增加一个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 00 00 03 E8 7E 19   注:00 00 03 E8  为1000          7E 19  为CRC检验数据高位在前,低位在后

    01 00 00 01 F4 D7 19           500

    01 00 00 00 64 2B 18            100

    01 00 00 00 00 C0 19            0

    大家可以用此工具生成CRC,用于验证咱写的CRC程序. 

     注:01 00 00 03 E8 7E 19    其实可以省掉两个0          01 03 E8 7E 19

    但是我所用过的大部分的仪器仪表都是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];
            calculation <<= 8;
            calculation += modbusdata[length+1];
            if (calculation != Receive_CRC)
            {
                return 0;
            }
            return 1;
        }

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

    下面看使用

     我先和我的电脑的网络调试助手测试一下

         

       

     好,现在写WIFI的程序

    弄个crc.c和crc.h

     

    官方的都是把h文件放到这里,咱也放到这里

    C语言的和java的其实差不多,只不过有些细节不一样,类如java用byte  java的byte需要&0xff

    #include "esp_common.h"
    /**
    * @brief  计算CRC
    * @param  *modbusdata:数据指针
    * @param  length:需要计算的CRC的数据长度
    * @param
    * @retval 计算的CRC
    * @example
    **/
    int crc16_modbus(u8 *modbusdata, int length)
    {
        int i, j;
        int crc = 0xffff;//有的用0有的用0xffff
        for (i = 0; i < length; i++)
        {
                crc ^= modbusdata[i];
                for (j = 0; j < 8; j++)
                {
                        if ((crc & 0x01) == 1)
                        {
                                crc = (crc >> 1) ^ 0xa001;
                        }
                        else
                        {
                                crc >>= 1;
                        }
                }
        }
    
        return crc;
    }
    
    /**
    * @brief  判断CRC的校验是否正确
    * @param  *modbusdata:要判断的数据指针
    * @param  length:需要计算的CRC的数据长度
    * @param
    * @retval 1 OK·  0 err
    * @example
    **/
    int crc16_flage(u8 *modbusdata, int length)
    {
        int Receive_CRC=0,calculation=0;
    
        Receive_CRC = crc16_modbus(modbusdata, length);//用自带的函数计算数据的CRC
        calculation = modbusdata[length];//获得接收的CRC的高位
        calculation <<= 8;//获得接收的CRC的低位
        calculation += modbusdata[length+1];//高低位组合
        if(calculation != Receive_CRC)//看看CRC是否相等
        {
            return 0;
        }
        return 1;
    }

    声明一下

     然后

     

     下载测试

    开发板看上去有点旧........因为我把我使用的测试的那一块板子都卖了,现在还欠着别人的板子呢.....我使用的是以前自己焊接的一块..断货了....

    最近由于一直忙,这块板子的下一批贴片可能要等大约2个星期.....

         

         

    接着做PWM部分

     

     和当时串口的时候一样,咱呢不能直接把发送放到里面,咱的TCP服务器设置的是5ms延时

    所以咱呢,就10ms发送一次数据.

    判断数据变化了,就把数据发送出去...

    我测试了,出现了问题

    WIFI的程序有问题,会粘包....

    先说一下我的Android 的程序

     

    //TCP客户端发送数据
        private void startTimer(){
            if (timer == null) {
                timer = new Timer();
            }
            if (timerTask == null) {
                timerTask = new TimerTask() {
                    @Override
                    public void run() {
                        try{
                            if (seekBarValueCopy != seekBarValue){//数据改变
                                seekBarValueCopy = seekBarValue;
                                if (socket!=null && socket.isConnected()){//如果TCP是正常连接的
                                    int crc = 0;
                                    TcpSendData[0] =(byte)0x01;
                                    TcpSendData[1] =(byte)((seekBarValue>>24)&0xff);
                                    TcpSendData[2] =(byte)((seekBarValue>>16)&0xff);
                                    TcpSendData[3] =(byte)((seekBarValue>>8)&0xff);
                                    TcpSendData[4] =(byte)(seekBarValue&0xff);
                                    crc = crc16_modbus(TcpSendData, 5);//计算CRC
                                    TcpSendData[5] = (byte)((crc >> 8) & 0xff);//CRC高位
                                    TcpSendData[6] = (byte)(crc & 0xff);//CRC低位
                                    outputStream.write(TcpSendData,0,7);//发送数据
                                }
                            }
                        }catch (Exception e){//接收数据有错误
                            Message msg = myHandler.obtainMessage();//从消息队列拉取个消息变量
                            msg.what = 9;//设置消息变量
                            myHandler.sendMessage(msg);//插入消息队列
                        }
                    }
                };
            }
            if(timer != null && timerTask != null )
                timer.schedule(timerTask, 10, 100);//启动定时器,100ms进一次
        }
    
        //停止定时器
        private void stopTimer(){
            if (timer != null) {
                timer.cancel();
                timer = null;
            }
            if (timerTask != null) {
                timerTask.cancel();
                timerTask = null;
            }
        }

     然后我用电脑的网络调试助手测试的

     滑动进度条,大约100ms发送一次数据,如果这次数据和上次数据不一样的话

    而用8266测试的是

     就是说粘包挺严重的了,本来是7个数据......

     这个问题我有时间用ENC28J60测试下,当然源码都是公开的,大家发现有什么问题可以告知,感谢!

     

    咱再接着优化一个问题

    由于打开了PWM,所以这个无效了

     所以

     

     

     然后大家自己去测试哈,,,由于粘包问题,就是滑动进度条的时候不怎么好使,这个我再找找WIFI程序的问题

    https://www.cnblogs.com/yangfengwu/p/11427504.html

  • 相关阅读:
    xpath和lxml库
    pipenv和autoenv
    正则表达式
    requests库
    Photoshop学习笔记
    Firebug使用笔记
    JavaScript中的声明提升(Hoisting )
    JavaScript中的继承机制
    JavaScript中的instanceof原理详解
    JSP使用JSON传递数据,注意避免中文乱码
  • 原文地址:https://www.cnblogs.com/yangfengwu/p/11324411.html
Copyright © 2011-2022 走看看