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... etcNo 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.
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.
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.