MicroPython:Библиотеки/machine/Класс UART
Класс UART – двусторонняя последовательная шина[1]
В классе UART реализован стандартный двусторонний протокол для последовательной коммуникации UART/USART. На физическом уровне он состоит из 2 линий: RX и TX. Единицей коммуникации считается символ (не путайте со строковым символом), размер которого может составлять 8 или 9 бит.
Создать и инициализировать объект UART можно следующим образом:
from machine import UART
# инициализируем с заданной скоростью передачи данных:
uart = UART(1, 9600)
# инициализируем с заданными параметрами:
uart.init(9600, bits=8, parity=None, stop=1)
Поддерживаемые аргументы на разных платах могут отличаться.
Pyboard: в bits можно задать «7», «8» или «9» (т.е. битов может быть 7, 8 или 9). В stop можно задать «1» или «2» (т.е. стоп-битов будет 1 или 2). Если в parity будет None (т.е. если бит четности будет отсутствовать), поддерживается только 8 или 9 бит. При наличии бита четности поддерживаются только 7 или 8 бит.
WiPy/CC3200: Битов может быть 5, 6, 7 или 8. Стоп-битов может быть 1 или 2.
Объекты UART функционируют аналогично потоковым объектам, а считывание/запись в них выполняются при помощи стандартных потоковых методов:
uart.read(10) # считываем 10 символов, возвращаем объект «bytes»
uart.read() # считываем все доступные символы
uart.readline() # считываем строку
uart.readinto(buf) # считываем данные и сохраняем их в заданный буфер
uart.write('abc') # записываем 3 символа
Конструкторы
- Класс machine.UART(id, ...) – конструирует объект UART с заданным id.
Методы
- UART.init(baudrate=9600, bits=8, parity=None, stop=1, *, ...) – инициализирует шину UART с заданными аргументами:
- baudrate – тактовая частота.
- bits – количество битов на символ (7, 8 или 9).
- parity – бит четности. Здесь можно задать None, «0» (четность) или «1» (нечетность).
- stop – количество стоп-битов (1 или 2).
Дополнительные именованные аргументы, которые могут поддерживаться в некоторых портах:
- tx – здесь задается, какой TX-контакт использовать.
- rx – здесь задается, какой RX-контакт использовать.
- txbuf – здесь задается размер TX-буфера в символах.
- rxbuf – здесь задается размер RX-буфера в символах.
- timeout – здесь задается время ожидания первого символа (в миллисекундах)
- timeout_char – здесь задается время ожидания между символами (в миллисекундах).
- invert – здесь указывается, какие строчки надо инвертировать.
На WiPy поддерживается только один именованный аргумент:
- pins – это список из 2 или 4 элементов, обозначающих контакты TX, RX, RTS и CTS (в таком порядке). Если вы хотите, чтобы UART работал в ограниченном режиме, в любом из этих элементов можно указать None. Если задан контакт RTS, то нужно также обязательно задать и контакт RX. То же самое касается и CTS. Если не будет задано ни одного контакта, то в TX и RX будут использованы значения по умолчанию, а аппаратное управление потоками будет отключено. Если во всех контактах будет указано None, не будет назначено ни одного контакта.
- UART.deinit() – выключает шину UART.
- UART.any() – возвращает целое число, обозначающее количество символов, которые можно прочесть без блокировки. Если доступных символов не будет, метод вернет «0», а если есть, то вернет положительное число. Метод может вернуть «1», даже если для считывания доступно более одного символа.
Есть и более продвинутый способ запроса доступных символов – с помощью select.poll(): poll = select.poll() poll.register(uart, select.POLLIN) poll.poll(timeout)
- UART.read([nbytes]) – считывает символы. Если задан аргумент nbytes, то этот метод будет считывать как можно больше байтов – пока они не кончатся. Но если истечет таймаут, метод может вернуть результат и раньше. Таймаут настраивается в конструкторе.
Возвращаемое значение: объект bytes, содержащий считанные байты. Если истечет таймаут, метод вернет None.
- UART.readinto(buf[, nbytes]) – считывает байты в буфер buf. Если задан аргумент nbytes, то метод будет считывать как можно больше байтов. В противном случае размер считанных байтов не будет превышать размер buf. Если истечет таймаут, метод может вернуть результат и раньше. Таймаут настраивается в конструкторе.
Возвращаемое значение: количество байтов, считанных и сохраненных в буфер buf, или None при таймауте.
- UART.readline() – считывает строку, заканчивающуюся символом новой строки. Если истечет таймаут, может вернуть результат раньше. Таймаут настраивается в конструкторе.
Возвращаемое значение: считанная строка или None при таймауте.
- UART.write(buf) – записывает данные из буфера на шину.
Возвращаемое значение: количество записанных байтов или None при таймауте.
- UART.sendbreak() – отправляет шине состояние прерывания. Это задает шине значение LOW на промежуток времени, который дольше, чем нужно для нормальной отправки символа.
- UART.irq(trigger, priority=1, handler=None, wake=machine.IDLE) – создает функцию обратного вызова, которая будет запущена, когда данные будут присланы на UART.
- trigger – здесь может быть только UART.RX_ANY.
- priority – уровень приоритета прерывания. Здесь могут быть значения в диапазоне 1-7. Чем выше значение, тем выше приоритет.
- handler – опциональная функция, вызываемая при прибытии новых символов.
- wake – здесь может быть только machine.IDLE.
Примечание: Функция-обработчик будет вызвана при выполнении одного из следующих условий:
- Прибытие 8 новых символов.
- В RX-буфере ожидает как минимум 1 символ, а RX-линии «молчит» на протяжении как минимум одного фрейма.
Это значит, что функция-обработчик будет вызываться каждый раз, когда в ожидании будет находиться от 1 до 8 символов. Возвращает объект запроса на прерывание. Доступность: WiPy.
Константы
- UART.RX_ANY – источники запуска запроса на прерывание.
Доступность: WiPy.