Article View: es.comp.os.linux.programacion
Article #10174Cuestiones sobre programacion puerto serie
From: Jesús Ángel
Date: Tue, 19 Mar 2002 13:20
Date: Tue, 19 Mar 2002 13:20
141 lines
5983 bytes
5983 bytes
Hola a todos/as
He hecho un programa para leer datos del puerto serie (/dev/ttyS1).
B�sicamente es el ejemplo que viene en el como de Programaci�n-Serie.
Lo he probado como suiere el como. Conectando un cable null modem entre
los dos puertos serie del ordenador, ejecutando un miniterm en
/dev/ttyS0 y comprobando que todo lo que escribo lo lee bien mi
programa, que escucha en /dev/ttyS1.
Ahora vienen los problemas.
No puedo redireccionar la salida del programa a un fichero. El programa
muestra los caracteres le�dos en la salida estandar, pero si
redirecciono la salida a un fichero, en ese fichero no se escribe nada,
aunque en la salida estandar tampoco aparece nada. He probado de varias
formas, pero ninguna me ha funcionado:
programa > fichero
programa > fichero 2>&1
Intent� escribir los caracteres le�dos a un fichero, en lugar de hacerlo
a la salida est�ndar, pero tampoco funcion�. El fichero quedaba vac�o.
En este caso sustitu� las l�neas
printf("%s\n", buffer);
por
fprintf/fdd,""%s\n", buffer);
donde fdd es un puntero a fichero, devuelto por fopen. El fichero se
creaba, pero no se escrib�a nada en el.
Otro problema es la terminaci�n del programa. Utilizo entrada no
can�cica porque el dispositivo conectado al puerto serie env�a los datos
caracter a caracter. La lectura se hace en un bucle do-while, utilizando
la llamada al sistema read(2). La condici�n de terminaci�n del bucle es
que salga cuando read devuelva cero bytes le�dos. El problema es que
read se queda bloqueada hasta que reciba un caracter, por lo que nunca
se cumple la condici�n de terminaci�n del bucle y tengo que finalizar el
programa con CTRL+C.
No se por qu� se queda bloqueada read(2), ya que tengo:
newtio.c_cc[VTIME] = 6; /* inter-character timer */
newtio.c_cc[VMIN] = 1; /* blocking read until 1 character
arrives */
Seg�n el COMO, esto hace que read(2) efect�e la lectura cuando se reciba
un caracter (VMIN=1) o cuando el tiempo entre dos caracteres sea
superior a 0.6s (VTIME=6). Sin embargo el temp�rizador parece no tener
efecto y read(2) se queda esperando el siguiente caracter.
Con VTIME=6 y VMIN=0 s� que funciona el temporizador.
�Se os ocurre alguna raz�n por la que la salida de este programa no se
pueda redirigir a un fichero?
�Alguna otra forma de terminar el bucle de lectura cuando no haya m�s
datos disponibles en el puerto serie?
A continuaci�n est� el c�digo del programa:
#include <ctype.h>
#include <termios.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
/* Configuraci�n del puerto */
#define MODEMDEVICE "/dev/ttyS1" /* COM2 */
#define BAUDRATE B600 /* 600 bits/segundo */
#define FALSE 0
#define TRUE 1
void
main (void)
{
int fd; /* descriptor de fichero */
int leidos; /* caracteres leidos */
char buffer[255]; /* buffer lectura */
struct termios oldtio, newtio; /* configuracion puerto serie */
/* Abrimos el puerto serie en modo lectura
* O_NOCTTY: si se recibe CTRL-C por el tty no queremos parar el programa
* O_RDONLY: solo leemos
*/
fd = open (MODEMDEVICE, O_RDONLY | O_NOCTTY);
if (fd < 0)
{
perror (MODEMDEVICE);
exit (-1);
}
tcgetattr (fd, &oldtio); /* save current serial port settings */
bzero (&newtio, sizeof (newtio)); /* clear struct for new port settings */
/* modos de entrada (lectura) */
newtio.c_iflag = IGNPAR;
/* modos de salida (escritura) */
newtio.c_oflag = 0;
/* modos de control */
newtio.c_cflag = BAUDRATE | CS8 | CSTOPB | CREAD | CLOCAL | CRTSCTS;
/* modos locales */
newtio.c_lflag = 0;
newtio.c_cc[VTIME] = 6; /* inter-character timer */
newtio.c_cc[VMIN] = 1; /* blocking read until 1 character arrives */
/* Configuramos el puerto */
tcflush (fd, TCIFLUSH);
tcsetattr (fd, TCSANOW, &newtio);
/* Empezamos a leer */
do
{
/* leidos = read (fd, buffer, sizeof (buffer)); */
leidos = read (fd, buffer, sizeof (buffer));
buffer[leidos] = 0;
if (isprint (buffer[0]))
printf ("%s\n", buffer);
else
printf ("*\n");
}
while (leidos != 0);
/* Restaramos la config inicial del puerto */
tcsetattr (fd, TCSANOW, &oldtio);
}
Saludos y gracias
--
Jes�s �ngel del Pozo Dom�nguez
Valladolid __�
_ \<_
(_)/(_)
_ _
~0 (_| . - ' - . _ . - ' - . _ . - ' - . |_) O
|(_~|^~~| |~~^|~_)|
TT/_ T"T T"T _\HH
jgs^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Technical Details
Message-ID:
<slrna9efmg.1b5.jpozdom@sol.linux.bogus>Path:
arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!feed2.news.rcn.net!rcn!netnews.com!xfer02.netnews.com!newsfeed1.cidera.com!Cidera!news.comunitel.net!news.rediris.es!newsfeed.bt.es!news.bt.es!not-for-mailShow Full Headers
Complete Article Headers
X-Google-Language: SPANISH,ASCII X-Google-Thread: f86c8,ab207f181b45ad15,start X-Google-Attributes: gidf86c8,public X-Google-ArrivalTime: 2002-03-19 05:30:50 PST Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!newsfeed.stanford.edu!news-spur1.maxwell.syr.edu!news.maxwell.syr.edu!feed2.news.rcn.net!rcn!netnews.com!xfer02.netnews.com!newsfeed1.cidera.com!Cidera!news.comunitel.net!news.rediris.es!newsfeed.bt.es!news.bt.es!not-for-mail From: Jesús Ángel <jpozdom@ribera.tel.uva.es> Newsgroups: es.comp.os.linux.programacion Subject: Cuestiones sobre programacion puerto serie Date: 19 Mar 2002 13:20:21 GMT Organization: Sitio privado Lines: 141 Message-ID: <slrna9efmg.1b5.jpozdom@sol.linux.bogus> NNTP-Posting-Host: cable222a088.usuarios.retecal.es Mime-Version: 1.0 Content-Type: text/plain; charset=iso-8859-1 Content-Transfer-Encoding: 8bit X-Trace: titan.bt.es 1016544021 10826 212.183.222.88 (19 Mar 2002 13:20:21 GMT) X-Complaints-To: abuse@bt.es NNTP-Posting-Date: 19 Mar 2002 13:20:21 GMT User-Agent: slrn/0.9.7.2 (Linux)