Usar el Puerto Serie del Raspberry Pi

El único puerto serie disponible en el Raspberry Pi esta en los GPIO14(Tx) y GPIO15(Rx) pero por defecto  está configurado para ser usado por la consola de linux y para enviar la información del bootup. Si queremos usarlo entonces…

1- Para desactivar la consola hay que editar el archivo “/etc/inittab”  en el final comentar la linea T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100   (para comentar colocar el caracter numeral (#) delante de la linea)

2- Para desactivar la información del bootup hay que editar el archivo “/boot/cmdline.txt”  y quitar toda referencia a ttyAMA0 (que es el nombre de este puerto) . Ejemplo el archivo puede tener el siguiente contenido:
dwc_otg.lpm_enable=0 console=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
En este caso debe de quedar asi:
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait

Para que los cambios se apliquen hay que reiniciar. Luego de reiniciar para probar se puede usar el programa minicom que puede ser instalado con el comando:
sudo apt-get install minicom
luego basta con iniciar minicom por ejemplo con el siguiente comando:
minicom -b 9600 -o -D /dev/ttyAMA0
Luego desde la PC conectar tambien a 9600.

UPDATE PARA Raspberry Pi 3
En el Raspberry Model B,B++ los pinos GPIO 14/15 estan mapeados a la UART0, pero en el Pi3 estos pinos están mapeados a la UART1 porque la UART0 es ahora usada para el Bluetooth, el problema es que la UART1 es por software y el baudrate depende de la velocidad del reloj que puede variar en dependencia de la carga del CPU ósea no es lo suficientemente estable. Una solución es desactivar el módulo bluetooth y volver a mapear los pinos 14/15 para la UART0.
1- En el fichero “sudo nano /boot/config.txt” adicionar al final la línea “dtoverlay=pi3-disable-bt”
2- Desactivar el modem con el comando “sudo systemctl disable hciuart”
3- Reiniciar, después de esto los pinos 14/15 estaran mapeados a la UART0 (ttyAMA0)

8 comentarios en “Usar el Puerto Serie del Raspberry Pi

  1. Estoy trabajando el puerto serial de una Raspberry pi 3 modelo B, tengo el siguiente código:

    El problema que tengo es que me envía la cadena, pero no me la devuelve. Mi idea realmente es transmitir valores a la Raspberry y poderlos almacenar en un archivo

    #!/usr/bin/env python
    # -*- coding: iso-8859-15 -*-

    #—————————————————————————-
    # sg-eco1.py Ejemplo de manejo del puerto serie desde python utilizando la
    # libreria multiplataforma pyserial.py (http://pyserial.sf.net)
    #
    # Se envia una cadena por el puerto serie y se muestra lo que se recibe
    #
    # (C)2002 Chris Liechti (cliechti@gmx.net)
    # (C)2007 Juan Gonzalez
    #
    # LICENCIA GPL
    #—————————————————————————-

    import sys
    import serial
    import time

    #– Valor por defecto del puerto a usar
    #– Para que sea multiplataforma hay que emplear numeros entre 0 y 255
    #– Pero tambien se pueden usar cadenas ej. /dev/ttyUSB0 en Linux
    Puerto = 0

    #– Cadena de pruebas a enviar
    Cadena = “Hola como estas”

    #– Sacar mensaje inicial
    print (“Pruebas del puerto serie”)

    #———————————————————-
    #– Abrir el puerto serie. Si hay algun error se termina
    #———————————————————-
    try:
    s = serial.Serial (‘/dev/ttyS0’, baudrate = 9600, timeout=1)
    s.timeout=1;

    except serial.SerialException:
    #– Error al abrir el puerto serie
    sys.stderr.write(“Error al abrir puerto (%s)\n” % str(Puerto))
    sys.exit(1)

    #– Mostrar el nombre del dispositivo serie utilizado
    print (“Puerto (%d): %s” % (Puerto,s.portstr))

    #————————————————-
    #– Aqui empieza la prueba
    #————————————————-

    #– Enviar la cadena de pruebas
    print (“ENVIADO : ” + Cadena)
    s.write(Cadena)

    #– Esperar hasta recibir la cadena enviada…
    #– O hasta que haya un timeout
    recibido = s.read(len(Cadena))
    time.sleep(10)
    print (“RECIBIDO: ” + recibido)

    #– Comprobar lo recibido
    if len(recibido)!=0:

    #–Cadena recibida. Imprimirla
    print (“RECIBIDO: “) + recibido

    #– Comprobar si lo que se ha recibo es exactamente lo mismo que lo
    ##– enviado
    if recibido==Cadena:
    print (“OK!”)

    else:

    #print “Error!”
    #else:

    #– No se ha recibido ninguna cadena: timeout
    print (“TIMEOUT”);

    #– Cerrar puerto serie
    s.close()

    1. Hola, disculpa la demora en la respuesta pero estaba viajando por lugares sin ninguna comunicación. Si entendí bien estas tratándo de “probar” el puerto serial del raspberry pi enviando un texto y recibiendo el mismo de vuelta, yo no tengo experiencia en phyton pero el código parece bien, mi pregunta es: Tienes cortocircuitado el Tx y Rx de ese adaptador usb-serial?
      Porqué como espera recibir el mismo texto que envias sin que “alguien” te lo envie? o no entendí tú situación.

    1. Hola David,
      La última versión del Raspian (jessie) no usa SysVinit (que es a quien pertenece el archivo inittab), ahora Raspian utiliza systemd que no usa ese archivo. En este caso no necesitas hacer nada.

      1. GRACIAS DEULIS, YA PUDE HACER LA CONEXION, PERO TENGO UNA DUDA NO PUEDE INCIAR LA CONEXION CON EL MODULO, AL EJECUTAR EL COMANDO AT+SAPBR=1,1 ME DICE ERROR, NO PUEDO ABRIR GPRS CONTEXT

        1. David, para poder ser más útil voy a necesitar saber cual modulo estas usando (al parecer es un modem) y tambien necesito saber como es la conexión que hiciste con ese módulo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *