Ciao a tutti, è da tanto che non programmo seriamente, ma non mi ricordavo che fosse un casino simile manipolare delle stringhe.
Ci ho perso tutta la giornata ma non ne sono venuto a capo.
Sto sviluppando un pde che prende i dati seriali da un GPS e poi se mai dovessi riuscire a manipolare le stringhe, "dovrebbe" compiere determinate azioni in base a quello che gli dice il gps.
Allora, il pde è questo:
#include <string.h>
#include <ctype.h>
#include <SoftwareSerial.h>
#define MONITORRXPIN 0
#define MONITORTXPIN 1
#define GPSRXPIN 8
#define GPSTXPIN 9
#define RXBUFFERLENGHT 500
#define GPRMCCOMMAND "$GPRMC"
#define GPGGACOMMAND "$GPGGA"
#define GPGSACOMMAND "$GPGSA"
#define GPGSVCOMMAND "$GPGSV"
char byteGPS = -1;
char RXBuffer[RXBUFFERLENGHT];
int CharCount=0;
SoftwareSerial GPSSerial = SoftwareSerial(GPSRXPIN, GPSTXPIN);
void setup()
{
pinMode(MONITORRXPIN, INPUT);
pinMode(MONITORTXPIN, OUTPUT);
GPSSerial.begin(4800);
Serial.begin(9600);
InitRXBuffer();
}
void loop()
{
byteGPS=GPSSerial.read();
if (byteGPS >= 0)
{
RXBuffer[CharCount]=byteGPS;
CharCount++;
Serial.print(byteGPS, BYTE);
if (CharCount >= RXBUFFERLENGHT)
{
Serial.print("Errore superamento buffer");
return;
}
if (byteGPS==13)
{
CharCount=0;
InitRXBuffer();
}
}
}
void InitRXBuffer()
{
for (int i=0;i < RXBUFFERLENGHT;i++) { RXBuffer[i] = 0; }
}
E mi da questo risultato (che è corretto):
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,212320.718,V,,,,,,,230911,,*29
$GPGGA,212321.709,,,,,0,00,,,M,0.0,M,,0000*59
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,212321.709,V,,,,,,,230911,,*28
$GPGGA,212322.709,,,,,0,00,,,M,0.0,M,,0000*5A
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,212322.709,V,,,,,,,230911,,*2B
$GPGGA,212323.739,,,,,0,00,,,M,0.0,M,,0000*58
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,3,1,10,20,75,047,,23,65,203,,32,48,072,,24,40,141,*74
$GPGSV,3,2,10,17,34,270,,31,26,056,,11,25,157,,04,20,309,*70
$GPGSV,3,3,10,14,13,044,,10,01,272,*78
$GPRMC,212323.739,V,,,,,,,230911,,*29
$GPGGA,212324.709,,,,,0,00,,,M,0.0,M,,0000*5C
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,212324.709,V,,,,,,,230911,,*2D
$GPGGA,212325.709,,,,,0,00,,,M,0.0,M,,0000*5D
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,212325.709,V,,,,,,,230911,,*2C
$GPGGA,212326.718,,,,,0,00,,,M,0.0,M,,0000*5E
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,212326.718,V,,,,,,,230911,,*2F
$GPGGA,212327.709,,,,,0,00,,,M,0.0,M,,0000*5F
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPRMC,212327.709,V,,,,,,,230911,,*2E
$GPGGA,212328.709,,,,,0,00,,,M,0.0,M,,0000*50
$GPGSA,A,1,,,,,,,,,,,,,,,*1E
$GPGSV,3,1,10,20,75,047,,23,65,203,,32,48,072,,24,40,141,*74
$GPGSV,3,2,10,17,34,270,,31,26,056,,11,25,157,,04,20,309,*70
Il testo viene scritto byte per byte in seriale e sembra funzionare, però se tiro via la riga che scrive
byte per byte e provo a fargli scrivere l'array, il risultato non è lo stesso:
#include <string.h>
#include <ctype.h>
#include <SoftwareSerial.h>
#define MONITORRXPIN 0
#define MONITORTXPIN 1
#define GPSRXPIN 8
#define GPSTXPIN 9
#define RXBUFFERLENGHT 100
#define GPRMCCOMMAND "$GPRMC"
#define GPGGACOMMAND "$GPGGA"
#define GPGSACOMMAND "$GPGSA"
#define GPGSVCOMMAND "$GPGSV"
char RXBuffer[RXBUFFERLENGHT];
int CharCount=0;
SoftwareSerial GPSSerial = SoftwareSerial(GPSRXPIN, GPSTXPIN);
void setup()
{
pinMode(MONITORRXPIN, INPUT);
pinMode(MONITORTXPIN, OUTPUT);
GPSSerial.begin(4800);
Serial.begin(9600);
InitRXBuffer();
}
void loop()
{
char byteGPS = -1;
byteGPS=GPSSerial.read();
if (byteGPS >= 0)
{
RXBuffer[CharCount]=byteGPS;
CharCount++;
// Serial.print(byteGPS, BYTE); ************** commentato riga che scrive byte per byte
if (CharCount >= RXBUFFERLENGHT)
{
Serial.print("Errore superamento buffer");
return;
}
if (byteGPS==13)
{
// **************** aggiunto ciclo for che scorre l'array e invia alla seriale un carattere per volta
for (int i=0; i <= strlen(RXBuffer)-1; i++)
{
Serial.print(RXBuffer[i], BYTE);
}
Serial.println("");
//****************************************************************************
CharCount=0;
InitRXBuffer();
}
}
}
void InitRXBuffer()
{
for (int i=0;i < RXBUFFERLENGHT;i++) { RXBuffer[i] = 0; }
}
Ho evidenziato le righe modificate/aggiunte.
Il risultato è questo:
,,,*1E
GSV,3,1,11,23,85,194,,20,61,082,,04,36,306,,32,34,085,*7B
f23,148,,31,19,041,,13,14,224,*7A
3f14,282,,11,09,159,,30,00,028,*48
21,V,,,,,,,230911,,*26
$GPGGA,220354.713,,,,,0,00,,,M,0.0,M,,0000*51
,,,,,*1E
RMC,220354.713,V,,,,,,,230911,,*20
$GPGGA,220355.713,,,,,0,00,,,M,0.0,M,,0000*50
,,,,,*1E
RMC,220355.713,V,,,,,,,230911,,*21
$GPGGA,220356.721,,,,,0,00,,,M,0.0,M,,0000*52
,,,,,*1E
RMC,220356.721,V,,,,,,,230911,,*23
$GPGGA,220357.713,,,,,0,00,,,M,0.0,M,,0000*52
,,,,,*1E
RMC,220357.713,V,,,,,,,230911,,*23
$GPGGA,220358.713,,,,,0,00,,,M,0.0,M,,0000*5D
,,,,,*1E
GSV,3,1,11,23,85,194,,20,61,082,,04,36,306,,32,34,085,*7B
f23,148,,31,19,041,,13,14,224,*7A
3f14,282,,11,09,159,,30,00,028,*48
13,V,,,,,,,230911,,*2C
$GPGGA,220359.721,,,,,0,00,,,M,0.0,M,,0000*5D
,,,,,*1E
RMC,220359.721,V,,,,,,,230911,,*2C
$GPGGA,220400.713,,,,,0,00,,,M,0.0,M,,0000*57
,,,,,*1E
RMC,220400.713,V,,,,,,,230911,,*26
$GPGGA,220401.713,,,,,0,00,,,M,0.0,M,,0000*56
cf
$GPRMC,220401.713,V,,,,,,,230911,,*27
$GPGGA,220402.721,,,,,0,00,,,M,0.0,M,,0000*54
,,,,,*1E
RMC,220402.721,V,,,,,,,230911,,*25
$GPGGA,220403.713,,,,,0,00,,,M,0.0,M,,0000*54
,,,,,*1E
GSV,3,1,11,23,85,194,,20,61,082,,04,36,306,,32,34,085,*7B
f23,148,,31,19,041,,13,14,224,*7A
3f14,282,,11,09,159,,30,00,028,*48
13,V,,,,,,,230911,,*25
$GPGGA,220404.713,,,,,0,00,,,M,0.0,M,,0000*53
,,,,,*1E
RMC,220404.713,V,,,,,,,230911,,*22
$GPGGA,220405.724,,,,,0,00,,,M,0.0,M,,0000*56
,,,,,*1E
RMC,220405.724,V,,,,,,,230911,,*27
$GPGGA,220406.715,,,,,0,00,,,M,0.0,M,,0000*57
,,,,,*1E
RMC,220406.715,V,,,,,,,230911,,*26
$GPGGA,220407.715,,,,,0,00,,,M,0.0,M,,0000*56
,,,,,*1E
RMC,220407.715,V,,,,,,,230911,,*27
$GPGGA,220408.723,,,,,0,00,,,M,0.0,M,,0000*5C
,,,,,*1E
GSV,3,1,11,23,85,194,,20,61,082,,04,36,306,,32,34,085,*7B
f23,148,,31,19,041,,13,14,224,*7A
3f14,282,,11,09,159,,30,00,028,*48
23,V,,,,,,,230911,,*2D
$GPGGA,220409.715,,,,,0,00,,,M,0.0,M,,0000*58
,,,,,*1E
RMC,220409.715,V,,,,,,,230911,,*29
$GPGGA,220410.715,,,,,0,00,,,M,0.0,M,,0000*50
,,,,,*1E
RMC,220410.715,V,,,,,,,230911,,*21
$GPGGA,220411.724,,,,,0,00,,,M,0.0,M,,0000*53
,,,,,*1E
RMC,220411.724,V,,,,,,,230911,,*22
$GPGGA,220412.715,,,,,0,00,,,M,0.0,M,,0000*52
,,,,,*1E
RMC,220412.715,V,,,,,,,230911,,*23
$GPGGA,220413.715,,,,,0,00,,,M,0.0,M,,0000*53
,,,,,*1E
GSV,3,1,11,23,85,194,,20,61,082,,04,36,306,,32,34,085,*7B
f23,148,,31,19,041,,13,14,224,*7A
3f14,282,,11,09,159,,30,00,028,*48
15,V,,,,,,,230911,,*22
$GPGGA,220414.724,,,,,0,00,,,M,0.0,M,,0000*56
,,,,,*1E
RMC,220414.724,V,,,,,,,230911,,*27
Mi sono fatto l'idea che nel primo caso, viene scritto byte per byte in tempo reale, mentre nel secondo
il tempo che arduino impiega a scorrere l'array e a printarlo in seriale fa passare dei cicli di cpu in cui
il gps continua ad inivare dati che vanno persi perchè non scaricati dal buffer.
Però, se il problema è veramente questo, come potrei risolverlo?
La prova di scrittura dell'array l'ho fatta non perchè mi serva stamparlo a video tramite seriale, ma perchè
non risuscivo a capire come mai mi era impossibile manipolare le strinche con strcmp e strcpy.
Se qualcuno ha qualche dritta
Grazie.
Ciao.