клас UART – дуплексна послідовна шина зв’язку

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

Об’єкти UART можна створювати та ініціалізувати за допомогою:

from pyb import UART

# init with the given baudrate
uart = UART(3, 9600, timeout_char=1000)

# init with explicit parameters
uart.init(9600, bits=8, parity=None, stop=1, timeout_char=1000)

Bits може бути 7, 8 або 9. Parity може бути None, 0 (парна) або 1 (непарна). 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

Окремі символи можна читати/записувати за допомогою:

uart.readchar()     # read 1 character and returns it as an integer
uart.writechar(42)  # write 1 character

Щоб перевірити, чи є що читати, використовуйте:

uart.any()          # returns the number of characters waiting

Примітка: Функції потоку read, write тощо з’явилися в MicroPython v1.3.4. У більш ранніх версіях використовувалися uart.send і uart.recv.

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

class pyb.UART(bus: int | str, *args, **kwargs)

Створює об’єкт UART на заданій bus (цілочисельний індекс периферійного пристрою, наприклад 3 для UART3). Без додаткових параметрів об’єкт створюється, але не ініціалізується (зберігаються попередні налаштування шини, якщо такі є); якщо задані додаткові аргументи, шина ініціалізується. Дивіться init() для доступних параметрів.

UART(3) підключений до однакових контактів роз’єму на кожній STM32 OpenMV Cam:

Сигнал

Контакт роз’єму

TX

P4

RX

P5

Додаткові шини UART доступні на деяких платах:

Шина

Контакт TX

Контакт RX

Доступно на

UART(1)

P1

P0

OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal

UART(4)

P2

P3

OpenMV Cam N6

UART(7)

P14

P13

OpenMV Cam N6

Методи

init(baudrate: int, bits: int = 8, parity: int | None = None, stop: int = 1, *, timeout: int = 1000, flow: int = 0, timeout_char: int = 0, read_buf_len: int = 64) None

Ініціалізує шину UART із заданими параметрами:

  • baudrate – це тактова частота.

  • bits – це кількість біт на символ: 7, 8 або 9.

  • parity – це парність: None, 0 (парна) або 1 (непарна).

  • stop – це кількість стоп-біт: 1 або 2.

  • flow задає тип керування потоком. Може бути 0, UART.RTS, UART.CTS або UART.RTS | UART.CTS.

  • timeout – це тайм-аут у мілісекундах для очікування запису/читання першого символу.

  • timeout_char – це тайм-аут у мілісекундах для очікування між символами під час запису або читання.

  • read_buf_len – це довжина буфера читання в символах (0 для вимкнення).

Цей метод згенерує виняток, якщо швидкість передачі (бод) не вдається встановити в межах 5% від бажаного значення.

Примітка: при parity=None підтримуються лише 8 і 9 біт. При увімкненій парності підтримуються лише 7 і 8 біт.

deinit() None

Вимикає шину UART.

any() int

Повертає кількість байт в очікуванні (може бути 0).

read(nbytes: int | None = None) bytes | None

Читає символи. Якщо задано nbytes, то читається щонайбільше стільки байт. Якщо nbytes байт доступні в буфері, повертається негайно; інакше повертається, коли надходить достатня кількість символів або закінчується тайм-аут.

Якщо nbytes не задано, метод читає якомога більше даних. Повертається після закінчення тайм-ауту.

Примітка: для 9-бітових символів кожен символ займає два байти, nbytes має бути парним, а кількість символів дорівнює nbytes/2.

Повернене значення: об’єкт bytes, що містить прочитані байти. Повертає None при тайм-ауті.

readchar() int

Отримує один символ з шини.

Повернене значення: прочитаний символ у вигляді цілого числа. Повертає -1 при тайм-ауті.

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

Читає байти в buf. Якщо задано nbytes, то читається щонайбільше стільки байт. В іншому випадку читається щонайбільше len(buf) байт.

Повернене значення: кількість байт, прочитаних і збережених у buf, або None при тайм-ауті.

readline() bytes | None

Читає рядок, що закінчується символом нового рядка. Якщо такий рядок існує, повернення відбувається негайно. Якщо тайм-аут закінчується, повертаються всі доступні дані незалежно від наявності символу нового рядка.

Повернене значення: прочитаний рядок або None при тайм-ауті, якщо дані відсутні.

write(buf: bytes | bytearray | str) int | None

Записує буфер байт на шину. Якщо символи мають ширину 7 або 8 біт, кожен байт є одним символом. Якщо символи мають ширину 9 біт, для кожного символу використовуються два байти (молодший байт спочатку), а buf має містити парну кількість байт.

Повернене значення: кількість записаних байт. Якщо виникає тайм-аут і жоден байт не було записано, повертає None.

writechar(char: int) None

Записує один символ на шину. char – це ціле число для запису. Дивіться розділ Керування потоком CTS нижче для семантики блокування при увімкненому керуванні потоком CTS.

sendbreak() None

Надсилає умову переривання на шину. Це утримує шину в низькому стані протягом 13 бітів.

Константи

RTS: int

Бітовий прапор для аргументу flow init(); вмикає апаратне керування потоком RTS (запит на надсилання) на шляху прийому.

CTS: int

Бітовий прапор для аргументу flow init(); вмикає апаратне керування потоком CTS (дозвіл на надсилання) на шляху передачі. Може бути об’єднаний через OR з RTS для увімкнення обох напрямків.

Керування потоком

UART(3) підтримує апаратне керування потоком RTS/CTS. На OpenMV Cam M7, H7, H7 Plus та Pure Thermal контакти керування потоком такі:

(TX, RX, nRTS, nCTS) = (P4, P5, P1, P2)

На OpenMV Cam N6 відкритий лише nRTS (на контакті роз’єму P7); nCTS не підключено до роз’єму введення/виведення.

У наступних абзацах термін «цільовий пристрій» означає пристрій, підключений до UART.

Коли метод init() UART викликається з flow, встановленим в одне або обидва значення UART.RTS та UART.CTS, відповідні контакти керування потоком налаштовуються. nRTS – це активний низький вихід, а nCTS – це активний низький вхід з увімкненим підтягуванням до живлення. Щоб підключити керування потоком, з’єднайте nCTS OpenMV Cam з nRTS цільового пристрою, а nRTS OpenMV Cam – з nCTS цільового пристрою.

CTS: цільовий пристрій керує передавачем OpenMV Cam

Якщо увімкнено керування потоком CTS, поведінка запису така:

Якщо викликається метод UART.write(buf) OpenMV Cam, передача зупиняється на будь-які проміжки часу, коли nCTS дорівнює False. Це призведе до тайм-ауту, якщо весь буфер не було передано за час тайм-ауту. Метод повертає кількість записаних байт, що дозволяє користувачу записати решту даних за потреби. У разі тайм-ауту символ залишиться в UART в очікуванні nCTS. Кількість байт, що складають цей символ, буде включено до поверненого значення.

Якщо UART.writechar() викликається, коли nCTS дорівнює False, метод завершиться тайм-аутом, якщо цільовий пристрій не підтвердить nCTS вчасно. Якщо виникає тайм-аут, буде згенеровано OSError 116. Символ буде передано, щойно цільовий пристрій підтвердить nCTS.

RTS: OpenMV Cam керує передавачем цільового пристрою

Якщо увімкнено керування потоком RTS, поведінка така:

Якщо використовується буферизований ввід (read_buf_len > 0), вхідні символи буферизуються. Якщо буфер заповнюється, наступний символ, що надійде, змусить nRTS перейти у стан False: цільовий пристрій має припинити передачу. nRTS перейде у стан True, коли символи будуть прочитані з буфера.

Зауважте, що метод any() повертає кількість байт у буфері. Припустімо, що довжина буфера становить N байт. Якщо буфер заповниться і надійде ще один символ, nRTS буде встановлено в False, а any() поверне значення N. Коли символи зчитуються, додатковий символ буде поміщено в буфер і буде включено до результату наступного виклику any().

Якщо буферизований ввід не використовується (read_buf_len == 0), прихід символу змусить nRTS перейти у стан False, поки символ не буде прочитано.