9-51單片機ESP8266學習-AT指令(單片機采集溫濕度數據通過8266發送給AndroidTCP客戶端顯示)


http://www.cnblogs.com/yangfengwu/p/8798512.html

 

補充:今天答應了一個朋友寫一下如果單片機發過的是字符串應該怎么解析,答應了今天寫,哦哦哦是明天了,閑話少說,趕緊寫

 

列如   DATA;T=25;H=33

len = inputStream.read(buf);//服務器斷開會返回-1
byte[] ReadBuffer0 = new byte[len];//存儲接收到的數據
for (int i = 0; i < len; i++) 
{
    ReadBuffer0[i] = buf[i];
}

要想處理字符串的當然要把數據變為字符串

String  DataString = new String(ReadBuffer0)

String  temp[] = DataString.split(";");
現在 temp[0] = "DATA"
temp[1] = "T=25"
temp[2] = "H=33"

要想再分離
String  temp1[] = temp[1]..split("=");
數據就出來了temp1[1] ="25"
有人會說這還是字符串哈...
記住高級語言幾乎提供了所有可能用到的方法
不知道用哪個方法,但是你要知道你要干什么
我就是想
十進制字符串  轉 10進制數
那就百度

 

有人會問,明明是android,為什么搜索的時候寫的java.......................................

android開發用的語言就是java,,,,,,一般方法類的問題我都是搜java   界面相關類的問題我都是搜android

所以

 

int t = Integer.valueOf(temp1[1], 10);

如果不對,怎么辦   再百度去

說一下,問自己問題的人一直很多,我更多的是告訴方法,而不直接告訴結論,因為怕把自己身邊的人慣壞了,有什么問題直接問我,然后我分分鍾解決了,沒什么意義,真正思考的是我而不是你了,這樣的話,學習能力很難得到提升.很多人佩服自己的學習能力,和實際解決問題的能力,是因為自己走的彎路比較多,沉淀的比較多,你必須對你所做的工作充滿熱愛,它才會讓你走的更遠....

 

先把源碼和資料鏈接放到這里

鏈接: https://pan.baidu.com/s/1jpHZjW_7pQKNfN9G4B6ZjA     密碼:nhn3 

 

先說一下那天的bug

所有的任務在啟動時都是新建

 

 

否則就會有問題

但是每次新建可能會產生有好幾個同樣的任務

 

列如上面的連接任務

咱們用一個全局的變量去記錄咱的連接任務

 

銷毀的時候

try {
       mthreadConnectService.interrupt();
    } catch (Exception e) {
       
    }

 

 發送數據的任務也是用一個全局變亮記錄

出現問題需要銷毀的時候

因為有好幾個地方要添加這幾句話,本來想.....算了,后期再說

現在做顯示部分,先給自己說一下,,,,下一篇一定要用Handle,如果還是這樣寫..都感覺無人子弟....唉......寫的有點害怕了,,,,應該先介紹

通常怎么操作控件的....這樣操作控件懂行的人不知道會不會....唉

現在界面再拖一個TextView用來顯示溫濕度數據

 

 

 再看一下規定的

 

 

 然后其實就是在接收數據里面

/**
     * 接收數據的任務
     * @author yang
     *
     */
    class ThreadReadData extends Thread
    {
        public void run()
        {
            while (threadReadDataFlage)
            {
                try 
                {
                    ReadBufferLengh = inputStream.read(ReadBuffer);//服務器斷開會返回-1
                    if (ReadBufferLengh == -1) 
                    {
                        threadSendDataFlage = false;//關掉發送任務,預防產生多的任務
                        threadReadDataFlage = false;//關掉接收任務,預防產生多的任務
                        try {mthreadReadData.interrupt();} catch (Exception e) {}
                        try {mthreadSendData.interrupt();} catch (Exception e) {}
                        SendDataCnt = 0;//清零發送的個數
                        ConnectFlage = true;
                        
                        
                        buttonConnect.post(new Runnable() {
                            @Override
                            public void run() {
                                buttonConnect.setText("連接");
                                Toast.makeText(getApplicationContext(), "與服務器斷開連接", 500).show();
                            }
                        });
                    }
                    
                    try //防止數據有其它錯誤
                    {
                        if ((ReadBuffer[0]&0xff) == 0xaa && (ReadBuffer[1]&0xff) == 0x55) 
                        {
                            if ((ReadBuffer[2]&0xff) == 0x01) {
                                textViewShowData.post(new Runnable() {//稍微寫一個靠譜點的操作UI控件
                                    public void run() {
                                        textViewShowData.setText("溫度:"+(ReadBuffer[3]&0xff)+"濕度"+(ReadBuffer[4]&0xff));
                                    }
                                });
                            }
                        }
                    } catch (Exception e) {
                        // TODO: handle exception
                    }
                    
                    
                } 
                catch (Exception e) 
                {
                    // TODO Auto-generated catch block
                    Log.e("error", ReadBufferLengh+"");
                    e.printStackTrace();
                    runOnUiThread(new Runnable() {//修改界面的UI最好用Handle,這里力求簡單,下幾節再用
                        public void run() {
                            buttonConnect.setText("連接");
                            Toast.makeText(getApplicationContext(), "與服務器斷開連接", 500).show();
                        }
                    });
                    ConnectFlage = true;
                    threadSendDataFlage = false;//關掉發送任務,預防產生多的任務
                    threadReadDataFlage = false;//關掉接收任務,預防產生多的任務
                    try {mthreadReadData.interrupt();} catch (Exception e1) {}
                    try {mthreadSendData.interrupt();} catch (Exception e2) {}
                    SendDataCnt = 0;//清零發送的個數
                }
            }
        }
    }

其實就一點有用的,其余的大多數是重復的程序,下一篇優化一下....

 

 可以用這個調試助手,老版的小五物聯有一些調試的功能

 

 

我是用的兩個手機哈,因為我做的那個調試助手,一關閉就會全都關閉了,,后期再優化下哈,,,,

親們可以用電腦的調試助手,資料里面有

 

好現在咱們用板子試一下

不對不對...咱是做的先發給板子指令然后板子收到命令再回復.....忘了,現在做每隔1S發送一次0xaa,0x55,0x01

 

 

這樣板子收到信息就回咱

實現定時器呢有多種實現方法,說一種最簡單的

/**
     * 每間隔1S發送一次采集數據的命令
     */
    private CountDownTimer editDeleteTimer = new CountDownTimer(1000,100) {
        @Override
        public void onTick(long millisUntilFinished) {
            
        }
        
        @Override
        public void onFinish() 
        {
            SendBuffer[0] = (byte) 0xaa;
            SendBuffer[1] = 0x55;
            SendBuffer[2] = 0x01;
            SendDataCnt = 3;//控制發送數據的個數
            editDeleteTimer.start();
        }
    };

啟動和停止呢

 

 現在試一下

板子上電正常運行哈...

 

 

剛才板子放在了我電腦的散熱口附近,所以才會30度哈,我沒有在非洲和赤道哈....,,電腦兩天沒有關機了,,有點小熱.....

現在控制一下燈

 

 下一篇一定要優化程序,不能這樣子了,,,,,,額嗯,做TCP服務的時候再優化也行,重新寫一切按照常規寫

 

 

 

單片機程序還是上一篇的...

對了

數據&0xff

參考鏈接

https://blog.csdn.net/wwzuizz/article/details/77649358

親們自己百度哈

下一篇鏈接

http://www.cnblogs.com/yangfengwu/p/8887909.html

 


免責聲明!

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



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