Ver Mensaje Individual
  #1 (permalink)  
Antiguo 11/01/2008, 05:10
neihs
 
Fecha de Ingreso: octubre-2006
Mensajes: 42
Antigüedad: 17 años, 7 meses
Puntos: 0
Problema con la configuración en Linux para el Puerto Serie

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.