Go Down

Topic: Non riesco a leggere una stringa da seriale .....RISOLTO!!!! (Read 2 times) previous topic - next topic

leo72

Se il problema è salvare e manipolare dati di cui non si conosce la dimensione, può venire in aiuto l'oggetto String che, a differenza degli array di char, è modificabile quindi può aggiungere elementi man mano che arrivano dal canale di input.
http://arduino.cc/en/Reference/StringObject

astrobeed


Non riesco a leggere un stringa dalla seriale come vorrei io..
cioè sto cercando di mettere in un vettore di char la stringa che invio dalla seriale .. per il processamento successivo.
cioè se invio "ABCDEFGHIL" (senza gli apici) e fisso la lunghezza del vettore a 4, vorrei avere questo
stringa(0) ---> A
stringa(1) ---> B
stringa(2) ---> C
stringa(3) ---> D


Ti sei spiegato malissimo, però se ho capito realmente il tuo problema devi estrarre i dati dalle sentenze NMEA del gps, per fare questo ti serve un parser, se è realmente per il gps esistono librerie per Arduino pronte all'uso.

Paolo S

Chiedo scusa ma ieri è successo un piccolo problema dopo che ho insrito mezzo post.... è mancata l'energia elettrica, poi non c'era collegamento, posi sono dovuto uscire e sono rientrato tardissimo.. quindi in realtà ho postato solo metà della descrizione...

e vi ringrazio anche per esserevi trattenuti negli improperi ....

adesso l'ho corretto ed all'incirca si dovrebbe leggere tutta la descrizione del problema che cerco di riassumere anche qui ..

il problema consiste nel mettere in un array di char (voglio fare così.. non con una stringa) ... i primi n caratteri ricevuti dalla seriale e svuotare i caratteri che eventualmente ancora ci fossero in attesa di essere letti ...


il primo schetc funziona, finche ci sono anche le righe di serial.print che uso per il debug ... nel secondo script, dove cancello una riga di debug .. non funziona più..... ci sono sopra due giorni e non trovo soluzione .. porka miseria!!!!!

... se per esempio, digito la seguente stringa "abcdefghilmno"  mi da questo output

 
Code: [Select]
dopo do ---------------------

  VUOTA il BUFFER: eliminati:
    ---------------------

INIZIO VETTORE MEMORIZZATO
index:5
k=0    97    a
k=1    98    b
k=2    99    c
k=3    100    d
k=4    101    e
FINE VETTORE MEMORIZZATO



   dopo do ---------------------

  VUOTA il BUFFER: eliminati:mno
    ---------------------

INIZIO VETTORE MEMORIZZATO
index:5
k=0    102    f
k=1    103    g
k=2    104    h
k=3    105    i
k=4    108    l
FINE VETTORE MEMORIZZATO

cioè il vettore alla fine contiene "fghil" anzichè i primi 5 caratteri "abcde"

invece di quello corretto che dovrebbe essere questo
Code: [Select]

97    index:0
98    index:1
99    index:2
100    index:3
101    index:4
   dopo do ---------------------

  VUOTA il BUFFER: eliminati:fghilmno
    ---------------------

INIZIO VETTORE MEMORIZZATO
index:5
k=0    97    a
k=1    98    b
k=2    99    c
k=3    100    d
k=4    101    e
FINE VETTORE MEMORIZZATO

con il vettore che, correttamemte, alla fine contiene solo i primi 5 caratteri ....

credo di essere stato maggiormente chiaro ... saluti ciao

leo72

A parte che il codice è scritto un po' male.... si mette in genere una istruzione per riga, la "riga" che tu elimini in realtà sono più istruzioni.... poi gli spazi tra la fine di una istruzione ed il ";" di fine riga proprio non si possono vedere  :smiley-sweat:
Poi c'è un controllo che non capisco.
fineLettura = ( (index >= dimVettore) || (millis() - count > countMax));

Fatto così, che senso ha? Carichi millis subito prima del check. Quella parte lì sarà sempre false finché ricevi caratteri. Sarà sempre vera se non li ricevi perché count non lo inizializzi con millis() prima di fare l'if.

leo72

PS:
ricordati che la seriale ha un buffer in ricezione dove vengono memorizzati i caratteri che arrivano e da cui la Serial.read() va a pescare. Se non ci trova nulla può darsi che esca prima del dovuto.

Altra cosa curiosa è che della stringa
abcde-fghil-mno
guarda caso a te perde proprio i primi 5 byte nonostante sembra li abbia ricevuti.

Go Up