L'envoi et la Réception de Données avec Android et Arduino

Je suis en train d'écrire une application Android qui permet d'envoyer et de recevoir des données en série et à partir d'une carte Arduino qui est relié par une Sur-The-Go (OTG) de l'adaptateur. Je suis l'aide de la usb-série-pour-android de la bibliothèque. Je suis en train de l'Arduino en sorte que si elle reçoit la chaîne "T", puis il envoie la chaîne de caractères "T" de retour. Android est mis en place afin qu'il fera de même, bien que si la variable de chaîne dataToSend n'est pas vide, alors il enverra la valeur de la avec le "T". En gros, je veux que ces deux pour envoyer des données d'avant en arrière. L'Arduino côté de ce projet fonctionne parfaitement, chaque fois qu'il reçoit des données qu'il enregistre tout sur une carte SD, et si il détecte le "T", il enverra un "T" sur le dos pour dire le Android, il peut envoyer de nouveau.

Voici mon code, désolé pour la longueur mais j'ai l'impression qu'il pourrait y avoir plusieurs endroits que pourrait être le problème:

public class MainActivity extends Activity {
private boolean canSend;
private boolean notInit; 
private String dataToSend; 
private UsbManager manager;
private SerialInputOutputManager serialIoManager; 
private static UsbSerialDriver sendDriver; 
private static UsbSerialDriver recDriver; 
private TextView outputText; 
private ExecutorService mExecutor = Executors.newSingleThreadExecutor(); 
private SerialInputOutputManager.Listener mListener = new    SerialInputOutputManager.Listener() {
@Override
public void onRunError(Exception e) {   }
@Override
public void onNewData(final byte[] data) {
MainActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
try {
MainActivity.this.updateReceivedData(data);
} catch (IOException e) { e.printStackTrace(); }
}
});
}
}; 
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
dataToSend = ""; 
notInit = true; 
canSend = true; 
outputText = (TextView) findViewById(R.id.textView1); 
}
@Override
protected void onPause() {
super.onPause();
stopIoManager();
if (recDriver != null) {
try {
recDriver.close();
} catch (IOException e) {
//Ignore.
}
recDriver = null;
}
finish();
}
@Override
protected void onResume() {
super.onResume();
manager = (UsbManager) getSystemService(Context.USB_SERVICE);
recDriver = UsbSerialProber.acquire(manager);
if (recDriver == null) {
} else {
try {
recDriver.open();
recDriver.setBaudRate(9600); 
} catch (IOException e) {
try {
recDriver.close();
} catch (IOException e2) {
//Ignore.
}
recDriver = null;
return;
}
recDriver.getClass().getSimpleName());
}
onDeviceStateChange();
}
private void stopIoManager() {
//Get UsbManager from Android.
manager = (UsbManager) getSystemService(Context.USB_SERVICE);
//Find the first available driver.
recDriver = UsbSerialProber.acquire(manager);
if (serialIoManager != null) {
Log.i("Device", "Stopping io manager ..");
serialIoManager.stop();
serialIoManager = null;
} else {
Log.d("Device", "recDriver NULL"); 
}
}
private void startIoManager() {
//Get UsbManager from Android.
manager = (UsbManager) getSystemService(Context.USB_SERVICE);
//Find the first available driver.
recDriver = UsbSerialProber.acquire(manager);
if (recDriver != null) {
Log.i("Device", "Starting io manager ..");
serialIoManager = new SerialInputOutputManager(recDriver, mListener);
mExecutor.submit(serialIoManager);
} else {
Log.d("Device", "recDriver NULL"); 
}
}
private void onDeviceStateChange() {
stopIoManager();
startIoManager();
}
protected void updateReceivedData(byte[] data) throws IOException {
//use the data
Log.d("Device", "is updating"); 
final String dataIn = HexDump.dumpHexString(data);
outputText.setText(dataIn); 
canSend = checkForSend(dataIn);
if (canSend) {
sendData(); 
}
}
private boolean checkForSend (String in) {
String cur; 
int len = in.length(); 
for (int i = 0; i < len; i++) {
cur = in.substring(i, i + 1); 
if (cur.equals("T")) {
return true; 
} 
}
return false; 
}
static void show(Context context, UsbSerialDriver driver) {
recDriver = driver;
final Intent intent = new Intent(context, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY);
context.startActivity(intent);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
//Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void requestSend(View v) {
dataToSend = "9375644603\n"; 
if (notInit) {
try {
sendData();
} catch (IOException e) {
e.printStackTrace();
} 
}
notInit = false; 
}
private void sendData() throws IOException {
//Get UsbManager from Android.
manager = (UsbManager) getSystemService(Context.USB_SERVICE);
//Find the first available driver.
sendDriver = UsbSerialProber.acquire(manager);
if (sendDriver != null) {
sendDriver.open();
try {
sendDriver.setBaudRate(9600);
dataToSend = "2345\n";   
if (!dataToSend.equals("")) {
byte [] byteToSend = dataToSend.getBytes(); 
sendDriver.write(byteToSend, 1000); 
}
dataToSend = ""; 
byte[] terminator = "T\n".getBytes();
sendDriver.write(terminator, 1000);
} catch (IOException e) {
//Deal with error.
} finally {
sendDriver.close();
} 
}
//Get UsbManager from Android.
manager = (UsbManager) getSystemService(Context.USB_SERVICE);
//Find the first available driver.
sendDriver = UsbSerialProber.acquire(manager);
}
}

Avis que je suis en train d'utiliser deux pilotes distincts avec la même I/O manager. Je ne suis pas sûr si cela doit nuire il. Je suis en mesure d'envoyer les données à l'Arduino, et l'Arduino TX led s'allume, donc je sais que quelque chose est envoyé. Le onNewData méthode est déclenchée lorsque la SerialInputOutputManager auditeur détecte les données entrantes est de ne jamais être couru. Donc j'en déduis que le pilote pour le gestionnaire de l'auditeur n'est pas initialisé correctement ou quelque chose.

Si quelqu'un a une meilleure méthode de discussion entre l'Androïde et l'Arduino via deux voies usb de série, s'il vous plaît laissez-moi savoir ce que c'est. J'ai eu beaucoup de mal à faire ce travail.

InformationsquelleAutor Craig | 2013-07-17