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