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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM