[Programación] programación del puerto serie

danilo en tau.org.ar danilo en tau.org.ar
Lun Dic 31 17:41:08 ART 2007


Hola emiliano,

la verdad que hace rato que no hago nada de esto pero el material con el
que aprendí era con esta guia de programación :

http://www.easysw.com/~mike/serial/serial.html si lo querés programar en C

Ahora si buscás recursos para hacerlo en Perl vas a ver que es mucho más
sencillo y hay varios ejemplos en la red

saludos




> Hola, alguien podría tirarme un cable sobre como programar el puerto
> el serie, el tema es así, tengo un pequeño receptor que se conecta al
> puerto serie y su correspondiente control remoto, lo único que quiero
> por ahora es hacer un programita me muestre lo que lee del puerto
> serie cada vez que se apreta una tecla del control remoto, si, con
> Lirc ya lo probé y funciona bien, pero no me interesa usar Lirc.. por
> que la idea es usar un poco del tiempo libre que tengo estos días para
> aprender sobre programación del puerto serie y tengo ese dispositivo
> para probar,  hasta ahora lo que tengo es este código que conseguí en
> el "COMO de programación del puerto serie", pero se queda esperando y
> jamás me muestra nada.. no se como seguir... si alguien tiene
> experiencia en esto y me puede dar una mano se la agradecería
> muchísimo.
>
> #include <sys/types.h>
> #include <sys/stat.h>
> #include <fcntl.h>
> #include <termios.h>
> #include <stdio.h>
> #include <stdlib.h>
>
> /* la tasa de baudios esta definida en  <asm/termbits.h>, que esta
>    incluida <termios.h> */
>
> #define BAUDRATE B1200
>
> /* cambie esta definicion por el puerto correcto  */
> #define MODEMDEVICE "/dev/ttyS1"
>
> #define _POSIX_SOURCE 1 /* fuentes cumple POSIX  */
>
> #define FALSE 0
> #define TRUE 1
>
> volatile int STOP=FALSE;
>
> int main(void)
> {
>         int fd,c, res;
>         struct termios oldtio,newtio;
>         char buf[255];
>
>         /*
>         Abre el dispositivo modem para lectura y escritura y no como
> controlador
>         tty porque no queremos que nos mate si el ruido de la linea envia
>         un CTRL-C.
>         */
>
>         fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
>         if (fd <0) {
>                 perror(MODEMDEVICE); exit(EXIT_FAILURE);
>         }
>
>         tcgetattr(fd,&oldtio); /* almacenamos la configuracion actual
> del puerto */
>
>         bzero(&newtio, sizeof(newtio)); /* limpiamos struct para recibir
> los
>                                         nuevos parametros del puerto */
>
>         /*
>         BAUDRATE: Fija la tasa bps. Podria tambien usar cfsetispeed y
> cfsetospeed.
>         CRTSCTS : control de flujo de salida por hardware (usado solo
> si el cable
>         tiene todas las lineas necesarias Vea sect. 7 de Serial-HOWTO)
>         CS8     : 8n1 (8bit,no paridad,1 bit de parada)
>         CLOCAL  : conexion local, sin control de modem
>         CREAD   : activa recepcion de caracteres
>         */
>
>         newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
>
>         /*
>         IGNPAR  : ignora los bytes con error de paridad
>         ICRNL   : mapea CR a NL (en otro caso una entrada CR del otro
> ordenador
>         no terminaria la entrada) en otro caso hace un dispositivo en
> bruto
>         (sin otro proceso de entrada)
>         */
>
>         newtio.c_iflag = IGNPAR | ICRNL;
>
>         /*
>         Salida en bruto.
>         */
>         newtio.c_oflag = 0;
>
>         /*
>         ICANON  : activa entrada canonica
>         desactiva todas las funcionalidades del eco, y no envia segnales
> al
>         programa
>         llamador
>         */
>
>         newtio.c_lflag = ICANON;
>
>         /*
>         inicializa todos los caracteres de control
>         los valores por defecto se pueden encontrar en
> /usr/include/termios.h,
>         y vienen dadas en los comentarios, pero no los necesitamos aqui
>         */
>
>         newtio.c_cc[VINTR]    = 0;     /* Ctrl-c */
>         newtio.c_cc[VQUIT]    = 0;     /* Ctrl-\ */
>         newtio.c_cc[VERASE]   = 0;     /* del */
>         newtio.c_cc[VKILL]    = 0;     /* @ */
>         newtio.c_cc[VEOF]     = 4;     /* Ctrl-d */
>         newtio.c_cc[VTIME]    = 0;     /* temporizador entre caracter,
> no usado */
>         newtio.c_cc[VMIN]     = 1;     /* bloqu.lectura hasta llegada
> de caracter. 1 */
>         newtio.c_cc[VSWTC]    = 0;     /* '\0' */
>         newtio.c_cc[VSTART]   = 0;     /* Ctrl-q */
>         newtio.c_cc[VSTOP]    = 0;     /* Ctrl-s */
>         newtio.c_cc[VSUSP]    = 0;     /* Ctrl-z */
>         newtio.c_cc[VEOL]     = 0;     /* '\0' */
>         newtio.c_cc[VREPRINT] = 0;     /* Ctrl-r */
>         newtio.c_cc[VDISCARD] = 0;     /* Ctrl-u */
>         newtio.c_cc[VWERASE]  = 0;     /* Ctrl-w */
>         newtio.c_cc[VLNEXT]   = 0;     /* Ctrl-v */
>         newtio.c_cc[VEOL2]    = 0;     /* '\0' */
>
>         /*
>         ahora limpiamos la linea del modem y activamos la configuracion
> del
>         puerto
>         */
>
>         tcflush(fd, TCIFLUSH);
>         tcsetattr(fd,TCSANOW,&newtio);
>
>         /*
>         configuracion del terminal realizada, ahora manejamos las
> entradas.
>         En este ejemplo, al introducir una  'z' al inicio de linea
> terminara el
>         programa.
>         */
>
>         while (STOP==FALSE) {     /* bucle hasta condicion de terminar */
>
>         /*
>         bloque de ejecucion de programa hasta que llega un caracter de fin
> de
>         linea, incluso si llegan mas de 255 caracteres.
>         Si el numero de caracteres leidos es menor que el numero de
> caracteres
>         disponibles, las siguientes lecturas devolveran los caracteres
> restantes.
>         'res' tomara el valor del numero actual de caracteres leidos.
>         */
>
>                 res = read(fd,buf,255);
>                 buf[res]=0;             /* envio de fin de cadena, a
> fin de poder usar printf */
>                 printf("Llegó un dato.\n");
>                 printf(":%s:%d\n", buf, res);
>                 if (buf[0]=='z') STOP = TRUE;
>
>         }
>
>         /* restaura la anterior configuracion del puerto  */
>
>         tcsetattr(fd,TCSANOW,&oldtio);
>         exit(EXIT_SUCCESS);
> }
>
> _______________________________________________
> Programacion mailing list
> Programacion en lugro.org.ar
> http://www.lugro.org.ar/mailman/listinfo/programacion
>




More information about the Programacion mailing list