клас 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 із заданим ідентифікатором.

Методи

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.

Примітка

Після виклику deinit() неможливо викликати init() на цьому об’єкті. У такому разі потрібно створити новий екземпляр.

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

Надсилає умову переривання на шину – утримує 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() прапорець тригера: спрацьовує при виявленні умови переривання на RX. Недоступно на жодному порту OpenMV.