MicroPython:Библиотеки/pyb/Класс UART: различия между версиями

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
Нет описания правки
Строка 51: Строка 51:


* [[MicroPython:Библиотеки/pyb/Класс UART/pyb.UART()|pyb.UART(bus, ...)]]
* [[MicroPython:Библиотеки/pyb/Класс UART/pyb.UART()|pyb.UART(bus, ...)]]
• Класс pyb.UART(bus, ...) – конструирует объект UART на заданной шине. Для PyBoard в аргументе bus можно задать 1-4, 6, ‘XA’, ‘XB’, ‘YA’ или ‘YB’. Для PyBoard Lite – 1, 2, 6, ‘XB’ или ‘YA’. Для PyBoard D – 1-4, ‘XA’, ‘YA’ или ‘YB’. Если не задать в этом методе дополнительных аргументов, объект UART будет создан, но не инициализирован (ему будут заданы настройки с прошлой инициализации, если таковые имеются). Если задать дополнительные аргументы, шина будет инициализирована. Аргументы для инициализации смотрите в описании метода init().
Физические контакты UART-шин на PyBoard:
o UART(4) – на XA: (TX, RX) = (X1, X2) = (PA0, PA1)
o UART(1) – на XB: (TX, RX) = (X9, X10) = (PB6, PB7)
o UART(6) – на YA: (TX, RX) = (Y1, Y2) = (PC6, PC7)
o UART(3) – на YB: (TX, RX) = (Y9, Y10) = (PB10, PB11)
o UART(2) – на (TX, RX) = (X3, X4) = (PA2, PA3)
На PyBoard Lite поддерживаются только UART(1), UART(2) и UART(6), которые работают на следующих контактах:
o UART(1) – на XB: (TX, RX) = (X9, X10) = (PB6, PB7)
o UART(6) – на YA: (TX, RX) = (Y1, Y2) = (PC6, PC7)
o UART(2) – на (TX, RX) = (X1, X2) = (PA2, PA3)
На PyBoard D поддерживаются только UART(1), UART(2), UART(3) и UART(4), которые работают на следующих контактах:
o UART(4) – на XA: (TX, RX) = (X1, X2) = (PA0, PA1)
o UART(1) – на YA: (TX, RX) = (Y1, Y2) = (PA9, PA10)
o UART(3) – на YB: (TX, RX) = (Y9, Y10) = (PB10, PB11)
o UART(2) – на (TX, RX) = (X3, X4) = (PA2, PA3)
Примечание: У платы PyBoard D шина UART(1) находится на YA, а у PyBoard и PyBoard Lite – на XB, а UART(6) – на YA.


== Методы ==
== Методы ==
Строка 87: Строка 64:
* [[MicroPython:Библиотеки/pyb/Класс UART/UART.writechar()|UART.writechar(char)]]
* [[MicroPython:Библиотеки/pyb/Класс UART/UART.writechar()|UART.writechar(char)]]
* [[MicroPython:Библиотеки/pyb/Класс UART/UART.sendbreak()|UART.sendbreak()]]
* [[MicroPython:Библиотеки/pyb/Класс UART/UART.sendbreak()|UART.sendbreak()]]
* [[MicroPython:Библиотеки/pyb/Класс UART/
* [[MicroPython:Библиотеки/pyb/Класс UART/
* [[MicroPython:Библиотеки/pyb/Класс UART/
* [[MicroPython:Библиотеки/pyb/Класс UART/
* [[MicroPython:Библиотеки/pyb/Класс UART/
* [[MicroPython:Библиотеки/pyb/Класс UART/
* [[MicroPython:Библиотеки/pyb/Класс UART/
• UART.init(baudrate, bits=8, parity=None, stop=1, *, timeout=0, flow=0, timeout_char=0, read_buf_len=64) – инициализирует шину UART при помощи следующих аргументов:
o baudrate – тактовая частота.
o bits – количество битов на символ (7, 8 или 9).
o parity – бит четности. Доступные значения: None, «0» (четность) и «1» (нечетность).
o stop – количество стоп-битов (1 или 2).
o flow – здесь задается тип управления потоками. Доступные значения: «0», UART.RTS, UART.CTS или UART.RTS | UART.CTS.
o timeout – таймаут в миллисекундах для ожидания чтения/записи первого символа.
o timeout_char – таймаут в миллисекундах для ожидания между символами во время чтения/записи.
o read_buf_len – символьный размер буфера чтения («0», чтобы отключить).
Если скорость передачи данных baudrate не будет задана в пределах 5% от желаемого значения, этот метод возбудит исключение. Минимальная скорость передачи данных определяется частотой шины, на которой работает UART: для UART(1) и UART(6) – это APB2, а для остальных – это APB1. По умолчанию минимальная скорость передачи данных для UART(1) и UART(6) – это 1300, а для остальных – 650. Чтобы снизить частоты шин и тем самым получить более низкую скорость передачи данных, используйте [http://docs.micropython.org/en/latest/library/pyb.html#pyb.freq pyb.freq()].
Примечание: Если бита четности не будет (parity=None), поддерживаются только 8 или 9 бит. При наличии бита четности поддерживаются только 7 или 8 бит.
• UART.deinit() – выключает шину UART.
• UART.any() – возвращает количество байтов, находящихся в режиме ожидания (может вернуть «0»).
• UART.read([nbytes]) – считывает символы. Если задать аргумент nbytes, количество считываемых байтов не будет превышать то, что было задано в этом аргументе. Если считываемые данные находятся в буфере, они будут считаны мгновенно. В противном случае считывание произойдет, когда наберется достаточное количество данных или когда истечет таймаут.
Если аргумента nbytes задано не будет, этот метод прочтет максимально возможное количество данных и вернет считанные данные после истечения таймаута.
Примечание: При использовании 9-битных символов каждый символ будет занимать два байта, значение в nbytes должно быть четным, а количество символов должно быть nbytes/2.
Возвращаемое значение: объект bytes, содержащий считанные байты. При истечении таймаута возвращает None.
• UART.readchar() – принимает на шину один символ.
Возвращаемое значение: считанный символ (в виде целого числа). Возвращает «-1» при истечении таймаута.
• UART.readinto(buf[, nbytes]) – считывает байты в буфер buf. Если будет задан аргумент nbytes, этот метод прочтет количество байтов, не превышающее то, что было задано в этом аргументе. В противном случае количество считанных байтов не будет превышать размер буфера buf.
Возвращаемое значение: количество байтов, считанных и сохраненных в буфер buf, или None (при истечении таймаута).
• UART.readline() – считывает строку, заканчивающуюся символом новой строки. Если такая строка существует, возвращает ее немедленно. При истечении таймаута возвращает все доступные данные, независимо от того, был ли встречен символ новой строки или нет.
Возвращаемое значение: считанная строка или None, если при истечении таймаута никаких данных так и не стало доступно.
• UART.write(buf) – записывает буфер с байтами на шину. Если в символе 7-8 бит, то размер одного символа составляет один байт. Если в символе 9 бит, то его размер будет составлять два байта (порядок битов – от младшего к старшему), а в буфере buf должно содержаться четное количество байтов.
Возвращаемое значение: количество записанных байтов. Если при истечении таймаута не будет записано ни одного байта, метод вернет None.
• UART.writechar(char) – записывает один символ на шину. В аргументе char задается целое число, которое надо записать. Возвращаемое значение: None. Если используется тип управления потоками CTS, читайте соответствующее примечание ниже.
• UART.sendbreak() – отправляет на шину сигнал «break» (сигнал разрыва связи). Это переключит шину на низкий уровень сигнала и будет держать в таком состоянии 13 бит. Возвращаемое значение: None.


== Константы ==
== Константы ==
Строка 128: Строка 69:
* [[MicroPython:Библиотеки/pyb/Класс UART/UART.RTS|UART.RTS]]
* [[MicroPython:Библиотеки/pyb/Класс UART/UART.RTS|UART.RTS]]
* [[MicroPython:Библиотеки/pyb/Класс UART/UART.CTS|UART.CTS]]
* [[MicroPython:Библиотеки/pyb/Класс UART/UART.CTS|UART.CTS]]
• UART.RTS, UART.CTS – задают тип управления потоками.


== Управление потоками ==
== Управление потоками ==


На PyBoard V1 и V1.1 на портах UART(2) и UART(3) поддерживается аппаратное управление потоками RTS/CTS при помощи следующих контактов:
На 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(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)
* UART(3) – на (TX, RX, nRTS, nCTS) = (Y9, Y10, Y7, Y6) = (PB10, PB11, PB14, PB13)
 
На PyBoard Lite управление потоками поддерживает только UART(2) на следующих контактах:
На PyBoard Lite управление потоками поддерживает только UART(2) на следующих контактах:
<syntaxhighlight lang="python" enclose="div">
(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>
В тексте ниже термин «цель» будет использоваться для обозначения устройства, подключенного к UART-порту.
В тексте ниже термин «цель» будет использоваться для обозначения устройства, подключенного к UART-порту.
Если при вызове метода UART.init() будет использован аргумент flow, в котором будет задано значение UART.RTS, UART.CTS или UART.RTS | UART.CTS, это задействует соответствующие контакты для управления потоками. Контакт nRTS – это выходной контакт с активным низким уровнем, а nCTS – входной контакт с активным низким уровнем и включенным подтягивающим резистором. Чтобы воспользоваться управлением потоками, контакт nCTS на PyBoard должен быть подключен к контакту nRTS на цели, а контакт nRTS на PyBoard – к контакту nCTS на цели.
Если при вызове метода UART.init() будет использован аргумент flow, в котором будет задано значение UART.RTS, UART.CTS или UART.RTS | UART.CTS, это задействует соответствующие контакты для управления потоками. Контакт nRTS – это выходной контакт с активным низким уровнем, а nCTS – входной контакт с активным низким уровнем и включенным подтягивающим резистором. Чтобы воспользоваться управлением потоками, контакт nCTS на PyBoard должен быть подключен к контакту nRTS на цели, а контакт nRTS на PyBoard – к контакту nCTS на цели.
CTS: цель управляет трансмиттером PyBoard
 
== CTS: цель управляет трансмиттером PyBoard ==
 
Если включен тип управления потоками CTS, запись будет осуществляться следующим образом:
Если включен тип управления потоками CTS, запись будет осуществляться следующим образом:
Если во время вызова метода UART.write(buf) на контакте nCTS будет задано False, передача данных будет остановлена. Если во время передачи данных истечет таймаут, будет передан не весь буфер. Этот метод возвращает количество записанных байтов, позволяя при необходимости дозаписать оставшиеся данные. В случае таймаута символ останется в UART ждать последующего считывания. В возвращаемом значении будет содержаться количество байтов, составляющих этот символ.
Если во время вызова метода UART.write(buf) на контакте nCTS будет задано False, передача данных будет остановлена. Если во время передачи данных истечет таймаут, будет передан не весь буфер. Этот метод возвращает количество записанных байтов, позволяя при необходимости дозаписать оставшиеся данные. В случае таймаута символ останется в UART ждать последующего считывания. В возвращаемом значении будет содержаться количество байтов, составляющих этот символ.
Если на контакте nCTS задано False, то при вызове метода UART.writechar() произойдет таймаут, разве что цель вовремя не переведет контакт nCTS в активное состояние. При истечении таймаута будет возбуждено исключение OSError 116. Символ будет передан, как только цель переведет контакт nCTS в активное состояние.
Если на контакте nCTS задано False, то при вызове метода UART.writechar() произойдет таймаут, разве что цель вовремя не переведет контакт nCTS в активное состояние. При истечении таймаута будет возбуждено исключение OSError 116. Символ будет передан, как только цель переведет контакт nCTS в активное состояние.
RTS: PyBoard управляет трансмиттером цели
 
== RTS: PyBoard управляет трансмиттером цели ==
 
Если включен тип управления потоками RTS, запись будет осуществляться следующим образом:
Если включен тип управления потоками RTS, запись будет осуществляться следующим образом:
Если используется буферизация входящих данных (read_buf_len > 0), входящие символы будут буферизированы. Если буфер заполнится, то следующий входящий символ переведет контакт nRTS в состояние False – это значит, что цель должна прекратить передачу данных. Когда символы будут считаны из буфера, контакт nRTS снова станет True.
Если используется буферизация входящих данных (read_buf_len > 0), входящие символы будут буферизированы. Если буфер заполнится, то следующий входящий символ переведет контакт nRTS в состояние False – это значит, что цель должна прекратить передачу данных. Когда символы будут считаны из буфера, контакт nRTS снова станет True.
Метод any() позволяет узнать количество байтов в буфере. Допустим размер буфера составляет N байт. Если после заполнения буфера прибудет новый символ, контакту nRTS будет задано значение False, а метод any() вернет значение N. Когда символы будут считаны, этот дополнительный символ будет помещен в буфер и добавлен в результат следующего вызова any().
Метод any() позволяет узнать количество байтов в буфере. Допустим размер буфера составляет N байт. Если после заполнения буфера прибудет новый символ, контакту nRTS будет задано значение False, а метод any() вернет значение N. Когда символы будут считаны, этот дополнительный символ будет помещен в буфер и добавлен в результат следующего вызова any().
Если буферизация входящих данных не используется (read_buf_len == 0), прибытие символа переведет контакт nRTS в состояние False, и так будет, пока этот символ не будет считан.
Если буферизация входящих данных не используется (read_buf_len == 0), прибытие символа переведет контакт nRTS в состояние False, и так будет, пока этот символ не будет считан.
<syntaxhighlight lang="python" enclose="div">


=См.также=
=См.также=

Версия от 12:43, 17 октября 2020

Перевод: Максим Кузьмин
Проверка/Оформление/Редактирование: Мякишев Е.А.


Класс 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.

Примечание: Если бита четности нет, поддерживаются только 8 или 9 бит. Если бит четности присутствует, поддерживаются только 7 и 8 бит.

Объекты 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()          # возвращает количество символов, ожидающих чтения

Примечание: Потоковые функции read(), write() и т.д. – это нововведение MicroPython v1.3.4. В ранних версиях используются uart.send() и uart.recv().

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

Методы

Константы

Управление потоками

На 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.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, и так будет, пока этот символ не будет считан.

См.также

Внешние ссылки