I singoli valori letti devi metterli dentro una stringa, meglio una stringa classica del C e NON una String.
Poi quando arriva una fine frase (si spera ci sia) allora analizzi la frase verificando se c'è' CSQ e se si leggi il valore successivo.
Ma devi visualizzare il valore una volta sola alla partenza del programma, oppure vorresti che sul display comparisse il valore tutte le volte che cambia?
ho aperto un altra discussione perché mi sembrava che argomento era diverso la si parlava si softwareserial
pgiagno:
Ma devi visualizzare il valore una volta sola alla partenza del programma, oppure vorresti che sul display comparisse il valore tutte le volte che cambia?
Ciao,
P.
sono una volta
nid69ita:
I singoli valori letti devi metterli dentro una stringa, meglio una stringa classica del C e NON una String.
Poi quando arriva una fine frase (si spera ci sia) allora analizzi la frase verificando se c'è' CSQ e se si leggi il valore successivo.
grazie ma non sono molto esperto se riesci a spiegarmi meglio magari con esempi ti sarei grato
Prima di tutto bisogna sapere se la trasmissione ha un qualcosa che permette di sapere quando termina.
Cambia Serial.write(Serial1.read());
in Serial.println((int)Serial1.read(),HEX);
per vedere se dopo +CSQ: 12,0 c'e' qualche carattere di fine trasmissione
nid69ita:
per vedere se dopo +CSQ: 12,0 c'e' qualche carattere di fine trasmissione
Tutte le risposte dei SIM terminano con CR+LF ... è chiaramente indicato nell'Introduzione, paragrafo "AT Command Syntax", degli "AT Command Manual" relativi ai vari chip.
Bene.
Puoi sfruttare la Serial.readBytesUntil(character, buffer, length)
Devi dichiarare una stringa classica del c (vettore di char) abbastanza grande. Diciamo char buf [ 20 ] ;
Poi
char buf[20];
...
while(1)
{ if (Serial1.available()) 'CR='\r'=13 LF='\n'=10
{ if( Serial.readBytesUntil('\n', buf, 20)>0)
{ // letto fino a carattere ascii 10 dentro a buf dovrei avere "+CSQ: 12,0"
if( strncmp(buf,"+CSQ:",5)==0 ) //
{ // dentro a buf c'e' il messaggio aspettato
// quindi dentro a buf, dal elemento 6 in poi, fino a virgola ho il numero
int val=atoi(buf+6);
}
}
}
}
Si il valore è poi in val (spero, non provato)
Se usi Mega e la seriale 1 allora si, Serial1 invece di Serial
Le stringhe classiche del C sono vettori/array di caratteri terminati da carattere speciale '\0' o null o valore 0.
Ci sono molte funzioni di libreria su questi vettori, strxxx()
Esempio strncmp che confronta due stringhe ma solo per enne caratteri. Ritorna 0 se uguali
Qui le funzioni già presenti in core Arduino (anzi nel Avr):
ti ringrazio dei consigli ma ho un libro simile gia letto ma faccio comunque fatica perché io non ho nessuna base di programmazione mai fatta neanche a livello scolastico (sono un tecnico hardware) quindi niente software ne tanto meno programmazione e linguaggi vari quindi sto cercando di imparare e capire per quello che riesco a fare
comunque se volessi visualizzare come controllo la mia variabile posso usare
birrohgt:
ti ringrazio dei consigli ma ho un libro simile gia letto ...
... dammi retta, è uno dei migliori in assoluto in lingua Italiana ... l'ha scritto il nostro "admin" Leo ... lo stesso di QUESTO sito. T'assicuro che vale la pena leggerlo !
birrohgt:
comunque se volessi visualizzare come controllo la mia variabile posso usare
Serial.write (val);
Che intendo visualizzare "come controllo" ? ? ? Che vuoi visualizzare il valore della variabile per avere un riscontro ? In tal caso leggiti bene la differenza tra il metodo write() e il metodo print() e segli quello che meglio si addice a come vuoi visualizzare la variabile.
ho fatto cosi ma non mi funziona sul monitor non vedo nulla
#define gsm Serial1
char buf[20];
int val;
void setup()
{
Serial.begin(9600);
gsm.begin(9600);
delay(2000);
gsm.println("AT+CMGF=1\r");
delay(1000);
gsm.println("AT+CSQ"); //richiesta segnale
while(1)
{ if (Serial1.available())
{
if( Serial1.readBytesUntil('\n', buf, 20)>0) // letto fino a carattere ascii 10 dentro a buf dovrei avere "+CSQ: 12,0"
{
if( strncmp(buf,"+CSQ:",5)==0 ) // dentro a buf c'e' il messaggio aspettato
{
val=atoi(buf+6); // quindi dentro a buf, dal elemento 6 in poi, fino a virgola ho il numero
}
}
}
}
Serial.write (val);
}