Ciao Savoriano,
grazie per la mano e scusami per l’ignoranza.
Check la uso come stringa ma avevo provato anche come char. dichiarata all’inizion del codice.
String check;
sezione setup inizializzo le seriali
void setup() {
//init seriale hardware
Serial.begin(115200);
Serial2.begin(115200); // pn 16 e 17 per ricevere da gps
Serial3.begin(115200); // pn 14 e 15 per ricevere da gps
nel loop faccio girare una rputine di lettua tastierino numerico per poter , nel proseguo dello sviluppo, programmare alcune funzioni dei gps
void loop() {
char key = kpd.getKey();
if (key) {
tasto = (int) key;
switch (tasto)
{
case 70: // il tasto f fa entrare …etc etcc… scansione di tutta la tastiera
questo è il “case” che attiva lo scambio del rele e delle due seriali. Funziona correttamente dato che il rele viene comandato come da richieste. In questa routine assegno a CHECK il valore “b” di base oppure “r” di rover
case 69: //tasto e
utility = false;
Serial.println(posizione_seriale);
if (posizione_seriale > 1)
{
posizione_seriale = 0;
}
posizione_seriale++;
lcd.clear();
lcd.noCursor(); //rendi invisibile il cursore
lcd.noBlink();
lcd.setCursor(0, 0);
switch (posizione_seriale)
{
case 1:
Serial.println(“comm 1”);
lcd.print(“Check”);
lcd.setCursor(0, 1);
lcd.print(“BASE”);
lcd.setCursor(0, 1);
digitalWrite(rele, HIGH); // accende il rele
check = “b”;
break;
case 2:
Serial.println(“comm 2”);
lcd.print(“Check”);
lcd.setCursor(0, 1);
lcd.print(“ROVER”);
lcd.setCursor(0, 1);
digitalWrite(rele, LOW); // spegne il rele
check = “r”;
break;
}
break;
dop aver fatto la scansione del tastierino,il loop si conclude con questo IF.
UTILITY è legato un tasto del tastierino numerico che assume un valore true o false (il tasto farebbe accedere o meno ad alcune funzioni oppure lasciare la lettura delle seriali,per intenderci).
QUesto IF fa partire le operazioni che riguarda la lettura e decodifica del del dato seriale, che però sono esterne al loop
if (!utility)
{
leggi_seriale();
decodifica();
}
// qui finisce il loop
[quote/]
la funzione leggi_seriale è quella incriminata.
In pratica cosa vorrei fare:
i due gps trasmettono sempre sul loro TX OUT (verso la com3 o la com2 ) io semplicemente voglio che,nel caso check fosse “b” leggesse la com3 , se check fosse “r” leggesse la com2
Non mi importa di perdere qualche dato inquanto le stringhe dei gps sono inviate ogni secondo e per il mio utilizzo questa perdita di un dato non ha influenza (fotogrammetria rtk dove devo aspettare anche qualche minuto per aver un dato stabile quindi, come puoi capire, il secondo perso non importanza)
void leggi_seriale() {
if (Serial3.available() && check == ‘b’) {
Serial.print (check);
char c = Serial3.read();
if (c != ‘\n’) {
NMEA += c;
}
}
else if (Serial2.available() && check == ‘r’) {
Serial.print (check);
char c = Serial2.read();
if (c != ‘\n’) {
NMEA += c;
}
}
else {
Serial.println(NMEA);
}
}
quando le condizioni sono corrette, a seconda se selezionato "b oppure “r” ed ho acquisito il dato di conseguenza, esco dalla procedura, torna nel loop,e passa alla successiva decodifica.
Qui ho un dubbio: ma usando il sistema a funzioni esterne…il percorso uscitalopp>lettura>ritornoloop>decodifica è corretto oppure avviene in maniera parallela cioe’:
lettura seriale…leggo ma nel frattempo il loop va avanti e sono gia in decodifica e quindi, in caso di ritardi, mi sono perso tutto e la mia stringa è facile che sia errata ?
Devo dire che il test con il passaggio fisico viene fatto con una sequenza seriale nella stessa routine: la lettura della singola comm è all’inizio e quidi finche non ha letto non va oltre.
questa è la versione fatta funzioni esterne, quella che non va…
void decodifica() {
Serial.println(NMEA); // da qua parte la decodifica della stringa >>>
posizione_delimitatore = 0;
index = 0;
//questa variabile viene usata per contare tutti i campi trovati
campo = 0;
//printo solo la stringa che mi interessa
if (NMEA.substring(0, 6) == “$GNGGA”)
{ …etce etc etc…
questa è la funzione che uso con il rele (lettura e decodifica assieme) e che funziona
void decodifica() { // qui leggo la seriale e non ne esce finche non c’è \n
if (Serial3.available()) {
//leggo la prima riga
char c = Serial3.read();
if (c != ‘\n’) {
NMEA += c;
}
else {
Serial.println(NMEA); // da qua parte la decodifica della stringa >>>
posizione_delimitatore = 0;
index = 0;
//questa variabile viene usata per contare tutti i campi trovati
campo = 0;
//printo solo la stringa che mi interessa
if (NMEA.substring(0, 6) == “$GNGGA”) etc etc…qui c’è tutta la decodifica…
Mario 