клас 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:Сигнал
Контакт роз’єму
TXP4RXP5Додаткові шини UART доступні на деяких платах:
Шина
Контакт TX
Контакт RX
Доступно на
UART(1)P1P0OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal
UART(4)P2P3OpenMV Cam N6
UART(7)P14P13OpenMV 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 біт.
- 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.
Константи¶
Керування потоком¶
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, поки символ не буде прочитано.