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

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску
Нет описания правки
Нет описания правки
 
(не показаны 2 промежуточные версии 1 участника)
Строка 9: Строка 9:
Создать и инициализировать объект [[UART]] можно следующим образом:
Создать и инициализировать объект [[UART]] можно следующим образом:


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
from pyb import UART
from pyb import UART


Строка 20: Строка 20:
Битов (аргумент ''bits'') может быть ''7'', ''8'' или ''9''. Бит четности (аргумент ''parity'') может быть четным (''0''), нечетным (''1'') или вовсе отсутствовать (''None''). Стоп-битов (аргумент ''stop'') может быть ''1'' или ''2''.  
Битов (аргумент ''bits'') может быть ''7'', ''8'' или ''9''. Бит четности (аргумент ''parity'') может быть четным (''0''), нечетным (''1'') или вовсе отсутствовать (''None''). Стоп-битов (аргумент ''stop'') может быть ''1'' или ''2''.  


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


Объекты [[UART]] могут функционировать как потоковые объекты, считывая и записывая данные при помощи стандартных потоковых методов:
Объекты [[UART]] могут функционировать как потоковые объекты, считывая и записывая данные при помощи стандартных потоковых методов:


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
uart.read(10)      # считывает 10 символов, возвращает объект «bytes»  
uart.read(10)      # считывает 10 символов, возвращает объект «bytes»  
uart.read()        # считывает все доступные символы
uart.read()        # считывает все доступные символы
Строка 34: Строка 36:
Отдельные символы можно записать/прочесть следующим образом:
Отдельные символы можно записать/прочесть следующим образом:


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
uart.readchar()    # считывает 1 символ
uart.readchar()    # считывает 1 символ
                     # и возвращает его как целое число
                     # и возвращает его как целое число
Строка 42: Строка 44:
Чтобы проверить, есть ли данные для считывания, используйте следующее:
Чтобы проверить, есть ли данные для считывания, используйте следующее:


<syntaxhighlight lang="python" enclose="div">
<syntaxhighlight lang="python">
uart.any()          # возвращает количество символов, ожидающих чтения  
uart.any()          # возвращает количество символов, ожидающих чтения  
</syntaxhighlight>
</syntaxhighlight>


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


== Конструкторы ==
== Конструкторы ==
Строка 72: Строка 76:
== Управление потоками ==
== Управление потоками ==


На PyBoard V1 и V1.1 на портах UART(2) и UART(3) поддерживается аппаратное управление потоками RTS/CTS при помощи следующих контактов:
На [[PyBoard V1]] и [[PyBoard V1.1|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">
<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>


В тексте ниже термин «цель» будет использоваться для обозначения устройства, подключенного к UART-порту.
В тексте ниже термин ''«цель»'' будет использоваться для обозначения устройства, подключенного к [[UART-порт]]у.


Если при вызове метода UART.init() будет использован аргумент flow, в котором будет задано значение UART.RTS, UART.CTS или UART.RTS | UART.CTS, это задействует соответствующие контакты для управления потоками. Контакт nRTS – это выходной контакт с активным низким уровнем, а nCTS – входной контакт с активным низким уровнем и включенным подтягивающим резистором. Чтобы воспользоваться управлением потоками, контакт nCTS на PyBoard должен быть подключен к контакту nRTS на цели, а контакт nRTS на PyBoard – к контакту nCTS на цели.
Если при вызове метода [[MicroPython:Библиотеки/pyb/Класс UART/UART.init()|UART.init()]] будет использован аргумент ''flow'', в котором будет задано значение [[[[MicroPython:Библиотеки/pyb/Класс UART/UART.RTS|UART.RTS]]|UART.RTS]], [[MicroPython:Библиотеки/pyb/Класс UART/UART.CTS|UART.CTS]] или [[MicroPython:Библиотеки/pyb/Класс UART/UART.RTS|UART.RTS]] | [[MicroPython:Библиотеки/pyb/Класс UART/UART.CTS|UART.CTS]], это задействует соответствующие контакты для управления потоками. Контакт ''nRTS'' – это выходной контакт с активным низким уровнем, а ''nCTS'' – входной контакт с активным низким уровнем и включенным подтягивающим резистором. Чтобы воспользоваться управлением потоками, контакт ''nCTS'' на [[PyBoard]] должен быть подключен к контакту ''nRTS'' на цели, а контакт ''nRTS'' на [[PyBoard]] – к контакту ''nCTS'' на цели.


== CTS: цель управляет трансмиттером PyBoard ==
== CTS: цель управляет трансмиттером PyBoard ==


Если включен тип управления потоками CTS, запись будет осуществляться следующим образом:
Если включен тип управления потоками ''CTS'', запись будет осуществляться следующим образом:


Если во время вызова метода UART.write(buf) на контакте nCTS будет задано False, передача данных будет остановлена. Если во время передачи данных истечет таймаут, будет передан не весь буфер. Этот метод возвращает количество записанных байтов, позволяя при необходимости дозаписать оставшиеся данные. В случае таймаута символ останется в UART ждать последующего считывания. В возвращаемом значении будет содержаться количество байтов, составляющих этот символ.
Если во время вызова метода [[MicroPython:Библиотеки/pyb/Класс UART/UART.write()|UART.write(buf)]] на контакте ''nCTS'' будет задано ''False'', передача данных будет остановлена. Если во время передачи данных истечет таймаут, будет передан не весь буфер. Этот метод возвращает количество записанных байтов, позволяя при необходимости дозаписать оставшиеся данные. В случае таймаута символ останется в [[UART]] ждать последующего считывания. В возвращаемом значении будет содержаться количество байтов, составляющих этот символ.


Если на контакте nCTS задано False, то при вызове метода UART.writechar() произойдет таймаут, разве что цель вовремя не переведет контакт nCTS в активное состояние. При истечении таймаута будет возбуждено исключение OSError 116. Символ будет передан, как только цель переведет контакт nCTS в активное состояние.
Если на контакте ''nCTS'' задано ''False'', то при вызове метода [[MicroPython:Библиотеки/pyb/Класс UART/UART.writechar()|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'', и так будет, пока этот символ не будет считан.


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

Текущая версия от 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.

Примечание

Если бита четности нет, поддерживаются только 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.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, и так будет, пока этот символ не будет считан.

См.также

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