клас 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.