Foros del Web » Programación para mayores de 30 ;) » Programación General »

Señales en C

Estas en el tema de Señales en C en el foro de Programación General en Foros del Web. Espero q me puedan ayudar con esto.... De lo que se trata es de poder mandar y recibir datos del modem a través del puerto ...
  #1 (permalink)  
Antiguo 28/01/2003, 13:56
Avatar de marcos25  
Fecha de Ingreso: noviembre-2002
Ubicación: España
Mensajes: 164
Antigüedad: 21 años, 5 meses
Puntos: 0
Señales en C

Espero q me puedan ayudar con esto....

De lo que se trata es de poder mandar y recibir datos del modem a través del puerto serial de manera ininterrumpida.

Mando la cadena de inicialización del modem de forma infinita, este me responde OK, esta parte funciona. Para poder saber si se esta escribiendo o leyendo del puerto uso señales. Por ejemplo si apago el modem, el programa tendría q seguir mandando y esperando respuesta, esto por la instrucción SELECT, cuando vuelvo a encenderlo, el programa deberia seguir mandando y recibiendo, pero no ocurre esto, ya q a pesar de estar haciendo el write no se llama a la funcion asociada a la señal.

Anexo el código para q le hechen un vistazo.

#include <termios.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/signal.h>
#include <sys/types.h>

#define BAUDRATE B9600
#define MODEMDEVICE "/dev/ttyS1"
#define _POSIX_SOURCE 1 /* fuentes cumple POSIX */
#define FALSE 0
#define TRUE 1

volatile int STOP=FALSE;
char recibido[1024];

void signal_handler_IO (int status); /* definicion del manejador de segnal */
int wait_flag=TRUE; /* TRUE mientras no segnal recibida */

main()
{
int fd,c, res,jj, x=0, k=0, ban = 0, mvar=0;
struct termios oldtio,newtio; /*definición de la estructura termios */
struct sigaction saio; /* definicion de accion de segnal */
sigset_t sigset;
fd_set rfds;
struct timeval tv;
char buf[255];

fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK); //abro el puerto
if (fd <0) { perror(MODEMDEVICE); exit(-1); }
saio.sa_handler = signal_handler_IO;
saio.sa_flags = 0;
sigemptyset(&saio.sa_mask);
saio.sa_restorer = NULL;
sigaction(SIGIO,&saio,NULL);

fcntl(fd, F_SETOWN, getpid());//asigno la señal al puerto

fcntl(fd, F_SETFL, FASYNC);
tcgetattr(fd,&oldtio); /* salvamos conf. actual del puerto */

newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CREAD;
newtio.c_oflag = 0;
newtio.c_cc[VMIN]=1;//1
newtio.c_cc[VTIME]=0; // 0//control de cano
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio); //colocamos la nueva configuración al puerto

while(1==1) //declaro el ciclo infinito
{
printf("ciclo1\n");
write(fd,"AT s7=45 s0=3 l1 v1 x4 &c1 e0 q0\r",33); //cadena de inicializacion del modem
FD_ZERO(&rfds);
FD_SET(fd, &rfds);
tv.tv_sec=5;
tv.tv_usec=0;
printf("ciclo0 ************* %d \n", mvar);
mvar++;
x=0;
while ((x=select(fd+1,&rfds,NULL,NULL,&tv)) > 0) //si es mayor quiere decir q se puede leer
//y escribir en el puerto
{//1
printf("estoy aca %d \n",x);
while (STOP==FALSE)
{//2
k++;
recibido[0]='\0';
printf("estoy alla wait flag es %d - cont %d\n", wait_flag, k);
if (wait_flag==FALSE)
{
res = read(fd,buf,1024);
buf[res]='\0';
if (buf[res-1]==10) // si me llega el caracter de fin de transmision
{
tv.tv_sec=0;//leyó bien
STOP=TRUE;
k=0;
printf("lo leido es -%s-\n", buf);
}
strcat(recibido,buf);
wait_flag = TRUE; /* espera una nueva entrada */
}
if (recibido[0]!='\0')
buf[0]='\0';
}//2
STOP=FALSE;
}//1
tcflush(fd, TCIFLUSH);
}
printf("fin\n");
}

/************************************************** *************************
* manipulacion de segnales. pone wait_flag a FALSE, para indicar al bucle *
* anterior que los caracteres han sido recibidos *
************************************************** *************************/

void signal_handler_IO (int status)
{
wait_flag = FALSE;
printf("\nrecibida segnal SIGIO %d \n",wait_flag);
}

Agradeceré cualquier información y ayuda q me puedan brindar.


_Marcos_
  #2 (permalink)  
Antiguo 29/01/2003, 11:53
Avatar de Webstudio
Colaborador
 
Fecha de Ingreso: noviembre-2001
Ubicación: 127.0.0.1
Mensajes: 3.499
Antigüedad: 22 años, 5 meses
Puntos: 69
Movido tu mensaje de Linux a Programación.
__________________
Tutoriales Photoshop | Web-Studio.com.ar
Artículos PHP | ZonaPHP.com
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 12:04.