клас 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(ціле число в діапазоні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.