Как мне сделать серийную работу на Raspberry Pi3 (или более поздней модели)


Ответы:


65

Этот ответ все еще корректен и более подробно объясняет природу изменений, но большинство пользователей текущего Raspbian должны просто запустить sudo raspi-configSelect, а Interfacing Options / Serialзатем указать, хотите ли вы использовать последовательную консоль (вероятно, нет), а затем, если вы хотите, чтобы аппаратное обеспечение последовательного порта было включено (возможно, да). Затем используйте /dev/serial0любой код, который обращается к последовательному порту.

BCM2837 на Raspberry Pi3, Pi3B +, Pi3A +, PiZeroW имеет 2 UART (как и его предшественники), однако для поддержки функциональности Bluetooth полнофункциональный UART PL011 был перенесен с выводов заголовка на чип Bluetooth, а мини-UART стал доступен на контакты заголовка 8 и 10.
(SOC на Pi4 имеет дополнительные UART, но те же 2 UART, что и BCM2837, используются для серийного соединения по умолчанию на контактах 8 и 10 и Bluetooth.)

Это имеет ряд последствий для пользователей последовательного интерфейса.

/dev/ttyAMA0Ранее используемый для доступа к UART в настоящее время подключается к Bluetooth.
MiniUART теперь доступен на /dev/ttyS0.
В последней версии программного обеспечения операционной системы есть , /dev/serial0который выбирает соответствующее устройство , так что вы можете заменить /dev/ttyAMA0с /dev/serial0и использовать то же программное обеспечение на PI3 и более ранних моделей.

К сожалению, есть ряд других последствий:

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.

Поддержка четности не поддерживается, а пропускная способность ограничена, но последнее не должно влиять на большинство применений.

Существует одна особенность «Скорость передачи, полученная из системных часов», которая делает miniUART бесполезным, поскольку эти часы могут динамически изменяться, например, если система переходит в режим пониженной мощности или в режим низкой мощности.

Модификация /boot/config.txtудаляет эту зависимость, добавляя следующую строку в конце: -

core_freq=250

Это решает проблему и, кажется, оказывает небольшое влияние. Символы SPI clock frequencyи ARM Timerтакже зависят от системных часов.

По какой-то странной причине по умолчанию для Pi3, использующего последнее ядро ​​4.4.9, является ОТКЛЮЧЕНИЕ UART. Чтобы включить ее нужно изменить enable_uart=1в /boot/config.txt. (Это также исправляет, core_freqтак что это больше не нужно.)

Наконец, если вы не используете Bluetooth (или используете его нетребовательно), можно поменять порты обратно в дереве устройств. Существует pi3-miniuart-btи pi3-disable-btмодуль, который описан в /boot/overlays/README.


Спасибо @Milliways за отличное объяснение. Что я не сделал, хотя ... У меня есть радиомодуль, который подключается к моей малине с помощью UART, и он предпочитает скорость передачи в бодах 9600. Так что должно работать, если я установлю, core_freq=250а затем настрою свою скорость передачи в скрипте ma python? Кроме того, было бы здорово, если бы вы могли взглянуть на: raspberrypi.stackexchange.com/questions/47379/… Спасибо!
Георг

Я попытался / dev / serial0, и enable_uart = 1 в /boot/config.txt, с кодом wiringPi, который использовался для работы с Raspberry Pi 2, но он по-прежнему не может инициировать последовательную связь (условие возврата -1). Я также попытался / dev / S0 безрезультатно. Чего мне не хватает? (также освободил последовательный порт от raspi-config). (все, включая raspbian, актуально)
ozgeneral

1
@ OE1 Если у вас есть вопрос, задайте его в новом вопросе, а не в комментариях.
Milliways

Я немного смущен. Как вы имеете в виду, что это не поддерживает паритет? У меня есть устройство, с которым разговаривает мой pi3, и оно должно иметь ДАЖЕ четность, иначе моя система не будет с ним разговаривать. После того, как вы ответили на ваш ответ и ответ naseer, я смог заставить мой pi3 запустить программу «УСПЕШНО» с этим устройством, для которого установлен ДАЖЕ паритет.
Thn

1
Не могли бы вы добавить, что преобразователь USB в UART должен быть совместим с 3,3 В и не с 5 В.
MaNyYaCk

20

наконец это получилось для моего pi3 (os: debian jessie)

Пожалуйста, внимательно следуйте этим 6 шагам .

Шаг 1 - Установите Raspbian Jessie на SD-карту и загрузите Pi при подключении к сети. Войдите через терминал или рабочий стол и оболочку. Сконфигурируйте систему с помощью:

sudo raspi-config

Разверните файловую систему и включите последовательный порт на расширенной странице, выйдите и перезагрузитесь.

Шаг 2 - в этом нет необходимости, если у вас есть новый выпуск jessie. Обновите систему:

sudo apt-get update

sudo apt-get upgrade

Шаг 3 - Настройки дерева устройств, как показано ниже:

Добавьте дерево устройств в /boot/config.txt, чтобы отключить Bluetooth Raspberry Pi 3.

sudo nano /boot/config.txt

Добавить в конец файла

* если вы хотите изменить blutooth на порт miniuart (плохо)

dtoverlay=pi3-miniuart-bt

* если вы хотите отключить Bluetooth (хорошо)

dtoverlay=pi3-disable-bt

Выйдите из редактора, сохранив свои изменения.

Шаг 4 - перезагрузите пи

sudo reboot

шаг 5 -

а) чтобы отключить Serial Console, отредактируйте файл, используя

sudo nano /boot/cmdline.txt

удалить слово фаза " console=serial0,115200" или " console=ttyAMA0,115200"

Выйдите и сохраните ваши изменения

б) Включить Serial Console, отредактировать файл, используя

sudo nano /boot/cmdline.txt

Измените файл на следующий:

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

Выйдите и сохраните ваши изменения

Шаг 6 - перезагрузите пи

sudo reboot

----------------- вот и все, веселись ---------------------------- ---


На rpi2 это работает, и я подключил его к плате реле Bluetooth и отправляю сообщения через AT-команды. Но могу ли я получить данные от Arduino таким образом?
Марсиококо

10

Ответ Насера ​​правильный, но немного сложный, если вы только что мелькнули в последней версии. Все, что мне нужно было сделать, это просто добавить следующую строку в мой config.txt (например, из окон, где вы вставляете SD-карту в раздел fat32):

dtoverlay=pi3-disable-bt

Затем подключите его, и пи напрямую напечатает на выводах консоли.


Как это может работать? Bluetooth UART даже не подключен к контактам GPIO!
Дмитрий Григорьев

4
@DmitryGrigoryev Это работает для меня на моем PI 3.
Thn

2
Это сработало и для меня, я обнаружил, что эта ветка помогла прояснить несколько небольших проблем: raspberrypi.org/forums/…
Крис,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.