class UART – дуплексная последовательная коммуникационная шина

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

Объекты UART можно создавать и инициализировать так:

from pyb import UART

# init with the given baudrate
uart = UART(3, 9600, timeout_char=1000)

# init with explicit parameters
uart.init(9600, bits=8, parity=None, stop=1, timeout_char=1000)

Bits может быть 7, 8 или 9. Parity может быть None, 0 (чётность) или 1 (нечётность). Stop может быть 1 или 2.

Примечание: при parity=None поддерживаются только 8 и 9 бит. При включённой чётности поддерживаются только 7 и 8 бит.

Объект UART ведёт себя как объект stream, и чтение и запись выполняются с помощью стандартных потоковых методов:

uart.read(10)       # read 10 characters, returns a bytes object
uart.read()         # read all available characters
uart.readline()     # read a line
uart.readinto(buf)  # read and store into the given buffer
uart.write('abc')   # write the 3 characters

Отдельные символы можно читать/записывать так:

uart.readchar()     # read 1 character and returns it as an integer
uart.writechar(42)  # write 1 character

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

uart.any()          # returns the number of characters waiting

Примечание: потоковые функции read, write и т. д. появились в MicroPython v1.3.4. В более ранних версиях использовались uart.send и uart.recv.

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

class pyb.UART(bus: int | str, *args, **kwargs)

Создаёт объект UART на заданной шине bus (целочисленный индекс периферийного устройства, например 3 для UART3). Без дополнительных параметров объект создаётся, но не инициализируется (он сохраняет предыдущие настройки шины, если таковые были); если переданы дополнительные аргументы, шина инициализируется. См. доступные параметры в init().

UART(3) подключён к одним и тем же контактам разъёма на каждой STM32 OpenMV Cam:

Сигнал

Контакт разъёма

TX

P4

RX

P5

На некоторых платах доступны дополнительные шины UART:

Шина

Контакт TX

Контакт RX

Доступна на

UART(1)

P1

P0

OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal

UART(4)

P2

P3

OpenMV Cam N6

UART(7)

P14

P13

OpenMV Cam N6

Методы

init(baudrate: int, bits: int = 8, parity: int | None = None, stop: int = 1, *, timeout: int = 1000, flow: int = 0, timeout_char: int = 0, read_buf_len: int = 64) None

Инициализирует шину UART с заданными параметрами:

  • baudrate — тактовая частота.

  • bits — число бит на символ, 7, 8 или 9.

  • parity — чётность, None, 0 (чётная) или 1 (нечётная).

  • stop — число стоп-битов, 1 или 2.

  • flow задаёт тип управления потоком. Может быть 0, UART.RTS, UART.CTS или UART.RTS | UART.CTS.

  • timeout — тайм-аут в миллисекундах ожидания записи/чтения первого символа.

  • timeout_char — тайм-аут в миллисекундах ожидания между символами при записи или чтении.

  • read_buf_len — длина буфера чтения в символах (0 для отключения).

Этот метод вызовет исключение, если скорость передачи не удаётся установить в пределах 5% от желаемого значения.

Примечание: при parity=None поддерживаются только 8 и 9 бит. При включённой чётности поддерживаются только 7 и 8 бит.

deinit() None

Выключает шину UART.

any() int

Возвращает число байт, ожидающих чтения (может быть 0).

read(nbytes: int | None = None) bytes | None

Читает символы. Если задан nbytes, то читается не более указанного числа байт. Если nbytes байт доступны в буфере, метод возвращается немедленно, иначе возвращается, когда поступит достаточно символов или истечёт тайм-аут.

Если nbytes не задан, метод читает как можно больше данных. Он возвращается после истечения тайм-аута.

Примечание: для 9-битных символов каждый символ занимает два байта, nbytes должен быть чётным, а число символов равно nbytes/2.

Возвращаемое значение: объект bytes, содержащий прочитанные байты. Возвращает None при тайм-ауте.

readchar() int

Принимает один символ на шине.

Возвращаемое значение: прочитанный символ в виде целого числа. Возвращает -1 при тайм-ауте.

readinto(buf: bytearray, nbytes: int | None = None) int | None

Читает байты в buf. Если задан nbytes, то читается не более указанного числа байт. Иначе читается не более len(buf) байт.

Возвращаемое значение: число байт, прочитанных и сохранённых в buf, или None при тайм-ауте.

readline() bytes | None

Читает строку, оканчивающуюся символом новой строки. Если такая строка существует, возврат происходит немедленно. Если истекает тайм-аут, возвращаются все доступные данные независимо от наличия символа новой строки.

Возвращаемое значение: прочитанная строка или None при тайм-ауте, если данные недоступны.

write(buf: bytes | bytearray | str) int | None

Записывает буфер байт в шину. Если символы имеют ширину 7 или 8 бит, то каждый байт является одним символом. Если символы имеют ширину 9 бит, то для каждого символа используются два байта (little endian), и buf должен содержать чётное число байт.

Возвращаемое значение: число записанных байт. Если происходит тайм-аут и не было записано ни одного байта, возвращается None.

writechar(char: int) None

Записывает один символ в шину. char — целое число для записи. См. раздел CTS flow control ниже для описания блокирующей семантики при включённом управлении потоком CTS.

sendbreak() None

Отправляет условие break на шину. Это удерживает шину в низком состоянии в течение 13 бит.

Константы

RTS: int

Битовый флаг для аргумента flow метода init(); включает аппаратное управление потоком RTS (request-to-send) на пути приёма.

CTS: int

Битовый флаг для аргумента flow метода init(); включает аппаратное управление потоком CTS (clear-to-send) на пути передачи. Может быть объединён по ИЛИ с RTS для включения обоих направлений.

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

UART(3) поддерживает аппаратное управление потоком RTS/CTS. На OpenMV Cam M7, H7, H7 Plus и Pure Thermal контактами управления потоком являются:

(TX, RX, nRTS, nCTS) = (P4, P5, P1, P2)

На OpenMV Cam N6 выведен только nRTS (на контакт разъёма P7); nCTS не подключён к разъёму ввода-вывода.

В следующих абзацах термин «target» относится к устройству, подключённому к UART.

Когда метод init() объекта UART вызывается с flow, установленным в одно или оба значения UART.RTS и UART.CTS, настраиваются соответствующие контакты управления потоком. nRTS — это активно-низкий выход, а nCTS — активно-низкий вход с включённой подтяжкой. Чтобы подключить управление потоком, соедините nCTS OpenMV Cam с nRTS целевого устройства и nRTS OpenMV Cam с nCTS целевого устройства.

CTS: целевое устройство управляет передатчиком OpenMV Cam

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

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

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

RTS: OpenMV Cam управляет передатчиком целевого устройства

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

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

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

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