2013-08-21 4 views
0

В настоящее время я пытаюсь получить данные от Arduino до Android с помощью модуля Bluesmirf.Android Bluetooth Arduino

Вот мой код для Arduino.

void setup() { 

Serial.begin(115200); 

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

Как вы можете видеть, я просто пишу длинную строку. В конце концов строка будет содержать значения. Если я напишу период ардуину, он вернет эти значения. Вот мой код Bluetooth, очень похожий на тот, который показан в примере Bluetooth Chat:

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 | х

значение Выход 2 | x3 | x4

Вместо него все в одной строке. Когда я подключаю arduino к компьютеру через Bluetooth (bluetooth dongle), данные возвращаются в одну строку. Как я могу обеспечить, чтобы данные возвращались в одну строку.

+0

У меня было подобные проблемы, используя BluetoothChat пример, Arduino и модуль Bluegiga WT32. У меня такое чувство, что это проблема на стороне Android. – user2461391

ответ

1

Ну. Я была такая же проблема. Чтобы решить эту проблему, я использовал mDinput = new DataInputStream(mmInStream);, затем mDinput.readFully(dateBuffer, 0, sizeYouWant);. Затем readFully вернет вам буфер только тогда, когда она полна

Надеются, что это помогает

+0

Это отличное решение. Благодаря! Первые несколько строк данных, которые возвращаются, становятся бесполезными, но я могу просто сказать программе игнорировать первые несколько строк данных. – piyushg91

1

Я могу попытаться объединить ваши данные в «буфер» и проверить этот буфер для нового символа возврата строки/каретки. Как только он будет найден, вы привязываете данные к вашей реальной переменной, очищаете буфер и начинаете все заново. Это должно сделать трюк.

Надеюсь, это поможет! :)

Смежные вопросы