¿Cómo hago que el trabajo en serie en la Raspberry Pi3 (o modelo posterior)

Respuestas:

65

Esta respuesta sigue siendo correcta y explica con más detalle la naturaleza de los cambios, pero la mayoría de los usuarios de Raspbian actual solo deben ejecutar sudo raspi-configSeleccionar y Interfacing Options / Serialluego especificar si desea una consola serie (probablemente no) y luego si desea que el hardware del puerto serie esté habilitado (probablemente si). Luego, use /dev/serial0cualquier código que acceda al puerto serie.

El BCM2837 en Raspberry Pi3, Pi3B +, Pi3A +, PiZeroW tiene 2 UART (al igual que sus predecesores), sin embargo, para admitir la funcionalidad Bluetooth, el PL011 UART con todas las funciones se movió de los pines del encabezado al chip Bluetooth y el mini UART disponible en encabezado pines 8 y 10.
(El SOC en el Pi4 tiene UART adicionales, pero los mismos 2 UART que BCM2837 se utilizan para la serie predeterminada en los pines 8 y 10 y Bluetooth).

Esto tiene una serie de consecuencias para los usuarios de la interfaz en serie.

El /dev/ttyAMA0utilizado anteriormente para acceder al UART ahora se conecta a Bluetooth.
El miniUART ya está disponible en /dev/ttyS0.
En el último software de sistema operativo hay una /dev/serial0que selecciona el dispositivo adecuado para que pueda reemplazar /dev/ttyAMA0con /dev/serial0y utilizar el mismo software en el Pi3 y modelos anteriores.

Lamentablemente, hay otras consecuencias:

The mini UART is a secondary low throughput UART  
  intended to be used as a console.
The mini Uart has the following features:
• 7 or 8 bit operation.
• 1 start and 1 stop bit.
• No parities.
• Break generation.
• 8 symbols deep FIFOs for receive and transmit.
• SW controlled RTS, SW readable CTS.
• Auto flow control with programmable FIFO level.
• 16550 like registers.
• Baudrate derived from system clock.

No hay soporte para la paridad y el rendimiento es limitado, pero este último no debería afectar a la mayoría de los usos.

Hay una característica asesina "Baudrate derivado del reloj del sistema" que hace que el miniUART sea inútil ya que este reloj puede cambiar dinámicamente, por ejemplo, si el sistema entra en potencia reducida o en modo de baja potencia.

La modificación de /boot/config.txtelimina esta dependencia al agregar la siguiente línea al final: -

core_freq=250

Esto soluciona el problema y parece tener poco impacto. El SPI clock frequencyy ARM Timertambién dependen del reloj del sistema.

Por alguna extraña razón, el valor predeterminado para Pi3 que usa el último kernel 4.4.9 es DESHABILITAR UART. A fin de que necesita cambiar enable_uart=1en /boot/config.txt. (Esto también corrige core_freqlo que ya no es necesario).

Finalmente, si no usa Bluetooth (o tiene usos poco exigentes), es posible intercambiar los puertos nuevamente en el Árbol de dispositivos. Hay un pi3-miniuart-bty un pi3-disable-btmódulo que se describen en /boot/overlays/README.

Milliways
fuente
Gracias @Milliways por la gran explicación. Sin embargo, lo que no he visto ... Tengo un módulo de radio que se conecta a mi frambuesa usando UART y prefiere una velocidad de transmisión de 9600. Entonces, ¿eso debería funcionar si configuro core_freq=250y luego configuro mi velocidad de transmisión en el script ma python? Además, sería genial si pudieras echar un vistazo a: raspberrypi.stackexchange.com/questions/47379/… ¡ Gracias!
Georg
Intenté / dev / serial0 y enable_uart = 1 en /boot/config.txt, con un código de cableado que solía funcionar con raspberry pi 2, pero todavía no puede iniciar la comunicación en serie (la condición de retorno es -1). También probé / dev / S0 en vano. ¿Qué me podría estar perdiendo? (también liberado el puerto serie de raspi-config). (todo, incluido raspbian, está actualizado)
ozgeneral
1
@ OE1 Si tiene una pregunta, hágala en una nueva pregunta, no en Comentarios.
Milliways
Estoy un poco confundido ¿Cómo quieres decir que no es compatible con la paridad? Tengo un dispositivo con el que mi pi3 habla y tiene que tener PARIDAD INCLUSO o mi sistema no hablará con él. Después de seguir su respuesta y la respuesta de naseer, pude hacer que mi pi3 ejecutara mi programa, hable EXITOSAMENTE con este dispositivo que está configurado para PARIDAD PARCIAL.
Jueves
1
¿Podría agregar que el convertidor de USB a UART debe ser compatible con 3.3V y no con 5V?
MaNyYaCk
20

finalmente esto consiguió trabajo para mi pi3 (os: debian jessie)

Siga estos 6 pasos cuidadosamente.

Paso 1: instale Raspbian Jessie en una tarjeta SD y arranque el Pi cuando esté conectado a una red Inicie sesión a través de un terminal o escritorio y shell Configure el sistema con:

sudo raspi-config

Expanda el sistema de archivos y habilite el serial en la página avanzada, salga y reinicie.

Paso 2: esto no será necesario si tienes una nueva versión de jessie Actualiza el sistema con:

sudo apt-get update

sudo apt-get upgrade

Paso 3: configuración del árbol de dispositivos de la siguiente manera:

Agregue el árbol de dispositivos a /boot/config.txt para deshabilitar el bluetooth Raspberry Pi 3.

sudo nano /boot/config.txt

Agregar al final del archivo

* si desea cambiar el blutooth al puerto miniuart (malo)

dtoverlay=pi3-miniuart-bt

* si quieres desactivar el blutooth (bueno)

dtoverlay=pi3-disable-bt

Salga del editor guardando sus cambios.

Paso 4 - reinicia el pi

sudo reboot

paso 5 -

a) para deshabilitar la consola serie, edite el archivo usando

sudo nano /boot/cmdline.txt

eliminar la palabra fase " console=serial0,115200" o " console=ttyAMA0,115200"

Salga y guarde sus cambios

b) para habilitar la consola serie, edite el archivo usando

sudo nano /boot/cmdline.txt

Cambie el archivo a lo siguiente:

dwc_otg.lpm_enable=0 console=tty1 console=serial0(or ttyAMA0),115200 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

Salga y guarde sus cambios

Paso 6 - reinicia el pi

sudo reboot

----------------- eso es todo, diviértete ---------------------------- ---

naseer mohammad
fuente
En rpi2 esto funciona y lo tengo conectado a una placa de relé bluetooth y le envío mensajes a través de comandos AT. ¿Pero puedo recibir datos de un arduino de esta manera?
marciokoko
10

La respuesta de Naseer es correcta pero un poco elaborada si acabas de mostrar el último rasbian. Todo lo que necesitaba hacer es agregar la siguiente línea a mi config.txt (desde, por ejemplo, Windows donde conecta la tarjeta SD en la partición fat32):

dtoverlay=pi3-disable-bt

Luego, conéctelo, y el pi imprimirá directamente cosas en los pines de la consola.

Arnout
fuente
¿Cómo puede funcionar esto? ¡Bluetooth UART ni siquiera está conectado a los pines GPIO!
Dmitry Grigoryev
44
@DmitryGrigoryev Funciona para mí en mi PI 3.
ThN
2
Esto también funcionó para mí, descubrí que este hilo ayudó a aclarar algunos pequeños problemas: raspberrypi.org/forums/…
Chris