2013-07-15 46 views
0

我目前正面臨一個串口通信問題,這讓我難倒了幾天。一旦從Arduino TX'd讀取藍牙串行數據Android

該應用程序是一種個人RFID標籤庫存系統。最終目標是掃描RFID標籤並將其登錄到arduino FRAM中,並將標籤數據轉發到我正在製作的Android智能手機應用程序。作爲一個整體,我對Java和Android開發不熟悉,並且在讀取(RX)arduino正在寫入(TX)的串行數據時遇到問題。

我使用的是藍牙適配器(Bluesmirf,RN42調制解調器),配對和連接都很好。

我可以從Android手機上傳輸一個「刷新清單」切換,並且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的代碼有問題。

你必須看看的東西是,你的android代碼在什麼時候嘗試聽串行數據?看代碼,只有當調用nOptionsItemSelected時。所以到Arduino發回數據,藍牙模塊完成它們的工作,Android OS處理它並將數據提供給您的應用程序時,您的應用程序可能已經完成了在偵聽數據的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

謝謝你,在閱讀你的while循環解決方案時,它非常有意義。我以高得多的波特率接收了正確的數據(與9600相比115200bps),並且與您所描述的一致;沒有足夠的時間。再次感謝。 – user2585042