Vai al contenuto
PLC Forum


Comandat Modulo Rabbit2000


jack76

Messaggi consigliati

Ciao a tutti

devo costruire un sistema per il telecontrollo GSM,utilizzo un modulo rabbit2000 collegato per via seriale ad un modem siemens mc35terminal,il mio problema è il seguente:

riesco ad inviare al modem per via seriale i vari comandi AT e a visualizzarli su schermo,questo è il programma

ser_timeout=5000;

printf ("Invio comando network checking\n");

serCputs("AT+CMGR=1\r");

ttimer=MS_TIMER;

while ( (serCpeek()==-1) && (MS_TIMER-ttimer<ser_timeout) ) ;

if (serCpeek()!=-1) {

nchar=serCread(RFRxBuf,150,5000);

printf (RFRxBuf);

e questo è quello che visualizzo a monitor

Invio comando network checking

AT+CMGR=1

+CMGR: "REC READ","+39018700",,"06/02/15,14:47:19+04"

aliceadsl.it sms1

OK

~

vorrei riuscire ad assegnare ad una variabile solo il testo del messaggio per poi valutarne l'autenticità;è un po che ci lavoro ma non riesco a venirne fuori,

un saluto a tutti

ciao giacomo

Link al commento
Condividi su altri siti


Cerca il carattere 0x0A nella stringa che ricevi dopo la richiesta AT+CMGR

con la funzione strchr ti restituisce il puntatore all inzio messaggio o meglio al carattere 0x0A che precede il messaggio, ti basta incrementare di 1 il puntatore;

La sintassi

char* q ;

q = strchr (RXmsg, 0x0A) ; q++ ;

da qui q = puntatore alla stringa "aliceadsl.it SMS1"

Link al commento
Condividi su altri siti

In pratica i dati ce li hai gia' in un buffer di caratteri (RFRxBuf).

Per esempio : se devi riconoscere il numero di telefono in questa stringa :

+CMGR: "REC READ","+39018700",,"06/02/15,14:47:19+04"

char BuffNumTel[30];

int n;

BuffNumTel[0] = '\0';

n = strtok(RFRxBuf,"+");

for(i=0;i<strlen(RFRxBuf);i++)

{

if(RFRxBuf == '+')

{

i++;

while(i<strlen(RFRxBuf) && RFRxBuf != chr(34)) // Fino a che non trova il primo " successivo

{

BuffNumTel[n++] = RFRxBuf[i++];

}

BuffNumTel[n] = '\0';

break;

}

}

.... naturalmente dovrai migliorare il codice per evitare dei buffer overflow in caso di errore.

Ciao :)

Modificato: da ifachsoftware
Link al commento
Condividi su altri siti

il testo del sms, nel caso sopra sms1;

questo mi servirebbe per poi andarlo a confrontare con un'altra variabile alla quale assegno sms1,verificata l'uguaglianza faccio accendere per esempio un led altrimenti esco.

Link al commento
Condividi su altri siti

Scusa la fretta , ma ho commesso un errore

Errore :

n = strtok(RFRxBuf,"+");

Correggi con

n = 0;

L'ho fatto perche non ricordavo a memoria il nome della funzione strchr come indicatati da accacca

In ogni caso nel mio codice ho fatto quello che fa STRCHR ....

Ciao :)

Link al commento
Condividi su altri siti

ciao a tutti

purtroppo continuo ad avere dei problemi che non riesco a risolvere :(

char nchar,RFRxBuf;

char* q;

int ser_timeout,ttimer;

q=0;

nchar=0;

RFRxBuf=0;

ser_timeout=5000;

printf ("Invio comando network checking\n");

serCputs("AT+CMGR=1\r");

ttimer=MS_TIMER;

while ( (serCpeek()==-1) && (MS_TIMER-ttimer<ser_timeout) ) ;

if (serCpeek()!=-1) {

nchar=serCread(RFRxBuf,150,5000);

q = strchr (RFRxBuf, 0x0A) ;

q=q+55;

printf(q);

} else {

printf ("RF Serial TIMEOUT\n");

}

riesco ad isolare la parte di testo che m'interessa,a video vedo:

aliceadsl.it sms1vedi di funzionare

OK

~

ora vorrei riuscire a far accendere un led attraverso una parola chiave del testo del messaggio per esempio aliceadsl,ho pensato basta definire un'altra variabile di tipo char gli assegno aliceadsl le confronto e se l'uguaglianza è verificata eseguo l'operazione ,il mio problema è assegnare alla variabile aliceadsl,sono due giorni che ci provo ma non ho avuto successo.

+CMGR: "REC READ","+39018700",,"06/02/15,14:47:19+04"

char BuffNumTel[30]; //vettore

int n;

BuffNumTel[0] = '\0'; //prima cella del vettore

n = 0;

for(i=0;i<strlen(RFRxBuf);i++) //incrementa i finchè non finisce RFRxBuf

{

if(RFRxBuf == '+') // questa funzione cerca il + del numero telefonico?

{

i++; // quando lo trova incrementa i?

while(i<strlen(RFRxBuf) && RFRxBuf != chr(34)) // Fino a che non trova il primo " successivo

{ //chr(34) lo segna come errore"undefined but used global label

BuffNumTel[n++] = RFRxBuf[i++]; //chr

}

BuffNumTel[n] = '\0';

break;

}

}

non riesco a cappire bene cosa fa il programma,è da poco tempo che mi sono dedicato al dynamicC e molte cose non riesco a vederle chiaramente :(:(

grazie a tutti per l'aiuto

a presto

giacomo

Link al commento
Condividi su altri siti

cioa giacomo

credo che ti serva un ripasso del C

per cercare una stringa in un testo usa

strstr (s1,s2) cerca la stringa s2 in s1 altrimenti torna null)

quindi puoi fare così

if (strstr (RFRxBuf, "LEDON")) attiva led ;

non tiserve nemmeno cercare l'inizio del messaggio ma solo la parola chiave nel buffer ricevuto

Guardavo il codice del tuo messaggio non capisco perchè q=q+55 ;

Comunque ne parliamo dopo per ora spero di aiutarti a risolvere il problema principale.

Link al commento
Condividi su altri siti

ciao

ho risolto funziona perfettamente :) grazie mille per l'aiuto!

il q=q+55 pensavo mi servisse per togliere tutto quello che precedeva il testo del messaggio e visualizzare solo il testo ma mi sbagliavo,la soluzione era molto più semplice,per il ripasso hai perfettamente ragione :lol:

grazie per l'aiuto

a presto giacomo

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...