2017-01-01 3 views
2

J'envoie via Bluetooth avec une application Android deux octets comme ceci:ne peut pas lire deux octets par Serial.read - Arduino

private void _sendCommand(byte command, byte arg) 
{ 
    if (CONNECTED) 
    { 
     try 
     { 
      os.write(new byte[]{command, arg}); 
      os.flush(); 

     } catch (IOException e) { 
      Log.e(TAG, "Error sending command: " + e.getMessage()); 

     } 
    } 
} 

Et c'est le code que je utilise pour les recevoir Arduino:

byte _instruction; 
byte _arg; 

void loop() 
{  
    while(Serial.available() < 2) 
    { 
    digitalWrite(LED_BUILTIN, HIGH); 
    } 

    digitalWrite(LED_BUILTIN, LOW); 

    _instruction = Serial.read(); 
    _arg = Serial.read(); 
    Serial.flush(); 

    switch (_instruction) 
    { 

    ... 

    } 
} 

Je n'ai pas de problème pour envoyer un seul octet (modifier le code pour recevoir un seul), mais je ne peux pas faire la même chose avec deux octets. Il est toujours coincé dans le while. Une idée de ce que je fais mal?

Merci,

+0

vous pouvez question de poster ici http://arduino.stackexchange.com/ pour les questions arduino –

+0

Il n'y a pas de boucle while côté envoi. Alors d'où parles-tu? – greenapps

+1

'os.write (nouveau byte [] {commande, argument});'. Pourquoi si compliqué? Pourquoi pas 'os.write (commande); os.write (arg); '? – greenapps

Répondre

0

J'ai finalement trouvé le problème avec l'aide de ST2000. Il y avait un problème de syncronisation entre l'expéditeur et le destinataire. Ce code fonctionne correctement:

void loop() 
{  
    // Wait until instruction byte has been received. 
    while (!Serial.available()); 
    // Instruction should be read. MSB is set to 1 
    _instruction = (short) Serial.read(); 

    if (_instruction & 0x80) 
    { 
    // Wait until arg byte has been received. 
    while (!Serial.available()); 
    // Read the argument. 
    _arg = (short) Serial.read(); 

    switch (_instruction) 
    { 
     ... 
    } 
    } 

    Serial.flush(); 
}