Diferencia entre revisiones de «Tutorial:Puerto serie en Linux»

De WikiRobotics
Saltar a: navegación, buscar
(Puerto serie y Linux)
Línea 62: Línea 62:
  
 
La forma de acceder al puerto serie es la misma que para trabajar con cualquier otro fichero. Se usan las llamadas '''read()''' y '''write()''' para leer y escribir respectivamente. Pero a diferencia de los archivos normales, '''antes de usar el puerto serie es necesario configurarlo''', estableciendo la velocidad de trabajo y su modo de funcionamiento.
 
La forma de acceder al puerto serie es la misma que para trabajar con cualquier otro fichero. Se usan las llamadas '''read()''' y '''write()''' para leer y escribir respectivamente. Pero a diferencia de los archivos normales, '''antes de usar el puerto serie es necesario configurarlo''', estableciendo la velocidad de trabajo y su modo de funcionamiento.
 +
 +
== Módulo serial.c ==
 +
=== Código fuente ===
 +
{| {{tablabonita}}
 +
| [http://svn.iearobotics.com/serial/trunk/serial/serial.c serial.c]
 +
| Fuentes del módulo para comunicaciones serie (en el SVN)
 +
|----
 +
| [http://svn.iearobotics.com/serial/trunk/serial/serial.h serial.h]
 +
| Ficheros de cabecera
 +
|}
 +
 +
=== Descripción ===
 +
El módulo serial.c es el que implementa las funciones para '''abir/cerrar''' el puerto serie y '''enviar/recibir''' datos. El resto de ejemplos hacen uso de ellas.
 +
 +
La función '''serial_open()''' abre el puerto serie para lectura/escritura y en '''modo crudo''' (raw). En este modo no se procesan ciertos caracteres especiales de control. Se usa el puerto serie sólo para enviar/recibir bytes sin interpretarlos.
 +
 +
Se configura el '''modo de funcionamiento serie a 8N1''' (8 bits de datos, 1 bit de stop y sin paridad).
 +
La velocidad es la indicada por el usuario en el parámetro baud. Es una constante que puede valer: B9600, B19200, etc. Se puede encontrar más información sobre todos los valores posibles en la '''página de manual de termios''' (man termios)
 +
 +
int '''serial_open'''(char *serial_name, speed_t baud)
 +
{
 +
  struct termios newtermios;
 +
  int fd;
 +
 +
  fd = open(serial_name,O_RDWR | O_NOCTTY);
 +
 +
  newtermios.c_cflag= CBAUD | CS8 | CLOCAL | CREAD;
 +
  newtermios.c_iflag=IGNPAR;
 +
  newtermios.c_oflag=0;
 +
  newtermios.c_lflag=0;
 +
  newtermios.c_cc[VMIN]=1;
 +
  newtermios.c_cc[VTIME]=0;
 +
 +
  cfsetospeed(&newtermios,baud);
 +
  cfsetispeed(&newtermios,baud);
 +
 
 +
  if (tcflush(fd,TCIFLUSH)==-1) return -1;
 +
  if (tcflush(fd,TCOFLUSH)==-1) return -1;
 +
  if (tcsetattr(fd,TCSANOW,&newtermios)==-1) return -1; 
 +
 +
  return fd;
 +
}
 +
 +
  
 
== Ejemplo 1: enviar/recibir cadenas ==
 
== Ejemplo 1: enviar/recibir cadenas ==
Línea 80: Línea 124:
 
| [http://svn.iearobotics.com/serial/trunk/term_ex/console_io.c console_io.c]
 
| [http://svn.iearobotics.com/serial/trunk/term_ex/console_io.c console_io.c]
 
| Fuentes de las Rutinas para control del teclado, en el SVN
 
| Fuentes de las Rutinas para control del teclado, en el SVN
|}
 
 
== Módulo serial.c ==
 
{| {{tablabonita}}
 
| [http://svn.iearobotics.com/serial/trunk/serial/serial.c serial.c]
 
| Fuentes del módulo para comunicaciones serie (en el SVN)
 
|----
 
| [http://svn.iearobotics.com/serial/trunk/serial/serial.h serial.h]
 
| Ficheros de cabecera
 
 
|}
 
|}
  

Revisión del 02:02 20 ene 2009

Introducción

Breve tutorial sobre cómo manejar el puerto serie desde Linux. Yo lo utilizo para comunicarme con microcontroladores externos y para el control de mis robots. Aunque nuestro ordenador no disponga de puerto serie, no hay problema. Se pueden utilizar conversores USB-serie.

Los ejemplos de este tutorial se han probado en la distribución de Linux Debian/Lenny (5.0)

Compilación

Para compilar los ejemplos, seguir los siguientes pasos:

  1. Descargar el paquete con los ejemplos:
  2. Descomprimirlo
  3. Entrar en el directorio serial-1.0
  4. Ejecutar make
$ make
gcc -o serial.o -c serial/serial.c
gcc -Iserial   -c -o send_receive_ex/send_receive.o send_receive_ex/send_receive.c
gcc -o send_receive send_receive_ex/send_receive.o  serial.o
gcc -Iserial   -c -o term_ex/term.o term_ex/term.c
gcc -Iserial   -c -o term_ex/console_io.o term_ex/console_io.c
gcc -o term term_ex/term.o term_ex/console_io.o serial.o

Pruebas con el puerto serie

Para probar los ejemplos de este tutorial es necesario tener conectado un dispositivo al puerto serie que nos haga "eco" de todo lo recibido. De esta manera se puede verificar que el software del PC está funcionando correctamente.

Existen varias alternativas:

  • Alternativa 1: Utilizar un cable para unir los pines 2 y 3 del puerto serie. Todo lo que se envíe por el pin de transmisión (TX) se recibirá automáticamente por el de recepción (RX).
  • Alternativa 2: Utilizar un microcontrolador externo que ejecute un firmware para hacer eco. Esta es la opción que se ha usado para probar los ejemplos de este tutorial. Se ha utilizado la tarjeta Skypic

Pruebas con la tarjeta Skypic

  • Tarjeta Skypic, conectada al PC por medio de un cable serie o conversor USB-serie
  • El firmware grabado es el Servidor de eco
  • Si se conecta la tarjeta Freeleds al puerto B de la Skypic, se podrá ver en binario todo lo que se ha recibido.
  • La Skypic se configura muy fácilmente para este ejemplo ejecutando el programa Pydownloader-wx y pulsando el botón de "ECO", que descarga automáticamente el servidor de eco.
Pantallazo del programa Pydownloader. Pulsar el botón de ECO para descargar el firmware necesario para este tutorial
La tarjeta Freeleds conectada a la Skypic para hacer ejecutar los programas de este tutorial

Puerto serie y Linux

Los nombres que se dan en Linux a los dispositivos serie son:

Nombre del dispositivo Descripción
/dev/ttyS0 Primer puerto serie nativo. (Equivalente a COM1 en Windows)
/dev/ttyS1 Segundo puerto serie nativo. (Equivalente a COM2 en Windows)
/dev/ttySnn n-ésimo puerto serie nativo
/dev/ttyUSB0 Conversor USB-serie 1
/dev/ttyUSB1 Conversor USB-serie 2
/dev/ttyUSBnn n-ésimo conversor USB-serie

La forma de acceder al puerto serie es la misma que para trabajar con cualquier otro fichero. Se usan las llamadas read() y write() para leer y escribir respectivamente. Pero a diferencia de los archivos normales, antes de usar el puerto serie es necesario configurarlo, estableciendo la velocidad de trabajo y su modo de funcionamiento.

Módulo serial.c

Código fuente

serial.c Fuentes del módulo para comunicaciones serie (en el SVN)
serial.h Ficheros de cabecera

Descripción

El módulo serial.c es el que implementa las funciones para abir/cerrar el puerto serie y enviar/recibir datos. El resto de ejemplos hacen uso de ellas.

La función serial_open() abre el puerto serie para lectura/escritura y en modo crudo (raw). En este modo no se procesan ciertos caracteres especiales de control. Se usa el puerto serie sólo para enviar/recibir bytes sin interpretarlos.

Se configura el modo de funcionamiento serie a 8N1 (8 bits de datos, 1 bit de stop y sin paridad). La velocidad es la indicada por el usuario en el parámetro baud. Es una constante que puede valer: B9600, B19200, etc. Se puede encontrar más información sobre todos los valores posibles en la página de manual de termios (man termios)

int serial_open(char *serial_name, speed_t baud)
{
  struct termios newtermios;
  int fd;

  fd = open(serial_name,O_RDWR | O_NOCTTY); 

  newtermios.c_cflag= CBAUD | CS8 | CLOCAL | CREAD;
  newtermios.c_iflag=IGNPAR;
  newtermios.c_oflag=0;
  newtermios.c_lflag=0;
  newtermios.c_cc[VMIN]=1;
  newtermios.c_cc[VTIME]=0;

  cfsetospeed(&newtermios,baud);
  cfsetispeed(&newtermios,baud);
 
  if (tcflush(fd,TCIFLUSH)==-1) return -1;
  if (tcflush(fd,TCOFLUSH)==-1) return -1;
  if (tcsetattr(fd,TCSANOW,&newtermios)==-1) return -1;  

  return fd;
}


Ejemplo 1: enviar/recibir cadenas

Código fuente

send_receive.c Fuentes del ejemplo, en el SVN

Ejemplo 2: Mini-terminal

Código fuente

term.c Fuentes del terminal, en el SVN
console_io.c Fuentes de las Rutinas para control del teclado, en el SVN

Descarga de los ejemplos

Versión: 1.0

Fichero Descripción
[] Fuentes
[] Binarios compilados (Debian Lenny 5.0)

Licencia

Cc logo.png This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Spain License.
150px El código está liberado bajo licencia GPLv3

Autor

Juan González Gómez

Enlaces

Repositorio

Para obtener la última versión del SVN:

svn co http://svn.iearobotics.com/serial/trunk

Noticias

  • 19/Enero/2009: Comenzada esta página