7
votes

Arduino ne peut pas lire la série correctement

D'accord, j'ai googlé avec une chaîne de série avec Arduino et je n'ai eu aucune chance même de copier et de coller des exemples.

J'essaie d'obtenir une chaîne de la série. Voici mon code: xxx

et il imite le caractère par caractère.

J'ai également essayé xxx < p> et il renvoie 1 caractère à la fois (série.Print (inbyte) donne -1 tous les autres temps). Pourquoi la série se divise-t-elle chaque caractère?

si j'entre 'hello' et j'appelle Serial.Lead () Cela donne un personnage alors dit qu'il n'y a rien, alors donne un autre caractère et dit qu'il n'y a rien.


1 commentaires

Les ports série sont très lents. Vous obtenez généralement un octet à la fois, alors rien pendant un moment. Vous devrez faire face à cela dans votre code, vous ne le faites pas maintenant.


6 Réponses :


2
votes

Je n'ai pas accès aux fichiers source Arduino ici, mais la ligne de code suivante ne vous donnera pas une chaîne complète pour des raisons évidentes (laissez-moi savoir si ce n'est pas si évident):

Serial.println()


0 commentaires

0
votes

Il existe un délai lors du transfert de données via UART. Essayez avec Serial.TimeDreadlead () à la place. Le code est comme ci-dessous.

void setup() {
    Serial.begin(9600);
    Serial.write("Power On");
}

void loop()
{
    while(!Serial.available());

    while (true) {
      int byte = Serial.timedRead();
      if(byte == -1)
         break;
      Serial.write(byte);
    }
    Serial.println();
}


0 commentaires

12
votes

Je l'ai compris.

Lorsque vous ouvrez une série de série avec 9600 bauds ( série.begin (9600); code>), c'est la lecture / écriture à 9600 octets par seconde. Cela signifie au plus vite il peut atteindre un peu moins de 10 octets par milliseconde. Je ne sais pas quelle est la vitesse de fonctionnement, mais il semble que l'Arduino soit alerté et lit le premier octet avant que la seconde arrivée. Donc, vous devez ajouter un délai (1) code> pour "attendre" pour un autre octet dans le "même flux" pour arriver. P>

String read() {
    while (!Serial.available()); //wait for user input
    //there is something in the buffer now
    String str = "";
    while (Serial.available()) {
        str += (char) Serial.read();
        delay(1); //wait for the next byte, if after this nothing has arrived it means the text was not part of the same stream entered by the user
    }
    return str;
}


0 commentaires

1
votes

Même si ce poste est vieux, je posterai ma réponse au cas où une personne est google ici.

Pour lire des chaînes de la série, vous pouvez utiliser ce qui suit: p>

String str;

while (Serial.available() > 0) {
    str = Serial.readString();
}


0 commentaires

-3
votes
String str;

void setup()
{
    Serial.begin(9600);
}

void loop ()
{
    while (Serial.available() > 0){
        char c = Serial.read();
        str.concat(c);
        if (Serial.available() == 0)
        {
            Serial.print(str);
            str = "";
            break;
        }
    }
}

0 commentaires

0
votes

J'ai écrit ce répéteur de message complet Serial Serial. Il ne nécessite pas d'objet code> chaîne code> ou de tout type de retard que dans les réponses précédentes.

Comment ça marche strong>

Il reçoit des caractères et les stocke à tampon jusqu'à la fin du caractère \ n code> ou \ 0 code> est reçu. Ensuite, il imprime l'ensemble du tampon. P>

Il existe également une vérification de débordement de tampon mis en œuvre, de sorte que vous ne perdiez aucune donnée. P>

L'avantage principal de cette solution est la vitesse et la possibilité Pour réagir au contenu du message, même avant la fin de la procédure de lecture complète (par exemple, vous pouvez implémenter un analyseur de message sur cette très facilement). P>

#define LENGTH 20

void setup() {
  Serial.begin(9600);
  Serial.println("Ready to read");
}

void loop() {
  if (Serial.available()) {
    char buffer[LENGTH];
    int index = 0;
    bool receiving = true;
    
    while (receiving) {
      if (Serial.available()) {
        char ch = Serial.read();
        if (ch == '\n' || ch == '\0') {
          buffer[index] = '\0';
          receiving = false;
        } else {
          buffer[index++] = ch;
          if (index == LENGTH) {
            buffer[index] = '\0';
            break;
          }
        }
      }
    }

    Serial.println(buffer);
  }
}


0 commentaires