Se trata de lo siguiente, el programa debe estar mandando y recibiendo info del serial, en caso de q la linea se corte debe tratar de comunicarse (estar ciclado esperando respuesta del modem), en caso de q se restablezca la comunicacion volverá a enviar y recibir info.
Aqui les anexo el código para q le hechen una mirada:
#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;
struct termios oldtio,newtio;
struct sigaction saio; /* definicion de accion de segnal */
fd_set rfds;
struct timeval tv;
char buf[255];
/* abre el dispositivo en modo no bloqueo (read volvera inmediatamente) */
//escribe()
fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd <0) { perror(MODEMDEVICE); exit(-1); }
//write(fd,"ATa\r",4);
/* instala el manejador de segnal antes de hacer asincrono el dispositivo */
saio.sa_handler = signal_handler_IO;
// saio.sa_mask[0] = 0;
saio.sa_flags = 0;
saio.sa_restorer = NULL;
sigaction(SIGIO,&saio,NULL);
/* permite al proceso recibir SIGIO */
fcntl(fd, F_SETOWN, getpid());
/* Hace el descriptor de archivo asincrono (la pagina del manual dice solo
O_APPEND y O_NONBLOCK, funcionara con F_SETFL...) */
fcntl(fd, F_SETFL, FASYNC);
tcgetattr(fd,&oldtio); /* salvamos conf. actual del puerto */
/*
fija la nueva configuracion del puerto para procesos de entrada canonica
*/
//newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CREAD;
//newtio.c_iflag = ICRNL;
newtio.c_oflag = 0;
//newtio.c_lflag = ICANON;
//newtio.c_lflag &= (ICANON);
newtio.c_cc[VMIN]=1;//1
newtio.c_cc[VTIME]=4; // 0//control de cano
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);
// write (fd,"ATa\r",4);
//sleep(10);
//printf("\nFin\n");
write(fd,"AT s7=45 s0=3 l1 v1 x4 &c1 e0 q0\r",33);
//sleep(12);
/* bucle de espera para entrada. Normalmente se haria algo util aqui */
//recibido=malloc(500*sizeof(char));
/*FD_ZERO(&rfds);
FD_SET(fd, &rfds);*/
tv.tv_sec=60;
tv.tv_usec=0;
//while (select(fd+1,&rfds,NULL,NULL,&tv) > 0) {
while (select(0,0,NULL,NULL,&tv) == -1)
{
printf("estoy aca");
while (STOP==FALSE)
{
recibido[0]='\0';
if (wait_flag==FALSE)
{
res = read(fd,buf,1024);
buf[res]='\0';
if (buf[res-1]==10)
{
tv.tv_sec=0;;
STOP=TRUE;
}
strcat(recibido,buf);
/* para el bucle si solo entra un CR */
wait_flag = TRUE; /* espera una nueva entrada */
}
if (recibido[0]!='\0')
{
printf("%s",recibido);
buf[0]='\0';
}
//if (buf[res]==10) STOP=TRUE;
}
/*if (recibido[0]!='\0')
printf("%s",recibido);*/
STOP=FALSE;
}
printf("fin\n");
tcsetattr(fd,TCSANOW,&oldtio);
}
/************************************************** *************************
* 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)
{
//printf("\nrecibida segnal SIGIO.\n");
wait_flag = FALSE;
}
Como verán esta en un ciclo infinito mandando y recibiendo datos del serial.
Los problemas q se me presentan son:
- Entra una vez, me responde OK y luego me devuelve -1.
- Si apago el modem, trata de comunicarse, pero en cuanto lo enciendo deberia mandar la cadena y responder OK nuevamente, pero no lo hace.
Espero q alguien me heche una mano con esto.
Muchas gracias.
_Marcos_