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(целое число в диапазоне0–255) в 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, чтобы включить оба варианта.
- IRQ_RXIDLE: int¶
Флаг триггера
irq(): срабатывает один раз после того, как один или несколько символов были приняты и линия RX перешла в состояние покоя. Доступно на всех портах OpenMV.
- IRQ_RX: int¶
Флаг триггера
irq(): срабатывает после каждого принятого символа. Доступно на STM32 и alif.