jack76 Inserito: 15 febbraio 2006 Segnala Inserito: 15 febbraio 2006 Ciao a tuttidevo 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 programmaser_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 monitorInvio 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 tutticiao giacomo
accacca Inserita: 15 febbraio 2006 Segnala Inserita: 15 febbraio 2006 Cerca il carattere 0x0A nella stringa che ricevi dopo la richiesta AT+CMGRcon 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"
ifachsoftware Inserita: 15 febbraio 2006 Segnala Inserita: 15 febbraio 2006 (modificato) 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: 15 febbraio 2006 da ifachsoftware
jack76 Inserita: 15 febbraio 2006 Autore Segnala Inserita: 15 febbraio 2006 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.
jack76 Inserita: 15 febbraio 2006 Autore Segnala Inserita: 15 febbraio 2006 Ok grazie mille per l'aiuto mi metto subito al lavoro!!!vi farò sapere com'è andataciao giacomo
ifachsoftware Inserita: 15 febbraio 2006 Segnala Inserita: 15 febbraio 2006 Scusa la fretta , ma ho commesso un erroreErrore :n = strtok(RFRxBuf,"+");Correggi con n = 0;L'ho fatto perche non ricordavo a memoria il nome della funzione strchr come indicatati da accaccaIn ogni caso nel mio codice ho fatto quello che fa STRCHR ....Ciao
jack76 Inserita: 18 febbraio 2006 Autore Segnala Inserita: 18 febbraio 2006 ciao a tuttipurtroppo 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]; //vettoreint n; BuffNumTel[0] = '\0'; //prima cella del vettoren = 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
accacca Inserita: 18 febbraio 2006 Segnala Inserita: 18 febbraio 2006 cioa giacomocredo che ti serva un ripasso del Cper 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 ricevutoGuardavo 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.
jack76 Inserita: 18 febbraio 2006 Autore Segnala Inserita: 18 febbraio 2006 ciaoho 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 grazie per l'aiutoa presto giacomo
Messaggi consigliati
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 accountAccedi
Hai già un account? Accedi qui.
Accedi ora