Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Problema con la configuración en Linux para el Puerto Serie

Estas en el tema de Problema con la configuración en Linux para el Puerto Serie en el foro de C/C++ en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 11/01/2008, 05:10
 
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.
  #2 (permalink)  
Antiguo 18/01/2008, 04:43
 
Fecha de Ingreso: octubre-2006
Mensajes: 42
Antigüedad: 17 años, 7 meses
Puntos: 0
Re: Problema con la configuración en Linux para el Puerto Serie

¿Nadie sabe del tema para hecharme una mano?
  #3 (permalink)  
Antiguo 17/03/2008, 03:06
 
Fecha de Ingreso: octubre-2006
Mensajes: 42
Antigüedad: 17 años, 7 meses
Puntos: 0
Re: Problema con la configuración en Linux para el Puerto Serie

Una compañera encontró la solución. La pongo por si alguien tiene alguna vez el mismo problema.
Es la configuración del puerto, se solucionó con el comando linux siguiente:
Código:
stty crtscts -ixon -ixoff -ixany -echoctl clocal -isig -icanon -echo -echoe iexten ignbrk< /dev/ttyS0
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:00.