Ver Mensaje Individual
  #2 (permalink)  
Antiguo 27/01/2003, 12:46
Avatar de marcos25
marcos25
 
Fecha de Ingreso: noviembre-2002
Ubicación: España
Mensajes: 164
Antigüedad: 22 años, 2 meses
Puntos: 0
correccion

Lo siento pero copie otra version del código, aqui les va el bueno.

#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, cont=0;
struct termios oldtio,newtio;
struct sigaction saio; /* definicion de accion de segnal */
fd_set rfds;
struct timeval tv;
char buf[255];

fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY | O_NONBLOCK);
if (fd <0) { perror(MODEMDEVICE); exit(-1); }

/* instala el manejador de segnal antes de hacer asincrono el dispositivo */
saio.sa_handler = signal_handler_IO;
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 */

newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CREAD;
newtio.c_oflag = 0;
newtio.c_cc[VMIN]=1;//1
newtio.c_cc[VTIME]=4; // 0//control de cano
tcflush(fd, TCIFLUSH);
tcsetattr(fd,TCSANOW,&newtio);

FD_ZERO(&rfds);
FD_SET(fd, &rfds);

while (1==1)
{//1
printf("Loading %d \n", cont);
cont++;
write(fd,"AT s7=45 s0=3 l1 v1 x4 &c1 e0 q0\r",33);//mando cadena de inicializacion
tv.tv_sec=5;
tv.tv_usec=0;

while ((x=select(fd+1,&rfds,NULL,NULL,&tv)) > 0)
{//2
printf("estoy aca");
while (STOP==FALSE)
{//3
recibido[0]='\0';
if (wait_flag==FALSE)
{//4
res = read(fd,buf,1024);
buf[res]='\0';
printf("----------------------- -%s-",buf); //leyó correctamente

if (buf[res-1]==10)
{//5
tv.tv_sec=0;;
STOP=TRUE;
}//5
strcat(recibido,buf);
/* para el bucle si solo entra un CR */
wait_flag = TRUE; /* espera una nueva entrada */
}//4
if (recibido[0]!='\0')
{
buf[0]='\0';
}
}//3

STOP=FALSE;
tcsetattr(fd,TCSANOW,&oldtio);
}//2
printf("fin %d \n", x);

if (x==0)
printf("ES CERO \n");

tcsetattr(fd,TCSANOW,&oldtio);
}//1
}//0


/************************************************** *************************
* 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;
}