|
Как управлять последовательным
чтением и записью Raspberry Pi
Мы покажем вам, как выполнять эту последовательную запись с помощью адаптера RS232-TTL для создания обратной связи с Raspberry Pi, и та же концепция будет работать с любым последовательным устройством. Вы узнаете, какие контакты GPIO вам нужно использовать, чтобы иметь возможность подключать ваше последовательное устройство к Raspberry Pi, и мы также будем показывать шаги, которые вы должны пройти, чтобы позволить Raspberry Pi читать и писать через TX. и контакты RX GPIO. Мы также научим вас читать и записывать данные через последовательные порты с помощью языка программирования Python, и это должно дать вам хорошее представление о том, как вы будете работать со стандартными последовательными устройствами, а не только с обратной связью с Raspberry Pi.
Подключение Raspberry Pi к Serial Pi
На вашем адаптере RS232-TTL вы должны найти как минимум четыре соединения, некоторые схемы имеют больше соединений, но вам нужны только четыре: VCC (вывод питания IC), TX (переданные данные), RX (полученные данные). и GND (контакт заземления) Вы можете подключить провода напрямую к контактам GPIO или использовать макетную плату в качестве посредника, как мы делали в этом руководстве. В основном мы делали это, потому что у нас не было доступного провода для макетов между жен разъемами.
Подключение адаптера RS232 к TTL к Raspberry Pi - это простой процесс, требующий, чтобы к последовательному разъему было подключено только 4 GPIO, а еще лучше - все 4 необходимых контакта GPIO расположены в ряд, так что за ним легко следить. . Воспользуйтесь нашей таблицей и руководством ниже, чтобы подключить последовательный разъем к Raspberry Pi.
VCC подключается к контакту 4 .
TX подключается к контакту 8 .
RX подключается к выводу 10 .
GND подключается к контакту 6 .
Настройка Raspberry Pi для последовательного чтения и записи
1. Давайте начнем это руководство, сначала убедившись, что Raspberry Pi обновлен, выполнив следующие две команды.
sudo apt-get update
sudo apt-get upgrade
2.Теперь, когда Raspberry Pi обновлен, мы можем использовать инструмент raspi-config. Этот инструмент позволит нам легко отключить интерфейс последовательного ввода / вывода, который включен по умолчанию.
sudo raspi-config
3.Эта команда загрузит экран конфигурации Raspberry Pi. Этот инструмент позволяет нам вносить довольно много различных изменений в конфигурацию Raspberry Pi на данный момент, хотя нам нужен только один конкретный вариант. С помощью клавиш со стрелками спуститесь вниз и выберите « 5 опций интерфейса ». После выбора этой опции вы можете нажать Enter.
4.На следующем экране вы снова захотите использовать клавиши со стрелками, чтобы выбрать « P6 Serial », нажмите Enter один раз, чтобы выбрать эту опцию.
5.Теперь вам будет предложено указать, хотите ли вы, чтобы оболочка входа была доступна через последовательный порт , выберите Нет с помощью клавиш со стрелками и нажмите Enter, чтобы продолжить.
6.Сразу после того, как вас спросят, хотите ли вы использовать оборудование последовательного порта , убедитесь, что вы выбрали Да с помощью клавиш со стрелками и нажмите Enter, чтобы продолжить.
7. После того, как Raspberry Pi внесет изменения, вы должны увидеть на экране следующий текст. « Оболочка последовательного входа отключена. Последовательный интерфейс включен ».
Прежде чем эти изменения полностью вступят в силу, мы должны сначала перезапустить Raspberry Pi. Для этого сначала вернитесь в терминал, нажав Enter, а затем ESC . Введите следующую команду в терминал Raspberry Pi, чтобы перезапустить его.
sudo reboot
8. Теперь давайте проверим, что все было изменено правильно, выполнив следующую команду на вашем Raspberry Pi.
dmesg | grep tty
Здесь вы хотите убедиться, что следующее сообщение не отображается в выводе , если его нет, вы можете перейти к следующему разделу. В противном случае начните заново с шага 2 . Эти сообщения указывают на то, что последовательный вход по-прежнему включен для этого интерфейса.
Raspberry Pi 3 и Raspberry Pi Zero W
[ttyS0] enabled
Raspberry Pi 2 и ранее, а также Raspberry Pi Zero
[ttyAMA0] enabled
Использование последовательного чтения и записи на Raspberry Pi
В этом сегменте руководства вам потребуется подключить адаптер USB-Serial к адаптеру RS232. Затем вы хотите, чтобы USB-конец адаптера USB-Serial был подключен к USB-портам вашего Raspberry Pi. Конечно, на практике вы будете подключать свое последовательное соединение к реальному устройству, такому как модем, принтер или даже некоторые считыватели RFID, на самом деле, мы используем последовательное соединение в нашем руководстве по настройке чипа RFID RC522. В этом руководстве по последовательному порту Raspberry Pi мы просто покажем вам, как все это работает, и как вы можете читать данные, поступающие по последовательным линиям.
1. После того, как вы подключили адаптер USB-Serial и он подключен к Raspberry Pi, мы можем запустить следующую команду в терминале.
dmesg | grep tty
2. В выходных данных этой команды вы хотите отметить любые появившиеся дополнительные строки, которые также указывают USB, к которому он подключен. Например, мой собственный преобразователь был подключен к ttyUSB0, как мы показали в нашем выводе ниже. Запишите, к чему было подключено ваше USB-устройство, так как это понадобится вам для завершения обучения.
[ 2429.234287] usb 1-1.2: ch341-uart converter now attached to ttyUSB0
3.Теперь, когда мы знаем, к какому устройству подключено наше USB-устройство, мы можем приступить к программированию наших двух сценариев. Один из этих сценариев будет читать данные через порт ttyUSB0 , а другой будет записывать данные через порт ttyS0 / ttyAMA0 . Для начала мы напишем наш собственный сценарий последовательной записи, перейдите к следующему разделу, чтобы узнать, как выполнять последовательную запись в Python.
Программирование Raspberry Pi для последовательной записи
1.Для начала давайте начнем писать наш скрипт serial_write.py , он будет записывать данные через последовательный порт. Выполните следующие две команды на своем Raspberry Pi, чтобы начать запись файла.
mkdir ~/serial
cd ~/serial
nano serial_write.py
2. В этом файле напишите следующие строки кода.
#!/usr/bin/env python
import time
import serial
Первая строка кода сообщает операционной системе, с чем ей следует попробовать запустить файл. В противном случае он, скорее всего, попытается запустить его как стандартный сценарий bash. Первый импорт - это время . Мы используем эту библиотеку для временного засыпания скрипта время от времени для нашего тестового счетчика, и вам не нужен этот пакет, чтобы иметь возможность выполнять последовательную запись. Второй импорт - серийный . Эта библиотека содержит все функции для работы с последовательными соединениями, это позволяет читать и писать через последовательные порты.
ser = serial.Serial(
port='/dev/ttyS0', #Replace ttyS0 with ttyAM0 for Pi1,Pi2,Pi0
baudrate = 9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout=1
)
counter=0
Этот раздел кода в первую очередь создает экземпляр последовательного класса, настраивая его со всеми различными битами информации, с которыми ему необходимо установить соединение.
порт - определяет последовательный порт, через который объект должен попытаться выполнить чтение и запись. Для Pi 3 и Pi Zero W это должно быть tty0. Если вы используете Pi 2 и старше или базовый Pi Zero, вам следует использовать ttyAM0.
baudrate - это скорость, с которой информация передается по каналу связи.
четность - Устанавливает, следует ли выполнять проверку четности, это необходимо для обеспечения точной передачи данных между узлами во время связи.
стоповые биты - это набор ожидаемых битов, который указывает на конец символа или передачи данных.
bytesize - это количество бит данных.
тайм-аут - это количество времени, в течение которого последовательные команды должны ждать до истечения времени ожидания.
while 1:
ser.write('Write counter: %d \n'%(counter))
time.sleep(1)
counter += 1
Этот код довольно прост, и он бесконечно зацикливается, непрерывно записывая текст « Write Counter: 1 » (где 1 заменяется текущим номером счетчика) в последовательный порт. Это означает, что любой сценарий или устройство, прослушивающее на другой стороне, будет постоянно получать этот текст. В каждом цикле мы используем временную библиотеку, чтобы засыпать скрипт на 1 секунду перед увеличением счетчика, и это делается для того, чтобы не спамить последовательный порт.
3.Когда вы закончите писать скрипт serial_write.py, он должен выглядеть примерно так, как показано ниже.
#!/usr/bin/env python
import time
import serial
ser = serial.Serial(
port='/dev/ttyS0', #Replace ttyS0 with ttyAM0 for Pi1,Pi2,Pi0
baudrate = 9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout=1
)
counter=0
while 1:
ser.write("Write counter: %d \n"%(counter))
time.sleep(1)
counter += 1
Убедившись, что вы ввели код правильно, вы можете сохранить файл, нажав Ctrl + X, затем нажав Y и, наконец, нажав Enter .
4.Теперь, когда мы закончили писать скрипт serial_write.py, мы пока не можем его протестировать. Во-первых, нам нужно написать скрипт serial_read.py . Причина этого в том, чтобы сказать, записываются ли последовательные записи через последовательный порт, нам действительно нужно что-то, чтобы их получать. В следующем разделе мы рассмотрим написание скрипта serial_read.py . Не беспокойтесь об этом слишком сильно, поскольку он довольно похож на код последовательной записи.
Программирование Raspberry Pi для последовательного чтения
1.Для начала давайте начнем писать сценарий serial_read.py , он будет записывать данные через последовательный порт. Выполните следующие две команды на своем Raspberry Pi, чтобы начать запись файла.
mkdir ~/serial
cd ~/serial
nano serial_read.py
2. В этом файле напишите следующие строки кода.
#!/usr/bin/env python
import time
import serial
ser = serial.Serial(
port='/dev/ttyUSB0',
baudrate = 9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout=1
)
Поскольку мы уже просмотрели большой объем этого кода, мы не будем повторять его снова. Единственная разница между этим блоком кода и тем, который мы использовали в нашем сценарии последовательной записи, заключается в том, что для порта мы используем наше USB-устройство. В нашем случае это был ttyUSB0 , не забудьте изменить это, если вы получили другой результат ранее в этом руководстве по последовательному чтению и записи Raspberry Pi.
while 1:
x=ser.readline()
print x,
Этот фрагмент кода очень прост. По сути, он использует функцию из последовательного объекта, которую мы установили ранее в коде. Эта функция читает строку с завершением, а это означает, что она читает, пока не встретит строку, заканчивающуюся на \ n . Все, что будет после этого, будет отклонено. Как только он считывает значение, он сохраняет его в нашей переменной x .
Наконец, мы печатаем полученное значение с помощью функции ser.readline () .
3.Когда вы закончите писать serial_read.py , сценарий должен выглядеть примерно так, как показано ниже.
#!/usr/bin/env python
import time
import serial
ser = serial.Serial(
port='/dev/ttyUSB0',
baudrate = 9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout=1
)
while 1:
x=ser.readline()
print x
Убедившись, что вы ввели код правильно, вы можете сохранить файл, нажав Ctrl + X, затем нажав Y и, наконец, нажав Enter .
Тестирование наших сценариев последовательного чтения и записи Python
1. Теперь, когда мы написали сценарии Python для последовательного чтения и последовательной записи, мы можем наконец приступить к их тестированию. Для этого вам потребуется два активных окна терминала. Это будет означать либо дважды открыть терминальное приложение на Raspberry Pi, либо просто запустить два отдельных SSH-соединения. Причина этого в том, что вы можете видеть, что сценарий последовательной записи и сценарий последовательного чтения работают одновременно.
2.Теперь в одном окне терминала вам нужно будет ввести следующие две команды для запуска нашего скрипта Python serial_read.py . Этот скрипт немедленно начнет считывать все данные, которые передаются через его последовательное соединение нашим скриптом serial_write.py .
cd ~/serial
sudo python serial_read.py
3.Теперь в нашем другом окне терминала введите следующие две команды, чтобы запустить скрипт Python serial_write.py . По сути, этот скрипт начнет вывод данных через последовательное соединение, которое мы скоро получим, используя другой наш скрипт.
cd ~/serial
sudo python serial_write.py
4. Теперь вы должны заметить, что в вашем первом окне терминала отображаются последовательные данные, которые мы записываем с помощью нашего сценария serial_write.py . Отображение данных в терминале будет означать, что мы успешно написали наши два сценария и что serial_read.py успешно получает данные из serial_write.py . Мы надеемся, что после завершения этого руководства для Raspberry Pi у вас появится представление о том, как записывать и читать данные через последовательную шину на вашем Raspberry Pi. Это руководство должно дать вам представление о том, как вы потенциально можете взаимодействовать с другими устройствами, использующими последовательный интерфейс.