dubbio su serial.read

Ciao a tutti… io stavo giocando con il seguente codice su arduino DUE:

int incomingByte = 0;   // for incoming serial data

void setup() {
        Serial.begin(9600);     // opens serial port, sets data rate to 9600 bps
}

void loop() {

        // send data only when you receive data:
        if (Serial.available() > 0) {
                // read the incoming byte:
                incomingByte = Serial.read();

                // say what you got:
                Serial.print("I received: ");
                Serial.println(incomingByte, DEC);
        }
}

Il codice in questione, presente nella guida ufficiale, serve a leggere la seriale e stampare ciò che l’arduino ha ricevuto…

io dal pc, via terminale, invio una stringa all’arduino:

echo "ciao">/dev/ttyACM0

ottendendo così sulla seriale dell’arduino:

I received: 99
I received: 105
I received: 97
I received: 111
I received: 10

come mai ottengo tanti output anche se la stringa era una?? (tra l’altro diversi tra loro)… come posso stampare la stringa corretta anziché il relativo valore decimale?

vi ringrazio in anticipo

Ciao, il problema è molto semplice e ... ti bastava leggere il reference della Serial.read() per capirlo ... XD

La funzione Serial.read() legge UNO ed UN SOLO byte dalla porta seriale e te lo ritorna ... STOP.

Per fare quello che vuoi fare tu, devi: implementare un loop, leggere carattere a carattere fino a quando non ricevi un terminatore della stringa che ti viene trasmessa (es. il CR), depositare ogni singolo byte in un array di char, terminare la stringa ricevuta con il carattere standard terminatore di stringa 0x00 e finalmente stamparla tutta assieme :grin:

Questo se vuoi capire come funziona ed essere in grado, in futuro di affrontare questo problema con qualunque tipo di dati in arrivo e ... su qualunque MCU.

Se invece vuoi la "pappa fatta" ... beh ... QUI ce l'hai bella che pronta :~

Guglielmo

P.S. : Per i formati in cui la print può stampare un valore ... vedi QUI

Tu leggi sempre un carattere della stringa e poi con Serial.println(incomingByte, DEC); stampi il valore decimale del ashii del carattere. http://www.asciitable.com/ Se vuoi stampare il carattere trasmesso devi usare serial.write(incomingByte); http://arduino.cc/en/Serial/Write

Ciao Uwe

Vi ringrazio per le dritte...

ho risolto con

char serialData[16];
String a;
void setup() {
        Serial.begin(9600);
        Serial.readBytesUntil('\0', serialData, 15);
}

void loop() {
  if (Serial.available() > 0) {
  Serial.readBytesUntil('\0', serialData, 15);
  Serial.print(serialData);

}
}