programacion serial linux

necesito orientacion por parte de alguien que haya programado transmision por puerto serie en linux en lo posible algun codigo de ejemplo o sugerencias.

mi principal necesidad es que el programa pueda recibir datos por el puerto serie y los pueda mostrar en pantalla lo que llegue.

Reply to
+mArkO+
Loading thread data ...
+mArkO+ escribió:
¿No te gustó mi respuesta del 3 de septiembre?
--
Saludos
Miguel Giménez
Reply to
Miguel Gimenez

hola Miguel, el problema es que no tengo mucha idea de programacion en linux. del hola mundo no he pasado. la cosa es que copie el codigo y lo intente compilar, pero me arroja 2 errores. si pudieras guiarme con aquello te lo agradeceria mucho. la idea principal es que lea por el puerto serie y muestre en pantalla. con esa premisa podria comenzar a ingeniarme el resto de lo que necesito.

"Miguel Gimenez" escribió en el mensaje news:fgahfi$ibj$ snipped-for-privacy@aioe.org...

Reply to
+mArkO+

A ver, seguro que voy a decir una borriquería, pero allá va. Yo no he tocado nada de Linux, pero hace unos pocos de años sí toqué algo de Unix, que supuestamente se le parece. Tampoco es que tuviera mucha idea, lo justo para iniciar o cerrar una sesión, y configurar y hacer algunas pruebas con unos ordenadores bajo Unix que manejaban los surtidores de una cadena de gasolineras.

Los surtidores se comunicaban con el PC por puertos serie (llevaban tarjetas multi-puerto de 4 ó 8 puertos serie), y recuerdo que, mediante un simple comando de Unix, se podía hacer que la pantalla y el teclado se comportaran como un terminal tonto, de forma que la pantalla visualizaba todo lo que recibía un puerto serie, y lo que tecleabas se enviaba por ese mismo puerto serie. Esto era algo que utilizábamos durante la puesta en servicio, para ver qué surtidores respondían correctamente, o para identificar qué cable correspondía a cada surtidor (si no los habían marcado los que hacían el cableado).

Digo yo que algo parecido debería poder hacerse en Linux, directamente en la línea de comandos. No recuerdo ya como era, pero me suena algo como LLIST con unos cuantos parámetros detrás.

--


Saludos de Jose Manuel Garcia
jose.mgg@terra.es
http://213.97.130.124


"Miguel Gimenez"  escribió en el mensaje
news:fgahfi$ibj$1@aioe.org...
> +mArkO+ escribió:
> > necesito orientacion por parte de alguien que haya programado
transmision
> > por puerto serie en linux
> > en lo posible algun codigo de ejemplo o sugerencias.
> >
> > mi principal necesidad es que el programa pueda recibir datos por el
puerto
> > serie y los pueda mostrar en pantalla lo que llegue.
>
>
> ¿No te gustó mi respuesta del 3 de septiembre?
>
>
> -- 
> Saludos
> Miguel Giménez
>
Reply to
Pepitof

El Wed, 31 Oct 2007 15:52:29 -0300, +mArkO+ escribió:

He compilado lo que te envié y faltaba una línea con la definición de newtio y oldtio. Te adjunto de nuevo el programa corregido. newtio se usa para configurar el puerto (baudios, bits de datos, bits de stop, paridad y uso de RTS/CTS). El programa del que saqué este resumen lo usaba en el servidor Linux para guardar la información proporcionada por una estación meteorológica, corría en background.

Si tienes dudas sobre los comandos puedes poner man comando o buscar en Google.

Al compilarlo (gcc serie.c) te generará un archivo a.out que se ejecuta escribiendo ./a.out . Asegúrate de que a.out tiene permisos de ejecución (rwx o r-x).

#include #include #include #include #include #include #include #include #include #include

void signal_handler_IO(int status);

volatile int data_ready = 0;

int main(int argc, char **argv) { int fd; char Port[] = "/dev/ttyS0", Buffer[256]; struct sigaction saio; struct termios newtio, oldtio;

printf("Esperando datos del puerto %s\n", Port);

/* Open the device to be non-blocking (read will return immediatly) */ fd = open(Port, O_RDWR | O_NOCTTY | O_NONBLOCK); if (fd < 0) return(1);

/* Install the signal handler before making the device asynchronous */ saio.sa_handler = signal_handler_IO; sigemptyset(&saio.sa_mask); saio.sa_flags = 0; saio.sa_restorer = NULL; sigaction(SIGIO, &saio, NULL);

/* Allow the process to receive SIGIO */ fcntl(fd, F_SETOWN, getpid());

/* Make the file descriptor asynchronous */ fcntl(fd, F_SETFL, FASYNC);

/* Save current port settings */ tcgetattr(fd, &oldtio);

/* Set new port settings for canonical input processing */ newtio.c_cflag = CRTSCTS | CS8 | CLOCAL | CREAD | PARENB; newtio.c_iflag = IGNPAR | ICRNL; newtio.c_oflag = 0; newtio.c_lflag = ICANON; newtio.c_cc[VMIN] = 1; newtio.c_cc[VTIME] = 0; cfsetispeed(&newtio, B9600); cfsetospeed(&newtio, B9600); tcflush(fd, TCIFLUSH); tcsetattr(fd, TCSANOW, &newtio);

/* Wait for any signal */ pause();

if (data_ready) { read(fd, Buffer, sizeof(Buffer)); printf(Buffer); }

/* Restore old port settings */ tcsetattr(fd, TCSANOW, &oldtio);

/* Close the port */ close(fd);

return(0); }

void signal_handler_IO (int status) { data_ready = 1; }

--
Saludos
Miguel Gimenez
Reply to
Miguel Gimenez

Siguiendo esta l=EDnea digo yo que un terminal serie hace exactamente esto. Por ejemplo Minitty o algo as=ED (lo que ser=EDa hyperterminal en windows). En todas las distribuciones hay alg=FAn programa terminal.

tas

aran

erto

ra

cable

an el

en la

ST

Reply to
Jeroni Paul

ahora si que al compilar lo hace bien, MUCHAS GRACIAS POR TU PACIENCIA.

sigo sin poder hacer que funcione la transmision, pero al menos vamos para alla xD

estoy intentando enviar datos desde el hyperterminal de windows y que los reciba linux, pero aun no logro hacerlo, segun entiendo debo settear: la velocidad en 9600 bauds y 8 bits de datos

"Miguel Gimenez" escribió en el mensaje news:fgb1ge$42l$ snipped-for-privacy@aioe.org...

Reply to
+mArkO+
+mArkO+ escribió:

Tienes que configurar el handshake en ambos equipos, puede ser RTS/CTS (hardware), XON/XOFF (software) o no haberlo. Lo más normal es hacerse un cable módem nulo y dejar handshake hardware. Por otra parte, ten en cuenta que si quieres comunicar dos DTEs (en tu caso PCs) necesitas un cable cruzado, ya que los cables rectos son solo para comunicación DTE/DCE.

La configuración del handshake se hace en estas líneas del código que te mandé: newtio.c_cflag = *CRTSCTS* | CS8 | CLOCAL | CREAD | PARENB; ... tcsetattr(fd, TCSANOW, &newtio);

En Hyperterminal se hace en Conexión->Propiedades.

El programa, tal y como te lo mandé, te imprime los primeros datos que le lleguen y termina. Si quieres eco continuo tienes que modificarlo añadiendo un while y una condición de terminación (recepción de un '+', por ejemplo).

--
Saludos
Miguel Giménez
Reply to
Miguel Gimenez

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.