Invio stringhe testo seriale

Scusate la domada forse banale ma è da poco che sto spippolando con questo splendido dispositivo....

ho due arduinoUNO con shield che ospita due muduli xbee correttamente configurati che dialogano via seriale però:

questo codice sul trasmettitore invia una stringa chiamata PING

#define button 2       
#define led  13               

int lettura = 0;
int letturaOld = 0;

void loop(){
   lettura = digitalRead(button);
   if(lettura == 1){
     digitalWrite(led, 1);
   }
   else {
    digitalWrite(led, 0);
   }
  if(lettura != letturaOld){
     Serial.print ("PING");
     letturaOld=lettura;
  }
   delay(100);
}

Mentre lato ricevitore ho seri problemi a far riconoscere la stringa PING in ingresso dato che all'atto della compilazione mi restituisce un errore dl tipo error: storage size of 'incoming' isn't known

char incoming[];

void setup() {
 pinMode(3,OUTPUT);
 Serial.begin(9600);

}

void loop() {
 if(Serial.available()>0) {
 incoming = Serial.read();
 if (incoming == "PING") digitalWrite(3,HIGH);
 else{
 	digitalWrite(3, LOW);
 }

 Serial.print('A'); //invio 'A' per indicare tutto ok
 }
 delay(10);
}

Sto imparando... grazie se qualcuno mi indica la strada...

… errore molto comune … se fai un po’ di ricerche sul forum troverai che se ne è parlato infinite volte e troverai anche degli esempi.

Il problema è che … NON leggete il reference … ]:smiley:

… la Serial.read() legge UN BYTE alla volta, non un array di caratteri ! Quindi, nel tuo loop, incoming riceve solo un BYTE e non puoi confrontarlo con un array di caratteri (… cosa che comunque non potresti fare). :wink:

Devi purtroppo costruire una routine che, legge carattere a carattere e mette in un array i vari caratteri che arrivano, attende un carattere di fine stringa (decidi tu cosa vuoi usare per terminatore … ad esempio il LF o il CR) per uscire dal loop di lettura e, solo a questo punto, richiamare qualche funzione per la comparazione di due array di caratteri …

Guglielmo

Edit : Ricorda che l’IDE ti permette di usare anche le funzioni di AVR Libc e quindi quelle definite in <string.h> tra cui la strcmp che serve a comparare due array di caratteri :wink:

Aggiornamento ...

... non avevo mai notato prima che la libreria Serial metta a disposizione una bella funzione : Serial.readBytesUntil()

Questa comoda funzione resta in ricezione sulla seriale fino a quando una qualsiasi delle seguenti condizioni non si verifica :

  1. si riceve un determinato carattere che indica il fine stringa

  2. si supera un determinato numero di caratteri

  3. si supera un tempo massimo di attesa (impostabile con la Serial.setTimeout() )

... veramente potente !!!

Guglielmo

Grazie Guglielmo ma come dicevo è da pochissimo che ci spippolo e la documentazione da leggere è tanta...
comunque ora ci lavoro, studio quello che hai scritto sperando di uscirci vivo.

Ciao
Franco

@Guglielmo, info aggiuntiva, ho anche dato una occhiata, si trova nella Stream.cpp e sfrutta la Stream::timedRead() che è implementata con la millis().

@nid : sicuro che non la confondi con la Stream.readBytesUntil() ??? perché esiste anche quella eh .... :wink:

Guglielmo

Edit : No, hai ragione, comunque è definita in Stream :slight_smile:

Però il Reference dice che è ereditata

Serial.readBytesUntil() inherits from the Stream utility class

A me sembra che abbiano la stessa “firma”

nid69ita:
@Guglielmo, info aggiuntiva, ho anche dato una occhiata, si trova nella Stream.cpp e sfrutta la Stream::timedRead() che è implementata con la millis().

Il fatto che sia implementata con millis cosa significa, nel flusso dello sketch?
Appena posso la provo, perché è un (mio) tipico problema nel ricomporre una stringa ricevuta in seriale. Ma mi viene il dubbio: millis è usato per contare il timeout o per attendere (...delay?...) una delle condizioni?

@ andreino : la parte che utilizza la millis() è sicuramente quella relativa al timeout ... e del resto è ovvio ... mica puoi usare per controllare il timeout una rotine bloccante come la delay() !!!

Comunque ... è sicuramente comoda, ma ... specie per chi inizia ... estremamente DISEDUCATIVA ...
... imparate a gestire la ricezione con i loop ed a capire cosa fate ... che poi vi torna utile per il futuro :wink:

Guglielmo

grazie Guglielmo

Si, con delay non intendevo propriamente LA funzione delay(), ma un blocco del flusso derivante dall'attesa di una delle condizioni.

La ricomposizione di una stringa da seriale (unitamente alla progettazione di un proprio protocollo) è una delle cose più tediose da fare in cpp! Io VB.nettista per estrazione e....abitudine :slight_smile: neanche so cos'è il byte :blush:, figuriamoci star lì a prenderli uno per uno! :wink: Però ora che l'ho vista, ci...spippolo XD un po'