Operazione molto semplice di Arduino Uno Serial.readString ()

Sono molto nuovo nella programmazione di Arduino. Sto cercando di identificare la stringa di input dal monitor seriale e di stampare loutput sulla console di conseguenza

Il codice è:

void setup() { Serial.begin(9600); } void loop() { while (Serial.available() > 0 ) { String str = Serial.readString(); if (str.equals("send")) { Serial.println("identified"); } else { Serial.println("unknown"); } } } 

Ogni volta che metti la stringa di invio che mostra “sconosciuto” come output, il che è sbagliato, e dovrei essere “identificato” come output. Qualcuno può guidarmi qui per ottenere il risultato.

Nota: sto ottenendo loutput come volevo usando la funzione readStringUntil ma le stringhe hanno molto “.” in esso, quindi non utile.

Commenti

  • qual è limpostazione di fine riga in Serial Monitor?
  • sia NL che CR.
  • quindi controlla " send / r / n "
  • Intendi \r\n non /r/n
  • Il problema quando si fa affidamento su cose come readString è che davvero non ' Non so cosa stanno facendo o come funzionano. Analizza manualmente i dati in arrivo in modo da sapere con cosa stai lavorando.

Rispondi

Se imposti la riga del tuo monitor seriale che termina con “Both NL & CR”, questo codice troverà la parola “invia”. NON troverà la parola “invia” in questa stringa, “ssend” o in questa stringa, “sendd”.

void setup(){ Serial.begin(9600); } void loop(){ while(Serial.available() > 0 ){ String str = Serial.readString(); if(str.substring(0) == "send\r\n"){ Serial.println("identified");} else{ Serial.println("unknown"); } } } 

Se desideri trovare la stringa “send” in “1234send” o “send1234” o “1234send5678” quindi utilizza indexOf ();

void setup(){ Serial.begin(9600); } void loop(){ while(Serial.available() > 0 ){ String str = Serial.readString(); if(str.indexOf("send") > -1){ Serial.println("identified");} else{ Serial.println("unknown"); } } } 

Answer

Ci sono qualsiasi numero di motivi per cui il test * .equals è falso. Considera la differenza tra maiuscole e minuscole o caratteri aggiuntivi introdotti dalla fonte delle tue comunicazioni. Anche i caratteri non stampabili possono rappresentare un problema e far fallire il test.

Considera lutilizzo * .substring () . Questo metodo restituirà true se viene trovata la sottostringa. Ad esempio:

 String stringOne = "12345 send 1234"; // substring(index) looks for the substring from the index position to the end: if (stringOne.substring(0) == "send") { Serial.println("identified"); } else { Serial.println("unknown"); } 

… dovrebbe sempre restituire “identificato” perché i caratteri “s”, “e”, “n” e “d” si trovano nella sequenza corretta allinterno della stringa stringOne.

Commenti

  • String str = Serial.readString (); if (str.substring (0) == " send ") Serial.println (" identificato "); else Serial.println (" sconosciuto "); questo non ha funzionato nemmeno.
  • Strano. Hai esaminato la pagina Web collegata per assicurarti di utilizzare correttamente la sottostringa? ( Questa pagina web? ). Inoltre, dai commenti ho visto che hai stampato la stringa ricevuta e hai visto " send " nel messaggio ricevuto, corretta? Potresti semplicemente commentare la riga di lettura seriale e provare a utilizzare " String str = " 12345 invia 1234 "; " per verificare se tutto funziona. A giudicare da altri commenti potresti provare rapidamente a inviare (digitando) " spazio " + " invia " + " spazio " (" invia ") per vedere se funziona.
  • Questo ' non funzionerà. sottostringa (n) restituisce solo la parte della stringa che inizia alla posizione n. Quindi la sottostringa (0) restituisce solo una copia della stringa. str.substring (0,4) restituirà i primi 4 caratteri della stringa (supponendo che ci siano almeno 4 caratteri da restituire – Io ' non ho abbastanza familiarità con questa implementazione per sapere cosa lo fa per una stringa più breve – C # genererebbe uneccezione).

Risposta

void setup() { Serial.begin(9600); } void loop() { char inChar[5]; if(Serial.available() > 0 ) { for (int i=0; i<5; i++) { inChar[i] = Serial.read(); delay(10); } if (inChar[0] == "s" && inChar[1] == "e" \ && inChar[2] == "n" \ && inChar[3] == "d") { Serial.println("identified"); } else { Serial.println("unknown"); } } } 

Commenti

  • Lettura della stringa " send " usare il comando Serial.readString () va bene. Ma in qualche modo non funzionerà se utilizzi il risultato per il confronto (ad esempio data == " send " …). Una possibile soluzione è usare un array di caratteri (ad esempio inChar [5]). La dimensione dellarray è 1 in più rispetto al numero massimo di caratteri necessari.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *