Client.read () e string

Ciao a tutti

Io devo andare a leggere quello che arriva su arduino collegato in rete tramite Ethernet Shield e faccio così:

while (client.available()) 

                                 { 
                word c = client.read();
                                 Serial.println(c,HEX);
                                 }

sul monitor seriale mi trovo dei valori così:

68
E
1A
1
0
0
64
1
6
0
FF
FF
0
0
0
14

Come posso fare per associare una variabile ad ogni valore ?

L'associazione la puoi fare con un vettore precedentemente dichiarato . Ti serve sapere quanti sono i dati in arrivo per dimensionare il vettore.

Di quanti valori parliamo?

Sono 16 Valori

Quindi dovrei fare un char array[15] giusto ?

Però non so proprio come assegnare i valori in automatico

dimare_gabriele: Quindi dovrei fare un char array[15] giusto ?

Però non so proprio come assegnare i valori in automatico

Devi avere una variabile che fa da "contatore", esempio int Index=0; Ogni volta che ricevi un dato, lo scrivi nel vettore vet[Index]=dato letto; e subito aumenti l'indice di 1 Index++;

Un char di 16 elementi, con indice che va da 0 a 15.

Stai sbagliando tutto.

Principalmente perchè non hai chiaro cosè un header http, il tuo "char c" legge tutta sta roba anche se non la vedi http://en.wikipedia.org/wiki/List_of_HTTP_header_fields

dove arrivano questi char a seconda dei casi ... un esempio di header

GET /tutorials/other/top-20-mysql-best-practices/ HTTP/1.1 Host: 192.168.1.100:8080 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729) Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8 Accept-Language: en-us,en;q=0.5 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Cookie: PHPSESSID=r2t5uvjq435r4q7ib3vtdjq120 Pragma: no-cache Cache-Control: no-cache

quindi intanto dovresti sapere quali di questi pezzi vuoi avere, vuoi leggere una GET?, un POST?. Gli header non hanno mai la stessa quantità di char, ogni volta cambia nel suo insieme.

Dovresti essere più chiaro e spiegare meglio cosa vuoi fare

perchè li stampi in HEX? Serial.println(c,HEX);

Sto cercando di usare arduino come slave del protocollo IEC 60870-5-104

Ho chiaro cos'è un header http.. e con arduino io leggo solo quei valori, ovvero ciò che riceve dal master (pc).

Li stampo in Hex perchè il protocollo è in esadecimale.

Se scrivi solo questo

while (client.available()) 
        { 
  word c = client.read();
          Serial.println(c,HEX);
         }

come facciamo a sapere che ti riferisci ad un protocollo diverso dal tcp/ip, qui è scontato, hanno solo chiesto questo fino ad oggi. Magari un titolo tipo "Slave IEC 60870-5-104 Client.read e String" ...

comunque è una connessione ethernet e ci sarà prima del solo trasferimento dati una negoziazione (chi sei, che protocollo usi, mettiamoci daccordo ...), insomma una serie di char che non ti servono all'inizio.

se carichi i primi 16 valori nell'array a prescindere ti ritroverai anche quelli che non ti interessano nella prima richiesta di connessione dovrai fare una distinzione o colleghi il cavo di rete e hai solo quei 16 char fin da subito?

Se non devi fare distinzioni e i dati sono sempre quelli allora nulla, il metodo te l'hanno già detto. ciao

si scusate.. Comunque la lunghezza dei dati non è sempre 16.. il primo dato ricevuto è 68 4 700 poi arrivano i dati lunghi 16 caratteri.. Quindi forse più che fare un array, bisogna leggere come una stringa

Prova a fare una cosa tipo

String readString;

while (client.available()) 
{ 
    word c = client.read();
    readString += c;
    readString += ";";
    Serial.print(c,HEX);
    
     if (c == '\n') {
      Serial.print(readString);
       
       //elabori qui la stringa ottenuta e poi la svuoti
       ...
       ...
       ...
       readString="";
     }
}

non sappiamo se il protocollo ti invia un char dati tipo '\n' ma ci sarà qualcosa alla fine o tra un dato e l'altro

dovresti ottenere una linea tipo 68;4;700;68;E;1A;1;0;0;64;1;6;0;FF;FF;0;0;0;14;\n

poi fai uno split

Ho provato il codice che mi hai detto tu e ottengo questo :

68684477000000 al posto di 68 4 7 0 0 0

6868444343000000 al posto di 68 4 43 0 0 0

Come se scrivesse doppio..

Se io invece scrivo cosi

word c = client.read();
                                 Serial.println(c,HEX);

Mi stampa i caratteri separati in verticale.. il problema è proprio capire la fine di un messaggio !

Se io tolgo la condizione == '\n' funziona... si vede che non è quello il carattere giusto...

in effetti no, non lo vede perchè ho sbagliato io, tu stai leggendo un word c io lo stavo confrontando con un char è ovvio che non lo trovava

prova un attimo a mettere char c = client.read(); e ricercare uno \n o uno \r perchè comunque sia sono byte quelli che invia il tuo dispositivo, cos'è un PLC?

allora ho fatto delle prove..

se io dichiaro c come char, e stampo ciò che arriva convertito in HEX, stampa corretto, ( a parte il fatto che mi scrive delle FF in più) ma gli IF non funzionano

se invece non converto c in HEX, stampa delle lettere a caso, tipo h,y,d,6,8 ecc... ma se io faccio un if tipo c =='d' lo riconosce

comunque, '\n' o '\r' non li vede proprio

Per ora sto usando un simulatore di protocollo installato sul pc

Riapro questa discussione perchè ho ripreso il progetto ma non ho ancora trovato una soluzione

resto a disposizione per chiarimenti