Hola a todos!
Estoy realizando una aplicación que debe leer datos de una estación que se comunica por gprs con un modem Siemens conectado a un servidor con Linux.
Conecto a través de consola perfectamente enviando ATD6XXXXXXXX (telefono) y luego mediante comandos puedo consultar datos.
El problema es que tengo que utilizar a la fuerza un comando en cuya respuesta se codifican los datos en bytes.
Por ejemplo, la fecha la codifica de manera que en el primer byte se encuentran los 6 bits de los segundos y los dos primeros bits de los minutos, después en el segundo byte los 4 siguientes de los minutos y los 4 primeros de las horas... etc
Es decir cuando tengo 12:50:00 por ejemplo el primer byte se compone de seis 0's de los segundos y dos 1's de los primeros bits de los mintos: número 3, que corresponde a ETX, aqui está el problema.
No recibo el número 3 y supongo que es porque en algún nivel el puerto lo interpreta. Lo que ocurre es que cuando debería de recibir los datos de ese comando paro de recibir y no recibo el resto hasta que no pido otros datos, y aun así me faltan bytes.
Estoy programandolo con C, me he leido el manual de Termios.h y he probado todas las configuraciones posibles, y no consigo ni por asomo recibir el dichoso 3.
Supongo que probablemente haya más numeros que coincidan con carácteres de control que no recibo pero el 3 es el que tengo localizado.
¿Alguien sabe que configuración podría poner para recibir estos carácteres de control sin procesar?
Este es una de las muchas configuraciones que he probado:
Código:
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
if (fd <0) { perror(MODEMDEVICE); exit(-1); }
tcgetattr(fd,&oldtio); /* salva configuracion actual del puerto */
//bzero(&newtio, sizeof(newtio));
newtio.c_cflag = 0;
newtio.c_oflag = 0;
newtio.c_iflag = 0;
newtio.c_iflag = 0;
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
newtio.c_iflag = IGNPAR;
newtio.c_oflag = 0;
/* pone el modo entrada (no-canonico, sin eco,...) */
newtio.c_lflag = 0;
newtio.c_cc[VTIME] = 0; /* temporizador entre caracter, no usado */
newtio.c_cc[VMIN] = 5; /* bloquea lectura hasta recibir 5 chars */
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
i= 0;
while (STOP==FALSE) { /* bucle para entrada */
res = read(fd,buf,255); /* devuelve tras introducir 5 */
buf[res]=0; /* asi podemos printf... */
printf(":%s:%d\n", buf, res);
if (buf[0]=='z') STOP=TRUE;
if (i>50) STOP=TRUE;
i++;
}
tcsetattr(fd,TCSANOW,&oldtio);
La línea bzero(&newtio, sizeof(newtio)); la he comentado porque me desconfigura el puerto y me empieza a contestar ERROR al comando AT y no consigo volvero a configurar hasta que reinicio el servidor.