MicroPython:Библиотеки/pyb/Класс UART: различия между версиями
Myagkij (обсуждение | вклад) Нет описания правки |
Нет описания правки |
||
Строка 9: | Строка 9: | ||
Создать и инициализировать объект [[UART]] можно следующим образом: | Создать и инициализировать объект [[UART]] можно следующим образом: | ||
<syntaxhighlight lang="python | <syntaxhighlight lang="python"> | ||
from pyb import UART | from pyb import UART | ||
Строка 26: | Строка 26: | ||
Объекты [[UART]] могут функционировать как потоковые объекты, считывая и записывая данные при помощи стандартных потоковых методов: | Объекты [[UART]] могут функционировать как потоковые объекты, считывая и записывая данные при помощи стандартных потоковых методов: | ||
<syntaxhighlight lang="python | <syntaxhighlight lang="python"> | ||
uart.read(10) # считывает 10 символов, возвращает объект «bytes» | uart.read(10) # считывает 10 символов, возвращает объект «bytes» | ||
uart.read() # считывает все доступные символы | uart.read() # считывает все доступные символы | ||
Строка 36: | Строка 36: | ||
Отдельные символы можно записать/прочесть следующим образом: | Отдельные символы можно записать/прочесть следующим образом: | ||
<syntaxhighlight lang="python | <syntaxhighlight lang="python"> | ||
uart.readchar() # считывает 1 символ | uart.readchar() # считывает 1 символ | ||
# и возвращает его как целое число | # и возвращает его как целое число | ||
Строка 44: | Строка 44: | ||
Чтобы проверить, есть ли данные для считывания, используйте следующее: | Чтобы проверить, есть ли данные для считывания, используйте следующее: | ||
<syntaxhighlight lang="python | <syntaxhighlight lang="python"> | ||
uart.any() # возвращает количество символов, ожидающих чтения | uart.any() # возвращает количество символов, ожидающих чтения | ||
</syntaxhighlight> | </syntaxhighlight> | ||
Строка 82: | Строка 82: | ||
На [[PyBoard Lite]] управление потоками поддерживает только ''UART(2)'' на следующих контактах: | На [[PyBoard Lite]] управление потоками поддерживает только ''UART(2)'' на следующих контактах: | ||
<syntaxhighlight lang="python | <syntaxhighlight lang="python"> | ||
(TX, RX, nRTS, nCTS) = (X1, X2, X4, X3) = (PA2, PA3, PA1, PA0) | (TX, RX, nRTS, nCTS) = (X1, X2, X4, X3) = (PA2, PA3, PA1, PA0) | ||
</syntaxhighlight> | </syntaxhighlight> |
Текущая версия от 18:17, 14 мая 2023
Класс UART – шина для двусторонней последовательной передачи данных[1]
В классе UART реализован стандартный протокол двухсторонней последовательной коммуникации UART/USART. На физическом уровне он состоит из двух линий: RX и TX. Единица коммуникации в UART – это символ (не путайте со строковым символом), размер которого может быть 8-9 бит.
Создать и инициализировать объект UART можно следующим образом:
from pyb import UART
# Инициализируем «uart» с заданной скоростью:
uart = UART(1, 9600)
# инициализируем «uart» с заданными параметрами:
uart.init(9600, bits=8, parity=None, stop=1)
Битов (аргумент bits) может быть 7, 8 или 9. Бит четности (аргумент parity) может быть четным (0), нечетным (1) или вовсе отсутствовать (None). Стоп-битов (аргумент stop) может быть 1 или 2.
Объекты UART могут функционировать как потоковые объекты, считывая и записывая данные при помощи стандартных потоковых методов:
uart.read(10) # считывает 10 символов, возвращает объект «bytes»
uart.read() # считывает все доступные символы
uart.readline() # считывает строку
uart.readinto(buf) # считывает и сохраняет данные в заданный буфер
uart.write('abc') # записывает 3 символа
Отдельные символы можно записать/прочесть следующим образом:
uart.readchar() # считывает 1 символ
# и возвращает его как целое число
uart.writechar(42) # записывает 1 символ
Чтобы проверить, есть ли данные для считывания, используйте следующее:
uart.any() # возвращает количество символов, ожидающих чтения
Конструкторы
Методы
- UART.init(baudrate, bits=8, parity=None, stop=1, *, timeout=0, flow=0, timeout_char=0, read_buf_len=64)
- UART.deinit()
- UART.any()
- UART.read([nbytes])
- UART.readchar()
- UART.readinto(buf[, nbytes])
- UART.readline()
- UART.write(buf)
- UART.writechar(char)
- UART.sendbreak()
Константы
Управление потоками
На PyBoard V1 и V1.1 на портах UART(2) и UART(3) поддерживается аппаратное управление потоками RTS/CTS при помощи следующих контактов:
- UART(2) – на (TX, RX, nRTS, nCTS) = (X3, X4, X2, X1) = (PA2, PA3, PA1, PA0)
- UART(3) – на (TX, RX, nRTS, nCTS) = (Y9, Y10, Y7, Y6) = (PB10, PB11, PB14, PB13)
На PyBoard Lite управление потоками поддерживает только UART(2) на следующих контактах:
(TX, RX, nRTS, nCTS) = (X1, X2, X4, X3) = (PA2, PA3, PA1, PA0)
В тексте ниже термин «цель» будет использоваться для обозначения устройства, подключенного к UART-порту.
Если при вызове метода UART.init() будет использован аргумент flow, в котором будет задано значение [[UART.RTS|UART.RTS]], UART.CTS или UART.RTS | UART.CTS, это задействует соответствующие контакты для управления потоками. Контакт nRTS – это выходной контакт с активным низким уровнем, а nCTS – входной контакт с активным низким уровнем и включенным подтягивающим резистором. Чтобы воспользоваться управлением потоками, контакт nCTS на PyBoard должен быть подключен к контакту nRTS на цели, а контакт nRTS на PyBoard – к контакту nCTS на цели.
CTS: цель управляет трансмиттером PyBoard
Если включен тип управления потоками CTS, запись будет осуществляться следующим образом:
Если во время вызова метода UART.write(buf) на контакте nCTS будет задано False, передача данных будет остановлена. Если во время передачи данных истечет таймаут, будет передан не весь буфер. Этот метод возвращает количество записанных байтов, позволяя при необходимости дозаписать оставшиеся данные. В случае таймаута символ останется в UART ждать последующего считывания. В возвращаемом значении будет содержаться количество байтов, составляющих этот символ.
Если на контакте nCTS задано False, то при вызове метода UART.writechar() произойдет таймаут, разве что цель вовремя не переведет контакт nCTS в активное состояние. При истечении таймаута будет возбуждено исключение OSError 116. Символ будет передан, как только цель переведет контакт nCTS в активное состояние.
RTS: PyBoard управляет трансмиттером цели
Если включен тип управления потоками RTS, запись будет осуществляться следующим образом:
Если используется буферизация входящих данных (read_buf_len > 0), входящие символы будут буферизированы. Если буфер заполнится, то следующий входящий символ переведет контакт nRTS в состояние False – это значит, что цель должна прекратить передачу данных. Когда символы будут считаны из буфера, контакт nRTS снова станет True.
Метод any() позволяет узнать количество байтов в буфере. Допустим размер буфера составляет N байт. Если после заполнения буфера прибудет новый символ, контакту nRTS будет задано значение False, а метод any() вернет значение N. Когда символы будут считаны, этот дополнительный символ будет помещен в буфер и добавлен в результат следующего вызова any().
Если буферизация входящих данных не используется (read_buf_len == 0), прибытие символа переведет контакт nRTS в состояние False, и так будет, пока этот символ не будет считан.