class 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 бит, то для каждого символа используются два байта (little endian), и
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 не подключён к разъёму ввода-вывода.
В следующих абзацах термин «target» относится к устройству, подключённому к 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, пока символ не будет прочитан.