2013-07-15 2 views
0

В настоящее время я столкнулся с проблемой последовательного общения, которая заставила меня застопориться в течение нескольких дней.Чтение данных Bluetooth Serial Data Android после TX'd от Arduino

Приложение - это тип персональной системы инвентаризации тегов RFID. Конечная цель - сканировать метки RFID и записывать их в FRAM arduino, а также передавать данные тегов на приложение Android-смартфона, которое я делаю. Я новичок в разработке Java и Android в целом, и у меня возникают проблемы с чтением (RX) последовательных данных, которые arduino пишет (TX).

Я использую адаптер bluetooth (Bluesmirf, модем RN42), и все это хорошо сочетается и соединяется.

Я могу передать с телефона Android телефон «Refresh Inventory», и Arduino действительно получает его, поскольку он перескакивает на функцию AndroidRefresh(), как видно из кода. Однако, когда я пытаюсь написать тестовый тег RFID, Android ничего не видит.

Я на 80% уверен, что это ошибка в моем Android-коде. Я думаю, что, возможно, это проблема «времени», потому что, как только кнопка «Обновить инвентарь» переключается на Android, она отправляет «флаг int» для отправки arduino в AndroidRefresh() и сразу в обоих сценариях, пишет arduino, и Android слушает. Я новичок в последовательной связи, и я не уверен, что эти данные почему-то исчезли из буфера?

Спасибо за любую помощь. Это сводит меня с ума.

Arduino Отрывок:

#include <SoftwareSerial.h> 
#include <EEPROM.h> 
#include <avr/interrupt.h> 
#include <avr/io.h> 

//setup serial for RFID reader 
#define rxPin 3 
#define txPin 2 
SoftwareSerial rfserial = SoftwareSerial(rxPin, txPin); 

//seek command 0x82 
byte SeekCard[] = {0xFF,0x00,0x01,0x82,0x83}; 
byte value; 
int k; 
char incomingChar; 
long convert = 0; 

void setup() 
    { 

    //set the Serial monitor to preferred baud rate 
    Serial.begin(9600); 
    //RFID reader is defaulted to 19200 baud rate 
    rfserial.begin(19200); 
    // for (int i =0; i< 7; i++){ 


       // convert = convert + test[i]; 
        //Serial.println(convert, DEC); 
       // delay(100); 

      // } 

    } 



void loop() 
{ 

    //find a tag 
    if (rfserial.available() > 0){ 
    SeekTag(); 
    } 

    if (Serial.available() > 0){ 
    androidRefresh(); // Refresh Inventory 
    while(Serial.available()>0) Serial.read(); //CLEARS RX BUFFER 

    } 
} 

void SeekTag(){ 
// Do RFID stuff 
} 

void androidRefresh() 
{ 
    //*************receiving a message from Android and printing on Arduino************************* 
       byte test[] = {0xFF,0x00,0x01,0x82,0x83, 0xFC, 0x64, 0xD0, 0x82,0x83, 0xFF}; 
       //Serial.println("Refreshing Inventory..."); 


       for (int i =0; i< 11; i++){     
       Serial.write(test[i]); 
       Serial.println(test[i]); 
       // Serial.println(test[i], HEX); 
       } 

       //while(Serial.available()>0) Serial.read(); //CLEARS RX BUFFER 



} 

И активность Android Java:

public class InventoryActivity extends Activity { 

    /** Bluetooth Variables **/ 

    private static BluetoothSocket mbtSocket; 
    private static InputStream mbtInputStream; 
    private static OutputStream mbtOutputStream; 

    private static final String TAG = "SmartFridge"; //Debug 
    private static final boolean D = true;   // Debug 

    OutputStream tmpOut = null; 
    OutputStream mmOutStream = null;  
    InputStream tmpIn = null; 
    InputStream mmInStream = null; 
    byte[] buffer = new byte[1024];; // buffer store for the stream 
    int bytes; // bytes returned from read() 
    int numberofbytes = 0; 










    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.inventory); 


    final ListView listview = (ListView) findViewById(R.id.listview); 
    String[] values = new String[] { "Item 1 from Arduino", 
             "Item 2 from Arduino", 
             "Item 3 from Arduino", 
             "Item 4 from Arduino", 
             "Item 5 from Arduino", 
             "and the beat goes on"}; 

    final ArrayList<String> list = new ArrayList<String>(); 
    for (int i = 0; i < values.length; ++i) { 
     list.add(values[i]); 
    } 
    final StableArrayAdapter adapter = new StableArrayAdapter(this, 
     android.R.layout.simple_list_item_1, list); 
    listview.setAdapter(adapter); 


    } 



    // Menu Stuff 

     // Initiating Menu XML file (menu.xml) 
     @Override 
     public boolean onCreateOptionsMenu(Menu menu) 
     { 
      MenuInflater menuInflater = getMenuInflater(); 
      menuInflater.inflate(R.menu.inventory_menu, menu); 
      return true; 
     } 

     /** 
     * Event Handling for Individual menu item selected 
     * Identify single menu item by it's id 
     * */ 
     @Override 
     public boolean onOptionsItemSelected(MenuItem item) 
     { 

      switch (item.getItemId()) 
      { 

      case R.id.menu_search: 
       Toast.makeText(InventoryActivity.this, "Refreshing...", Toast.LENGTH_SHORT).show(); 

       {  
        // As suggested by http://developer.android.com/guide/topics/connectivity/bluetooth.html 

        mbtSocket = btWrapper.getSocket();     


        try { 
         tmpOut = mbtSocket.getOutputStream(); 
         tmpIn = mbtSocket.getInputStream(); 
         if(D) Log.e(TAG, "Test 1"); 
        } catch (IOException e1) { }     
        mmOutStream = tmpOut; 
        mmInStream = tmpIn; 
        if(D) Log.e(TAG, "Test 2"); 
        try {      
           mmOutStream.write(600); // Can be anything, only UI request is to send FRAM contents from Arduino once toggled on phone 
           if(D) Log.e(TAG, "Serial Message Sent to Arduino for Refresh"); 


        } 
        catch(Exception e) {} 


       } 
       /** Read Bluetooth Stuff **/ 

       // Read from the InputStream 
       try { 
         numberofbytes = mmInStream.available(); 
         if(D) Log.e(TAG, numberofbytes + " bytes ready to read"); 
         if(mmInStream.available() > 0) 
         { 
          bytes = mmInStream.read(buffer); 
          if(D) Log.e(TAG, "Received Data from Arduino"); 
          if(D) Log.e(TAG, "Received:" + bytes); 
         } 



       } catch (IOException e) { 
        if(D) Log.e(TAG, "Did not receive data from Arduino"); 
       } 

       /** End Read Bluetooth Stuff **/ 



       return true; 


      default: 
       return super.onOptionsItemSelected(item); 
      } 
     } 


    //End Menu STuff 

    private class StableArrayAdapter extends ArrayAdapter<String> { 

    HashMap<String, Integer> mIdMap = new HashMap<String, Integer>(); 

    public StableArrayAdapter(Context context, int textViewResourceId, 
     List<String> objects) { 
     super(context, textViewResourceId, objects); 
     for (int i = 0; i < objects.size(); ++i) { 
     mIdMap.put(objects.get(i), i); 
     } 
    } 

    @Override 
    public long getItemId(int position) { 
     String item = getItem(position); 
     return mIdMap.get(item); 
    } 

    @Override 
    public boolean hasStableIds() { 
     return true; 
    } 

    } 

} 

ответ

0

Это, как представляется, проблема с андроида кодом.

Что вы должны изучить, в какое время ваш код Android пытается прослушать последовательные данные? Глядя на код, он вызывается только тогда, когда вызывается nOptionsItemSelected. Таким образом, к тому времени, когда Arduino отправляет данные назад, а модули bluetooth выполняют свою работу, а ОС Android обрабатывает его и передает данные вашему приложению, ваше приложение, возможно, уже закончило запуск вашего кода в nOptionsItemSelected, который прослушивает данные.

Быстрое исправление для проверки заключается в том, чтобы просто ввести код чтения-последовательного ввода в цикл while.

while(True){ 
try { 
        numberofbytes = mmInStream.available(); 
        if(D) Log.e(TAG, numberofbytes + " bytes ready to read"); 
        if(mmInStream.available() > 0) 
        { 
         bytes = mmInStream.read(buffer); 
         if(D) Log.e(TAG, "Received Data from Arduino"); 
         if(D) Log.e(TAG, "Received:" + bytes); 
        } 



      } catch (IOException e) { 
       if(D) Log.e(TAG, "Did not receive data from Arduino"); 
      } 
} 
+0

Благодарим вас, прочитав ваше решение в течение всего цикла, имеет смысл. Я получал правильные данные с гораздо более высокой скоростью передачи (115200 бит/с по сравнению с 9600), и он идет рука об руку с тем, что вы описали; не имея достаточно времени. Еще раз спасибо. – user2585042