Ver Mensaje Individual
  #1 (permalink)  
Antiguo 28/01/2003, 13:56
Avatar de marcos25
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_