da
AjKDAP » 22 mag 2012, 18:54
ricello9 ha scritto:Come potrai notare la mia conoscenza del c è molto grossolana quindi ogni tuo suggerimento è prezioso
infatti, io ti consiglierei di iniziare leggendo un tot di bytes direttamente dalla seriale e poi in un secondo momento lavorare sul buffer per estrapolare i dati.
Successivamente potrai provare a salvare nel buffer solamente i dati che ti interessano maggiormente, ma ripeto, io tralascerei questa fase per ora...
QUalche suggerimento riguardante il tuo codice:
La funzione Read1USART(); ho letto sull'help di mikroc che legge un singolo byte dalla seriale, quindi NON puoi leggere un singolo byte e poi controllare molti bytes:
- Codice: Seleziona tutto
If(buffer[i]=='G' && buffer[i+1] =='P' && buffer[i+2]=='GR && buffer[i+3]=='M' && buffer[i+4]=='C' )
Inoltre questo ciclo for non ha senso:
- Codice: Seleziona tutto
for (i=0; i !'$'; i++)
buffer[i] = Read1USART();
tralasciando il fatto che la negazione dell'uguale si indica con "!=" e non solamente con "!", la cosa più sbagliata è che l'indice i si incrementa da zero fino a 36 visto che il carattere dollaro equivale al numero 36. Quindi leggeresti sempre 36 bytes dalla seriale.
L'idea di leggere fino al carattere $ è corretta, ma il metodo è sbagliato.
Io proverei a leggere di continuo un numero fisso di bytes fino a riempire un buffer, ad esempio semplicemente cosi:
- Codice: Seleziona tutto
for (i=0; i<128; i++){
while(!UART1_Data_Ready() );
buffer[i] = Read1USART();
}
ed in un secondo momento analizzare il buffer per controllare se è presente la stringa NMEA che ti interessa.
Inoltre non conosco come funziona l'interrupt per l'UART nel tuo PIC18, se l'interruzione viene generata alla ricezione di ogni singolo byte, nella routine di interrupt dovrai solamente salvare un singolo byte nel buffer ed incrementare un indice per la volta successiva.
Altrimenti puoi semplicemente fare a meno dell'interrupt ed aspettare che il byte sia pronto per essere letto, come è specificato nell'help di mikroc:
- Codice: Seleziona tutto
if (UART1_Data_Ready() == 1) {
receive = UART1_Read();
}
PS.: dal primo post mi sembrava di aver capito che la ricezione era una cosa assodata, invece ora non so se è tutto ok oppure no, mi confermi che riesci a ricevere i bytes dal GPS e salvarli in un buffer?
Se non è cosi allora concentrati prima su questa fase.
ciao