🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.os.linux.programacion
Article #10174

Cuestiones sobre programacion puerto serie

#10174
From: Jesús Ángel
Date: Tue, 19 Mar 2002 13:20
141 lines
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-mail

Show 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)