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