Sistemas Operativos > GNU/Linux

 Lectura 1 Byte Puerto Serie

(1/1)

bratis:
Hola, estoy desarrolando una aplicacion en la que necesito leer byte a byte lo que me llega por el puerto serie. La idea es la siguiente:

Bucle infinito hasta que recibo la signal SIGIO, esta signal dara paso a un manejador que leera el byte del puerto y lo tratara.Mi cuestion es, la interrupcion software SIGIO se produce cuando el dispositivo asociado al puerto serie recibe 1 solo byte?y con la funcion read se puede leer tambien un solo byte?
read(fd, buffer, 1);

Si alguien me pudiera mandar algun ejemplo parecido le estaria muy agradecido.

Muchas gracias

Ruben3d:
Hola.

Existe un programa, llamado miniterm, que lo que hace es enviar por el puerto serie lo que escribas, carácter a carácter, y escribir por pantalla lo que reciba, también carácter a carácter. Su código es


--- Código: Text --- /** AUTHOR: Sven Goldt (goldt@math.tu-berlin.de)** This program is free software; you can redistribute it and/or* modify it under the terms of the GNU General Public License* as published by the Free Software Foundation; either version 2* of the License, or (at your option) any later version.** This program is distributed in the hope that it will be useful,* but WITHOUT ANY WARRANTY; without even the implied warranty of* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the* GNU General Public License for more details.**//*This is like all programs in the Linux Programmer's Guide meantas a simple practical demonstration.It can be used as a base for a real terminal program.*/ #include #include #include #include #include  #define BAUDRATE B38400#define MODEMDEVICE "/dev/ttyS1"#define ENDMINITERM 2 /* ctrl-b to quit miniterm */ #define _POSIX_SOURCE 1 /* POSIX compliant source */ #define FALSE 0#define TRUE 1 volatile int STOP=FALSE;  void child_handler(int s){STOP=TRUE;} main(){int fd,c;struct termios oldtio,newtio,oldstdtio,newstdtio;struct sigaction sa; /* Open modem device for reading and writing and not as controlling ttybecause we don't want to get killed if linenoise sends CTRL-C.*/fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY);if (fd <0) {perror(MODEMDEVICE); exit(-1); } tcgetattr(fd,&oldtio); /* save current modem settings */ /* Set bps rate and hardware flow control and 8n1 (8bit,no parity,1 stopbit).Also don't hangup automatically and ignore modem status.Finally enable receiving characters.*/newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD; /*Ignore bytes with parity errors and make terminal raw and dumb.*/newtio.c_iflag = IGNPAR; /*Raw output.*/newtio.c_oflag = 0; /*Don't echo characters because if you connect to a host it or yourmodem will echo characters for you. Don't generate signals.*/newtio.c_lflag = 0; /* blocking read until 1 char arrives */newtio.c_cc[VMIN]=1;newtio.c_cc[VTIME]=0; /* now clean the modem line and activate the settings for modem */tcflush(fd, TCIFLUSH);tcsetattr(fd,TCSANOW,&newtio); /*Strange, but if you uncomment this command miniterm will not workeven if you stop canonical mode for stdout. This is a linux bug.*/tcsetattr(1,TCSANOW,&newtio); /* stdout settings like modem settings */ /* next stop echo and buffering for stdin */tcgetattr(0,&oldstdtio);tcgetattr(0,&newstdtio); /* get working stdtio */newstdtio.c_lflag &= ~(ICANON | ECHO);tcsetattr(0,TCSANOW,&newstdtio); /* terminal settings done, now handle in/ouput */switch (fork()){case 0: /* child *//* user input */close(1); /* stdout not needed */for (c=getchar(); c!= ENDMINITERM&#59; c=getchar()) write(fd,&c,1);tcsetattr(fd,TCSANOW,&oldtio); /* restore old modem setings */tcsetattr(0,TCSANOW,&oldstdtio); /* restore old tty setings */close(fd);exit(0); /* will send a SIGCHLD to the parent */break;case -1:perror("fork");tcsetattr(fd,TCSANOW,&oldtio);close(fd);exit(-1);default: /* parent */close(0); /* stdin not needed */sa.sa_handler = child_handler;sa.sa_flags = 0;sigaction(SIGCHLD,&sa,NULL); /* handle dying child */while (STOP==FALSE) /* modem input handler */{read(fd,&c,1); /* modem */write(1,&c,1); /* stdout */}wait(NULL); /* wait for child to die or it will become a zombie */break;}}  
Espero que te sirva.

Un saludo.

Ruben3d

Navegación

[0] Índice de Mensajes

Ir a la versión completa