經過串口接收帶有標識符的數據方法

在作串口通訊過程當中,下位機向上位機發送的串口數據有時候須要帶有指定的標識符,便於上位機根據標識符判斷後續幾位數據是作什麼用的。也就是下位機和上位機約定數據幀的傳輸格式,便於在上位機將數據分離,固然這種數據幀格式能夠自定義。java

今天用arduino做爲下位機,模擬數據經過自定義格式發送數據幀,利用串口將數據幀發送到android上位機,上位機用java代碼實現數據提取,並在界面實時顯示接收數據,雖然是模擬數據經過串口發送,但在實際項目開發中,原理相通。python

如下是arduino代碼,經過設定定時器,當接收到android上位機發送的開始發送控制指令字符‘S’後,每10ms發送一組數據幀;當接收到中止發送控制指令字符‘T’後,即關閉定時器,中止發送數據幀。android

#include "MsTimer2.h"
char ch;
void timer_interrupt()//定時中斷函數,數據幀爲FF F9 XX XX,其中FF F9爲標識符,XX XX爲數據
{
 Serial1.write(0xff);
 Serial1.write(0xf9);
 Serial1.write(0x11+random(0,10));
 Serial1.write(0x22+random(0,10));
}
void setup()//初始化函數
{
 Serial1.begin(9600);//設定串口1波特率爲9600
 MsTimer2::set(10,timer_interrupt);//設置定時器,每10ms中斷一次
}
void loop()
{
 if(Serial1.available())
 {
  ch=Serial1.read();
  if(ch=='S')//當接收到字符'S'後,打開定時器
  {
   MsTimer2::start();
  }
  if(ch=='T')//當接收到子都'T'後,中止定時器
  {
   MsTimer2::stop();
  }
 }
}

對於android上位機,須要作的是讀取串口數據,從數據幀中提出來有用數據,爲了解決主UI阻塞問題,須要開啓一個子線程循環讀取串口數據幀,關鍵代碼以下。dom

class ReadThread extends Thread{
    Handler mHandler;
    ReadThread(Handler h) 
    {
        mHandler=h;
        this.setPriority(MAX_PRIORITY);//設置成最高優先級        
    }
    @Override
    public void run() {
        // TODO Auto-generated method stub
        super.run();
        byte[] start_PRESSURE={(byte)0xff,(byte)0xf9};//提取數據標識符
        byte[] tmp1=new byte[2];

        int readCount=0;
        int state=0;  
        int index=0;
        Message msg;

        bReadTheadEnable=true;//準備開啓線程讀數據
        while(true==bReadTheadEnable){
            try{
                Thread.sleep(10);//休眠10ms
             }
            catch(Exception e){
                e.printStackTrace();
             } 
            readCount=ftDev.getQueueStatus();//讀取緩衝區數據個數
            if(state==0)
             {
                if(readCount>2)//保證讀取緩衝區內至少有三個字節,方便內部讀取
                {
                    ftDev.read(tmp1,1);//讀取一個字節數據
                    if(tmp1[0]==start_PRESSURE[index])
                    {
                        index++;
                        if(index==start_PRESSURE.length)
                        {
                            ftDev.read(global_tmp2,2);//讀取兩個字節
                            index=0;
                            msg=mHandler.obtainMessage(GIVETHERESULT);//通知主UI更新
                            mHandler.sendMessage(msg);
                        }
                    }
                    else
                    {
                        index=0;
                    }
                }
             }            
           } 
        }
    }

在這裏循環讀取判斷串口數據的方法,不管是C,C++仍是python等語言,都很是適用,早先本身用python的pyserial模塊作串口數據提取是將數據轉化成字符串,好比12.34,而後前面加一個標識符D,再一位一位的判斷讀取和整合,這樣效率比較低,而且寫出來的代碼功能雖然實現了,但感受不爽。後來偶然在網上看到MJPEG數據格式提取程序片斷,認真分析了幾遍,感受這種數據提取方式很不錯,之後就爲己所用啦。ide

相關文章
相關標籤/搜索