Hola a tod@s
PalitroqueZ, muchas gracias por responder
debes saber cuantos caracteres envia el modem en respuesta al comando AT.
Esto no siempre es posible con un 100% de fiabilidad, algunos comandos devuelven un numero variable
de caracteres. Por ejemplo la respuesta al envio de un SMS es <CR><LF>+CMGS: x<CR><LF><CR><LF>OK<CR><LF>,
siendo x un valor de 1 a 255 (de 1 a 3 caracteres). O cuando en la trama va un numero de teléfono, que puede
ir en formato local o internacional (+xx) osea 3 caracteres mas...
configuras el buffer de recepción.
escribes una rutina que localice los caracteres "O" "K".
Que pasaria si justo despues de configurar el buffer para recibir la respuesta a un comando, te entra
una llamada, o un mensaje... Evidentemente ni la longitud, ni los datos son los que esperabas...
en todo caso, hay que activar un temporizador que se quede esperando por la respuesta del modem.
Entiendo que ese temporizador o time-out actua solo para evitar que el programa se quede atascado
en la rutina de recepcion
cvargcal, muchas gracias a ti tambien por responder
Segun el trozo de codigo que has puesto, observo que despues de enviar el comando AT, esperas con un
delay_ms el tiempo suficiente para que la rutina de recepcion mediante la int_rda cargue en buffer todos
los caracteres que entran por el puerto serie y despues pasas a procesarlo comprobando previamente
que es la trama correcta.
No has incluido la rutina que maneja la int_rda, y no aclaras como determinas cuando la trama de recepcion
esta completa, o simplemente cargas en buffer todo lo que entre durante delay_ms(1000)...
Yo cambiaria un poco el codigo para evitar esas temporizaciones
#int_rda
void rs232_int()
{
char c;
if(kbhit(MODEM))
{
c=fgetc(MODEM);
if(c>31 && c<127) //Solo caracteres imprimibles
{
c = toupper(c); //lo paso a mayusculas
buffer[i++]=c;
flag_rda=TRUE; //Bandera recepcion caracter
}
}
}
y dentro del main()
while(true) //Bucle infinito
{
if(flag_rda)
{
//Aqui iria el codigo que determinaria cuando se ha recibido el ultimo
//caracter de la trama, bien analizando lo recibido hasta el momento o
//bien por tiempo entre caracteres
if(trama_completa)
flag_trama_recibida=TRUE;
flag_rda=FALSE;
}
if(flag_trama_recibida) //Recibida cadena de datos en el modem
{
//Codigo para procesar los datos recibidos
flag_trama_recibida=FALSE;
}
}
y te digo lo mismo que a PalitroqueZ, que pasaria si justo despues de enviar el comando AT y antes
de recibir la respuesta, te entra una llamada, o un mensaje... Evidentemente no seran los datos
que esperabas...
Puede parecer que es improbable que esto suceda, pero ya te digo que es posible...
Siento mucho parecer demasiado perfeccionista y sacarle pegas a todo, pero es que quiero hacer un
programa a prueba de fallos.
Para mi lo ideal seria hacer una rutina de recepcion que analizara los datos y actuara en consecuencia
independientemente de si el progarama estaba haciendo otra cosa, se interrumpiria, haria lo que
indicara la nueva trama y luego seguiria donde se interrumpio...
Mi pregunta sigue siendo la misma:
- Hay alguna otra forma de hacerlo ?
- Usando el método del tiempo, ¿técnicamente, podría ser que se recibieran dos tramas diferentes tan juntas que la diferencia entre el ultimo carácter y el primero de la siguiente no excedieran de los 833us y se recibieran como una sola trama?
Me gustaría que me dierais vuestra opinión
Saludos a tod@s