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

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

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

from machine import UART

uart = UART(3, 9600)                         # init with given baudrate
uart.init(9600, bits=8, parity=None, stop=1) # init with given parameters

Bits может быть равно 7, 8 или 9. 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

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

class machine.UART(id: int, baudrate: int = 9600, bits: int = 8, parity: int | None = None, stop: int = 1, *, tx: Pin | None = None, rx: Pin | None = None, rts: Pin | None = None, cts: Pin | None = None, txbuf: int | None = None, rxbuf: int | None = None, timeout: int | None = None, timeout_char: int | None = None, invert: int = 0, flow: int = 0)

Создаёт объект UART с заданным id.

Методы

init(baudrate: int = 9600, bits: int = 8, parity: int | None = None, stop: int = 1, *, tx: Pin | None = None, rx: Pin | None = None, rts: Pin | None = None, cts: Pin | None = None, txbuf: int | None = None, rxbuf: int | None = None, timeout: int | None = None, timeout_char: int | None = None, invert: int = 0, flow: int = 0) None

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

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

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

  • parity — контроль чётности, None, 0 (чётный) или 1 (нечётный).

  • stop — количество стоповых бит, 1 или 2.

Дополнительные параметры (только именованные), которые могут поддерживаться портом:

  • tx задаёт используемый вывод TX.

  • rx задаёт используемый вывод RX.

  • rts задаёт вывод RTS (выход), используемый для аппаратного управления потоком при приёме.

  • cts задаёт вывод CTS (вход), используемый для аппаратного управления потоком при передаче.

  • txbuf задаёт длину буфера TX в символах.

  • rxbuf задаёт длину буфера RX в символах.

  • timeout задаёт время ожидания первого символа (в мс).

  • timeout_char задаёт время ожидания между символами (в мс).

  • invert задаёт, какие линии инвертировать.

    • 0 не будет инвертировать линии (состояние покоя обеих линий — логическая единица).

    • UART.INV_TX инвертирует линию TX (теперь состояние покоя линии TX — логический ноль).

    • UART.INV_RX инвертирует линию RX (теперь состояние покоя линии RX — логический ноль).

    • UART.INV_TX | UART.INV_RX инвертирует обе линии (состояние покоя — логический ноль).

  • flow задаёт, какие сигналы аппаратного управления потоком использовать. Значение является битовой маской.

    • 0 будет игнорировать сигналы аппаратного управления потоком.

    • UART.RTS включит управление потоком при приёме, используя выходной вывод RTS для сигнализации о том, что в приёмном FIFO достаточно места для приёма новых данных.

    • UART.CTS включит управление потоком при передаче, приостанавливая передачу, когда входной вывод CTS сигнализирует о том, что у приёмника заканчивается место в буфере.

    • UART.RTS | UART.CTS включит оба варианта для полного аппаратного управления потоком.

Примечание

Метод init() можно вызывать несколько раз для одного и того же объекта, чтобы перенастраивать UART на лету. Это позволяет использовать одно периферийное устройство UART для обслуживания разных устройств, подключённых к разным выводам GPIO. В этом случае одновременно может обслуживаться только одно устройство. Также не вызывайте deinit(), так как это не позволит вызвать init() снова.

deinit() None

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

Примечание

Вы не сможете вызвать init() для объекта после deinit(). В этом случае нужно создать новый экземпляр.

any() int

Возвращает целое число, равное количеству символов, которые можно прочитать без блокировки. Возвращает 0, если нет доступных символов, и положительное число, если символы есть. Метод может вернуть 1, даже если для чтения доступно более одного символа.

Для более сложного определения количества доступных символов используйте select.poll:

poll = select.poll()
poll.register(uart, select.POLLIN)
poll.poll(timeout)
read(nbytes: int | None = None, /) bytes | None

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

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

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

Читает байты в buf. Если задано nbytes, то читает не более указанного количества байт. Иначе читает не более len(buf) байт. Может вернуться раньше при достижении тайм-аута. Тайм-аут настраивается в конструкторе.

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

readline() bytes | None

Читает строку, оканчивающуюся символом новой строки. Может вернуться раньше при достижении тайм-аута. Тайм-аут настраивается в конструкторе.

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

write(buf: bytes) int | None

Записывает буфер байт в шину.

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

sendbreak() None

Посылает условие break на шину — удерживает TX в низком состоянии дольше времени передачи одного символа. Доступно на STM32 и mimxrt; не предоставляется на alif.

readchar() int

Читает один символ из UART и возвращает его как целое число (или -1 при тайм-ауте). Имеет меньшие накладные расходы, чем read(1), так как объект bytes не выделяется. Только для STM32.

writechar(char: int) None

Записывает одиночный символ char (целое число в диапазоне 0255) в UART. Имеет меньшие накладные расходы, чем write(), для отправки одного байта. Только для STM32.

flush() None

Блокируется до тех пор, пока каждый байт, находящийся в данный момент в буфере передачи, не будет выведен на TX. Вызывает OSError при тайм-ауте; тайм-аут вычисляется из размера буфера TX и настроенной скорости передачи, поэтому, если управление потоком не включено и приёмник не зависает, вызов возвращается задолго до тайм-аута.

txdone() bool

Возвращает True, когда нет передачи в процессе (буфер TX пуст, а сдвиговый регистр опустошён), и False в противном случае. Полезно как неблокирующая альтернатива flush().

irq(handler: Callable[[UART], None] | None = None, trigger: int = 0, hard: bool = False) None

Устанавливает функцию обратного вызова, срабатывающую при событиях UART.

handler — вызываемая функция. Она получает экземпляр UART в качестве единственного аргумента. Передайте None, чтобы удалить ранее установленный обработчик.

trigger — битовая маска из одной или нескольких констант IRQ_* (см. раздел Константы ниже), выбирающая, какие события вызывают функцию обратного вызова.

hard=True регистрирует обработчик аппаратного прерывания (меньшая задержка, но обработчик не должен выделять память). По умолчанию используется планируемая функция обратного вызова.

Возвращает объект irq.

Не каждый источник IRQ доступен на каждом порту — см. отдельные константы IRQ_* для информации о доступности по портам.

Константы

RTS: int

Передайте в flow для включения аппаратного управления потоком RTS на стороне приёма. Объедините с CTS через OR, чтобы включить оба варианта.

CTS: int

Передайте в flow для включения аппаратного управления потоком CTS на стороне передачи.

IRQ_RXIDLE: int

Флаг триггера irq(): срабатывает один раз после того, как один или несколько символов были приняты и линия RX перешла в состояние покоя. Доступно на всех портах OpenMV.

IRQ_RX: int

Флаг триггера irq(): срабатывает после каждого принятого символа. Доступно на STM32 и alif.

IRQ_TXIDLE: int

Флаг триггера irq(): срабатывает, когда последний символ передачи был выведен. Доступно на mimxrt и alif.

IRQ_BREAK: int

Флаг триггера irq(): срабатывает при обнаружении условия break на RX. Недоступно ни на одном порту OpenMV.