MicroPython:Библиотеки/pyb/Класс UART

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Класс UART – шина для двусторонней последовательной передачи данных[1]

В классе UART реализован стандартный протокол двухсторонней последовательной коммуникации UART/USART. На физическом уровне он состоит из двух линий: RX и TX. Единица коммуникации в UART – это символ (не путайте со строковым символом), размер которого может быть 8-9 бит.

Создать и инициализировать объект UART можно следующим образом:

from pyb import UART

# Инициализируем «uart» с заданной скоростью:
uart = UART(1, 9600)  
# инициализируем «uart» с заданными параметрами:
uart.init(9600, bits=8, parity=None, stop=1)

Битов (аргумент bits) может быть 7, 8 или 9. Бит четности (аргумент parity) может быть четным (0), нечетным (1) или вовсе отсутствовать (None). Стоп-битов (аргумент stop) может быть 1 или 2.

Примечание

Если бита четности нет, поддерживаются только 8 или 9 бит. Если бит четности присутствует, поддерживаются только 7 и 8 бит.

Объекты UART могут функционировать как потоковые объекты, считывая и записывая данные при помощи стандартных потоковых методов:

uart.read(10)       # считывает 10 символов, возвращает объект «bytes» 
uart.read()         # считывает все доступные символы
uart.readline()     # считывает строку
uart.readinto(buf)  # считывает и сохраняет данные в заданный буфер 
uart.write('abc')   # записывает 3 символа

Отдельные символы можно записать/прочесть следующим образом:

uart.readchar()     # считывает 1 символ
                    # и возвращает его как целое число
uart.writechar(42)  # записывает 1 символ

Чтобы проверить, есть ли данные для считывания, используйте следующее:

uart.any()          # возвращает количество символов, ожидающих чтения
Примечание

Потоковые функции read(), write() и т.д. – это нововведение MicroPython v1.3.4. В ранних версиях используются uart.send() и uart.recv().

Конструкторы

Методы

Константы

Управление потоками

На PyBoard V1 и V1.1 на портах UART(2) и UART(3) поддерживается аппаратное управление потоками RTS/CTS при помощи следующих контактов:

  • UART(2) – на (TX, RX, nRTS, nCTS) = (X3, X4, X2, X1) = (PA2, PA3, PA1, PA0)
  • UART(3) – на (TX, RX, nRTS, nCTS) = (Y9, Y10, Y7, Y6) = (PB10, PB11, PB14, PB13)

На PyBoard Lite управление потоками поддерживает только UART(2) на следующих контактах:

(TX, RX, nRTS, nCTS) = (X1, X2, X4, X3) = (PA2, PA3, PA1, PA0)

В тексте ниже термин «цель» будет использоваться для обозначения устройства, подключенного к UART-порту.

Если при вызове метода UART.init() будет использован аргумент flow, в котором будет задано значение [[UART.RTS|UART.RTS]], UART.CTS или UART.RTS | UART.CTS, это задействует соответствующие контакты для управления потоками. Контакт nRTS – это выходной контакт с активным низким уровнем, а nCTS – входной контакт с активным низким уровнем и включенным подтягивающим резистором. Чтобы воспользоваться управлением потоками, контакт nCTS на PyBoard должен быть подключен к контакту nRTS на цели, а контакт nRTS на PyBoard – к контакту nCTS на цели.

CTS: цель управляет трансмиттером PyBoard

Если включен тип управления потоками CTS, запись будет осуществляться следующим образом:

Если во время вызова метода UART.write(buf) на контакте nCTS будет задано False, передача данных будет остановлена. Если во время передачи данных истечет таймаут, будет передан не весь буфер. Этот метод возвращает количество записанных байтов, позволяя при необходимости дозаписать оставшиеся данные. В случае таймаута символ останется в UART ждать последующего считывания. В возвращаемом значении будет содержаться количество байтов, составляющих этот символ.

Если на контакте nCTS задано False, то при вызове метода UART.writechar() произойдет таймаут, разве что цель вовремя не переведет контакт nCTS в активное состояние. При истечении таймаута будет возбуждено исключение OSError 116. Символ будет передан, как только цель переведет контакт nCTS в активное состояние.

RTS: PyBoard управляет трансмиттером цели

Если включен тип управления потоками RTS, запись будет осуществляться следующим образом:

Если используется буферизация входящих данных (read_buf_len > 0), входящие символы будут буферизированы. Если буфер заполнится, то следующий входящий символ переведет контакт nRTS в состояние False – это значит, что цель должна прекратить передачу данных. Когда символы будут считаны из буфера, контакт nRTS снова станет True.

Метод any() позволяет узнать количество байтов в буфере. Допустим размер буфера составляет N байт. Если после заполнения буфера прибудет новый символ, контакту nRTS будет задано значение False, а метод any() вернет значение N. Когда символы будут считаны, этот дополнительный символ будет помещен в буфер и добавлен в результат следующего вызова any().

Если буферизация входящих данных не используется (read_buf_len == 0), прибытие символа переведет контакт nRTS в состояние False, и так будет, пока этот символ не будет считан.

См.также

Внешние ссылки