2014-09-21 11 views
0

Tout d'abord, la configuration: beta Arduino IDE 1.5.7, Nano v3.0Arduino: Serial.find (char) ne fonctionne pas

En bref, mon objectif: utiliser Serial.find() pour attendre les deux normes EOL caractères (ASCII 13, CR et ASCII 10, NL) à trouver dans le tampon série, avant de passer au code suivant.

mon (problématique/raccourci) Code:

char charCr = 13; 
char charNl = 10; 

void loop(){ 
    do_stuff; 
    foo(); 
    do_other_stuff;} 

void foo() 
{ 
     while (true) 
     { 
      if (Serial.find(bar1) && Serial.find(bar2)) 
      { 
       break; // EOL characters found 
      } 
      delay(1); // wait to receive EOL 
     }; 
} 

OK, donc deux problèmes distincts avec ce qui se passe dans bar1 et bar2

Si le bars sont respectivement charCr et charNl alors le code ne compiler tout en se plaignant:

error: call of overloaded 'find(char&)' is ambiguous 
note: candidates are: 
In file included from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/HardwareSerial.h:29:0, 
from C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:221 

trouve une correspondance proche, qui, je, croire est la définition correcte de trouver, comme Serial inhereits à partir Stream

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Stream.h:59:8: note: bool Stream::find(char*) <near match> 
bool find(char *target); // reads data from the stream until the target string is found 

Mais alors plaint aussi que l'entrée char doit être un pointeur (char *):

C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Stream.h:59:8: note: no known conversion for argument 1 from 'char' to 'char*' 

La documentation que j'ai lu sur Serial.find() et Stream.find() suggère que char devrait pas être un pointeur, juste pour passer la valeur char. Indépendamment, si bar1 et bar2 sont référencés comme &charCr et &charNl le code compile bien, mais le conditionnel n'est jamais rencontré, et je sais que j'envoie les deux caractères EOL, comme confirmé par différents moyens et code de débogage.

Alors ... qu'est-ce qui ne va pas avec mon code?

+0

De commentaire: 'lit les données du flux jusqu'à ce que la cible se trouve STRING' ie. pas char, string, c'est pourquoi il demande des pointeurs. –

+0

oui, mais il dit aussi pour le type de données d'entrée "target: la chaîne à rechercher (char)" ... alors quelle serait la bonne syntaxe? et pourquoi, quand j'utilise l'opérateur de référence et ne le trouve-t-il pas? – brneuro

+0

Essayez-le - recherchez une chaîne CR/LF à terminaison nulle, voir si cela fonctionne. En cas de doute, suspectez la documentation, (surtout si je l'ai écrit :). –

Répondre

1

La documentation sur le site Web est trompeuse car ils disent chaîne mais le prototype de fonction est (char). Une chaîne est un tableau de caractères de longueur variable. Un char est un caractère unique. En cas de doute, pensez toujours à la déclaration de la fonction dans le fichier d'en-tête (.H). De Stream.h:

bool find(char *target); // reads data from the stream until the target string is found 
// returns true if target string is found, false if timed out (see setTimeout) 

bool find(char *target, size_t length); // reads data from the stream until the target string of given length is found 
// returns true if target string is found, false if timed out 

Avec ceux à l'esprit, il y a deux voies à suivre. Recherche simples caractères:

// method as you started - accepts terminators in either order 
char charCr = 13; 
char charNl = 10; 

if (Serial.find(&charCr, 1) && Serial.find(&charNl, 1)) 

ou forme chaîne:

char termseq1[] = {13, 10, 0}; 
char termseq2[] = {10, 13, 0}; 

if (Serial.find(termseq1) || Serial.find(termseq2)) 
+0

Ceci est vrai, également mentionné dans les commentaires à mon OP avec Martin James.Décevant à d'autres égards, cependant, parce que je crois que Serial.find() fonctionne d'une manière destructrice de mémoire tampon comme Serial.read(), et pas Serial.peek() ... J'espérais attendre l'EOL suite à un nombre entier Cela doit être reçu, puis utilisez Serial.parseInt() pour l'obtenir. Il semble que je vais devoir trouver une autre solution. Merci – brneuro

Questions connexes