Como faço para trabalhar em série no Raspberry Pi3 (ou modelo posterior)

44

Meu console serial Pi3 produz lixo e falha ao responder ao teclado.

Milliways
fonte

Respostas:

65

Esta resposta ainda está correta e explica com mais detalhes a natureza das alterações, mas a maioria dos usuários do Raspbian atual deve executar o sudo raspi-configSelect Interfacing Options / Seriale especificar se você deseja um console serial (provavelmente não) e se o hardware da porta serial está ativado (provavelmente sim). Em seguida, use /dev/serial0em qualquer código que acesse a porta serial.

O BCM2837 no Raspberry Pi3, Pi3B +, Pi3A +, PiZeroW possui 2 UARTs (assim como seus antecessores); no entanto, para suportar a funcionalidade Bluetooth, o UART PL011 completo foi movido dos pinos do cabeçalho para o chip Bluetooth e o mini UART disponibilizado em pinos do cabeçalho 8 e 10.
(O SOC no Pi4 possui UARTs adicionais, mas os mesmos 2 UARTs do BCM2837 são usados ​​para a série padrão nos pinos 8 e 10 e Bluetooth.)

Isso tem várias consequências para os usuários da interface serial.

O /dev/ttyAMA0usado anteriormente para acessar o UART agora se conecta ao Bluetooth.
O miniUART está agora disponível em /dev/ttyS0.
Na mais recente software de sistema operacional há um /dev/serial0que seleciona o dispositivo apropriado para que você possa substituir /dev/ttyAMA0com /dev/serial0e usar o mesmo software no Pi3 e modelos anteriores.

Infelizmente, existem várias outras consequências:

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.

Não há suporte para paridade e o rendimento é limitado, mas o último não deve afetar a maioria dos usos.

Há um recurso matador "Baudrate derivado do relógio do sistema" que torna o miniUART inútil, pois esse relógio pode mudar dinamicamente, por exemplo, se o sistema entrar em energia reduzida ou no modo de baixa energia.

A modificação de /boot/config.txtremove essa dependência adicionando a seguinte linha no final: -

core_freq=250

Isso corrige o problema e parece ter pouco impacto. O SPI clock frequencye ARM Timertambém dependem do relógio do sistema.

Por algum motivo bizarro, o padrão do Pi3 usando o kernel 4.4.9 mais recente é DESATIVAR UART. Para ativá-lo você precisa mudar enable_uart=1no /boot/config.txt. (Isso também corrige o core_freqque não é mais necessário.)

Finalmente, se você não usa o Bluetooth (ou tem usos pouco exigentes), é possível trocar as portas novamente na Árvore de Dispositivos. Há um módulo pi3-miniuart-bte pi3-disable-btdescrito em /boot/overlays/README.

Milliways
fonte
Obrigado @Milliways pela ótima explicação. O que eu ainda não fiz ... Eu tenho um módulo de rádio que se conecta à minha framboesa usando UART e ele prefere uma taxa de transmissão de 9600. Portanto, isso deve funcionar se eu definir core_freq=250e configurar minha taxa de transmissão no script ma python? Além disso, seria ótimo se você pudesse dar uma olhada em: raspberrypi.stackexchange.com/questions/47379/… Obrigado!
Georg
Eu tentei / dev / serial0 e enable_uart = 1 no /boot/config.txt, com um código de connectionPi que costumava trabalhar com o raspberry pi 2, mas ainda assim falha ao iniciar a comunicação serial (a condição de retorno é -1). Eu também tentei / dev / S0 sem sucesso. O que posso estar perdendo? (também liberou a porta serial do raspi-config). (tudo, incluindo raspbian está atualizado)
ozgeneral
1
@ OE1 Se você tiver uma pergunta, faça-a em uma nova pergunta, não em Comentários.
Milliways
Estou um pouco confuso. Como assim, não suporta paridade? Eu tenho um dispositivo com o qual o pi3 fala e ele precisa ter PARIDADE MESMO ou meu sistema não fala com ele. Depois de seguir sua resposta e a resposta mais obscura, consegui que meu pi3 rodasse meu programa com sucesso com este dispositivo que está definido para PARIDADE MESMO.
ThN
1
Você pode adicionar que o conversor USB para UART deve ser compatível com 3,3V e 5V.
MaNyYaCk
20

finalmente isso deu certo para o meu pi3 (os: debian jessie)

siga estas 6 etapas cuidadosamente.

Etapa 1 - Instale o Raspbian Jessie em um cartão SD e inicialize o Pi quando conectado a uma rede. Logon via terminal ou desktop e shell Configure o sistema com:

sudo raspi-config

Expanda o sistema de arquivos e ative o serial na página avançada, saia e reinicie.

Etapa 2 - isso não será necessário se você tiver um novo lançamento de Jessie Atualize o sistema com:

sudo apt-get update

sudo apt-get upgrade

Etapa 3 - Configurações da árvore de dispositivos como abaixo:

Adicione a árvore de dispositivos ao /boot/config.txt para desativar o Bluetooth do Raspberry Pi 3.

sudo nano /boot/config.txt

Adicione no final do arquivo

* se você deseja alterar a porta blutooth para miniuart (ruim)

dtoverlay=pi3-miniuart-bt

* se você deseja desativar o blutooth (bom)

dtoverlay=pi3-disable-bt

Saia do editor salvando suas alterações.

Etapa 4 - reinicie o pi

sudo reboot

passo 5 -

a) para desativar o console serial, edite o arquivo usando

sudo nano /boot/cmdline.txt

remova a palavra fase " console=serial0,115200" ou " console=ttyAMA0,115200"

Saia e salve suas alterações

b) para ativar o console serial, edite o arquivo usando

sudo nano /boot/cmdline.txt

Mude o arquivo para o seguinte:

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

Saia e salve suas alterações

Etapa 6 - reinicie o pi

sudo reboot

----------------- isso é tudo, divirta-se ---------------------------- ---

mohammad naseer
fonte
No rpi2, isso funciona e eu o conecto a uma placa de retransmissão bluetooth e envio mensagens via comandos AT. Mas posso receber dados de um arduino dessa maneira?
Marciokoko
10

A resposta de Naseer está correta, mas um pouco elaborada se você apenas exibiu o último rasbian. Tudo o que eu precisava fazer era adicionar a seguinte linha ao meu config.txt (por exemplo, janelas onde você conecta o cartão SD na partição fat32):

dtoverlay=pi3-disable-bt

Em seguida, conecte-o e o pi imprimirá diretamente os itens nos pinos do console.

Arnout
fonte
Como isso pode funcionar? O Bluetooth UART nem está conectado aos pinos GPIO!
Dmitry Grigoryev
4
@DmitryGrigoryev Ele funciona para mim no meu PI 3.
THN
2
Isso funcionou para mim também, e descobri que esse tópico ajudou a esclarecer alguns pequenos problemas: raspberrypi.org/forums/…
Chris