簡體   English   中英

Android藍牙Arduino

[英]Android Bluetooth Arduino

我目前正在嘗試使用Bluesmirf模塊從Arduino獲取數據到Android。

這是我的Arduino代碼。

void setup() {

 Serial.begin(115200);

}
void loop() {
   if(Serial.available()){
    char val = Serial.read();
    if(val == '.'){
          Serial.println("t1|x1|x2|x3|x4");
   } 
  }
 }

正如你所看到的,我只是在寫一個長字符串。 最終,該字符串將包含值。 如果我給arduino寫一個句點,它將返回這些值。 這是我的藍牙代碼,它非常類似於藍牙聊天示例中的代碼:

private class ConnectedThread extends Thread{
    private BluetoothSocket mmSocket;
    private InputStream mmInStream;
    private OutputStream mmOutStream;

    public ConnectedThread(BluetoothSocket socket) {
        // TODO Auto-generated constructor stub
        mmSocket = socket;
        InputStream tmpIn = null;
        OutputStream tmpOut = null;

        try {
            tmpIn = socket.getInputStream();
            tmpOut = socket.getOutputStream();
        } catch (Exception e) {
            // TODO: handle exception
        }
        mmInStream = tmpIn;
        mmOutStream = tmpOut;
    }

    public void run(){
        byte[] buffer = new byte[1024];
        int bytes;


        while(true){
            try {
                // Garbage collector necessary to prevent data loss
                System.gc();
                bytes = mmInStream.read(buffer);
                Log.d("Value of Output", new String(buffer, 0, bytes)) 

            } catch (IOException e) {
                e.printStackTrace();
                connectionLost();
            }

        }

    }

    public void write(byte[] buffer){
        try{
            mmOutStream.write(buffer);
        } catch(IOException e){
            Log.d("Write", "failed");
        }
    }

    public void cancel(){
        if (mmInStream != null) {
            try{mmInStream.close();}catch(Exception e){}
            mmInStream = null;
        }
        if (mmOutStream != null) {
            try{mmOutStream.close();} catch(Exception e){}
            mmOutStream = null;
        }

        if (mmSocket != null) {
            try{mmSocket.close();}catch(Exception e){}
            mmSocket = null;
        }
    }
}

我要提幾件事。 System.gc()就在那里,因為如果我不把它放在那里,我有時會得到錯誤的數據。 有時數據會丟失,有時會重復。

我遇到的問題是輸出返回多行。 所以在我的日志中我會得到類似的東西

輸出t1 | x1 | x的值

輸出2 | x3 | x4的值

而不是一切都在一條線上。 當我通過藍牙(藍牙加密狗)將arduino連接到計算機時,數據返回一行。 如何確保數據返回一行。

我可以嘗試在“緩沖區”中連接您的數據,並檢查此緩沖區是否有新的行/回車字符。 找到后,將數據設置為真實變量,清除緩沖區並重新開始。 這應該夠了吧。

希望能幫助到你! :)

好。 我遇到過同樣的問題。 為了解決這個問題,我使用了mDinput = new DataInputStream(mmInStream); ,然后是mDinput.readFully(dateBuffer, 0, sizeYouWant); 然后, readFully只有在它滿時才會返回緩沖區

希望這可以幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM