2013-07-15 5 views
0

Je suis actuellement confronté à un problème de communication série qui m'a fait perplexe depuis quelques jours maintenant. L'application est un type de système d'inventaire d'étiquette RFID personnel. L'objectif final est de balayer les étiquettes RFID et de les enregistrer dans la FRAM Arduino, et de relayer les données de l'étiquette à une application smartphone Android que je fais. Je suis nouveau dans le développement Java et Android dans son ensemble, et j'ai des problèmes pour lire (RX) les données série que l'Arduino écrit (TX). J'utilise un adaptateur bluetooth (Bluesmirf, RN42 modem), et l'appairage et la connectivité y sont tous bons.Lire des données série Bluetooth Android une fois TX'd d'Arduino

Je suis capable de transmettre à partir du téléphone android un "Refresh Inventory" bascule, et l'Arduino le reçoit en effet, comme il saute à la fonction AndroidRefresh(), comme peut être vu dans le code. Cependant, lorsque je tente d'écrire un test RFID, l'Android ne voit rien.

Je suis sûr à 80% que c'est un défaut dans mon code Android. Je pense que c'est un problème de "timing", car dès que le bouton "refresh Inventory" est activé sur Android, il envoie le "flag int" pour envoyer l'arduino dans AndroidRefresh(), et immédiatement dans les deux scripts, l'arduino écrit, et l'écoute Android. Je suis nouveau à la communication série, et je ne suis pas sûr si ces données disparaissent du tampon pour une raison quelconque?

Merci pour toute aide. Ça me rend fou.

Arduino Snippet:

#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 



} 

et l'activité Java Android:

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; 
    } 

    } 

} 

Répondre

0

Cela semble être un problème avec votre code Android.

La chose que vous devez examiner est, à quelle heure votre code android essaie-t-il d'écouter les données de série? En regardant le code, c'est seulement quand nOptionsItemSelected est appelée. Ainsi, au moment où l'Arduino envoie les données, et les modules Bluetooth font leur chose, et l'OS Android traite et donne les données à votre application, votre application peut avoir déjà fini d'exécuter votre code en nOptionsItemSelected qui écoute les données.

Une solution rapide à tester consiste simplement à mettre votre code lecture-série-données dans une boucle 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

Merci, lors de la lecture de votre solution de boucle tout, il est parfaitement logique. Je recevais des données correctes avec un débit en bauds beaucoup plus élevé (115200bps par rapport à 9600), et cela va de pair avec ce que vous avez décrit; ne pas avoir assez de temps. Merci encore. – user2585042

Questions connexes