clase UART – bus de comunicación serie dúplex

UART implementa el protocolo estándar de comunicaciones serie dúplex UART/USART. A nivel físico consta de 2 líneas: RX y TX. La unidad de comunicación es un carácter (que no debe confundirse con un carácter de cadena) que puede tener 8 o 9 bits de ancho.

Los objetos UART pueden crearse e inicializarse usando:

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 puede ser 7, 8 o 9. La paridad puede ser None, 0 (par) o 1 (impar). Stop puede ser 1 o 2.

Nota: con parity=None, solo se admiten 8 y 9 bits. Con la paridad habilitada, solo se admiten 7 y 8 bits.

Un objeto UART actúa como un objeto stream y la lectura y escritura se realizan usando los métodos de stream estándar:

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

Los caracteres individuales pueden leerse/escribirse usando:

uart.readchar()     # read 1 character and returns it as an integer
uart.writechar(42)  # write 1 character

Para comprobar si hay algo que leer, use:

uart.any()          # returns the number of characters waiting

Nota: Las funciones de stream read, write, etc. son nuevas en MicroPython v1.3.4. Las versiones anteriores usan uart.send y uart.recv.

Constructores

class pyb.UART(bus: int | str, *args, **kwargs)

Construye un objeto UART en el bus dado (un índice entero de periférico, p. ej. 3 para UART3). Sin parámetros adicionales, el objeto se crea pero no se inicializa (conserva la configuración previa del bus, si la hay); si se dan argumentos adicionales, el bus se inicializa. Consulte init() para conocer los parámetros disponibles.

UART(3) está conectado a los mismos pines de cabecera en todas las OpenMV Cam STM32:

Señal

Pin de cabecera

TX

P4

RX

P5

En algunas placas hay buses UART adicionales disponibles:

Bus

Pin TX

Pin RX

Disponible en

UART(1)

P1

P0

OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal

UART(4)

P2

P3

OpenMV Cam N6

UART(7)

P14

P13

OpenMV Cam N6

Métodos

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

Inicializa el bus UART con los parámetros dados:

  • baudrate es la velocidad de reloj.

  • bits es el número de bits por carácter, 7, 8 o 9.

  • parity es la paridad, None, 0 (par) o 1 (impar).

  • stop es el número de bits de parada, 1 o 2.

  • flow establece el tipo de control de flujo. Puede ser 0, UART.RTS, UART.CTS o UART.RTS | UART.CTS.

  • timeout es el tiempo de espera en milisegundos para escribir/leer el primer carácter.

  • timeout_char es el tiempo de espera en milisegundos entre caracteres durante la escritura o la lectura.

  • read_buf_len es la longitud en caracteres del búfer de lectura (0 para deshabilitar).

Este método lanzará una excepción si la velocidad en baudios no pudo establecerse dentro del 5% del valor deseado.

Nota: con parity=None, solo se admiten 8 y 9 bits. Con la paridad habilitada, solo se admiten 7 y 8 bits.

deinit() None

Apaga el bus UART.

any() int

Devuelve el número de bytes en espera (puede ser 0).

read(nbytes: int | None = None) bytes | None

Lee caracteres. Si se especifica nbytes, lee como máximo esa cantidad de bytes. Si hay nbytes disponibles en el búfer, devuelve inmediatamente; de lo contrario, devuelve cuando lleguen suficientes caracteres o transcurra el tiempo de espera.

Si no se da nbytes, el método lee todos los datos que sea posible. Devuelve después de que transcurra el tiempo de espera.

Nota: para caracteres de 9 bits, cada carácter ocupa dos bytes, nbytes debe ser par y el número de caracteres es nbytes/2.

Valor de retorno: un objeto bytes que contiene los bytes leídos. Devuelve None si se agota el tiempo de espera.

readchar() int

Recibe un solo carácter en el bus.

Valor de retorno: El carácter leído, como un entero. Devuelve -1 si se agota el tiempo de espera.

readinto(buf: bytearray, nbytes: int | None = None) int | None

Lee bytes en buf. Si se especifica nbytes, lee como máximo esa cantidad de bytes. De lo contrario, lee como máximo len(buf) bytes.

Valor de retorno: número de bytes leídos y almacenados en buf o None si se agota el tiempo de espera.

readline() bytes | None

Lee una línea que termina en un carácter de nueva línea. Si existe tal línea, el retorno es inmediato. Si transcurre el tiempo de espera, se devuelven todos los datos disponibles independientemente de si existe una nueva línea.

Valor de retorno: la línea leída o None si se agota el tiempo de espera y no hay datos disponibles.

write(buf: bytes | bytearray | str) int | None

Escribe el búfer de bytes en el bus. Si los caracteres tienen 7 u 8 bits de ancho, cada byte es un carácter. Si los caracteres tienen 9 bits de ancho, se usan dos bytes por cada carácter (little endian), y buf debe contener un número par de bytes.

Valor de retorno: número de bytes escritos. Si se produce un tiempo de espera y no se escribió ningún byte, devuelve None.

writechar(char: int) None

Escribe un solo carácter en el bus. char es un entero que escribir. Consulte la sección control de flujo CTS a continuación para conocer la semántica de bloqueo cuando el control de flujo CTS está habilitado.

sendbreak() None

Envía una condición de break en el bus. Esto lleva el bus a nivel bajo durante una duración de 13 bits.

Constantes

RTS: int

Bandera de bit para el argumento flow de init(); habilita el control de flujo por hardware RTS (request-to-send) en la ruta de recepción.

CTS: int

Bandera de bit para el argumento flow de init(); habilita el control de flujo por hardware CTS (clear-to-send) en la ruta de transmisión. Puede combinarse mediante OR con RTS para habilitar ambas direcciones.

Control de flujo

UART(3) admite control de flujo por hardware RTS/CTS. En las OpenMV Cam M7, H7, H7 Plus y Pure Thermal, los pines de control de flujo son:

(TX, RX, nRTS, nCTS) = (P4, P5, P1, P2)

En la OpenMV Cam N6 solo se expone nRTS (en el pin de cabecera P7); nCTS no está conectado a la cabecera de E/S.

En los siguientes párrafos el término «target» se refiere al dispositivo conectado al UART.

Cuando el método init() del UART se llama con flow establecido en uno o ambos de UART.RTS y UART.CTS, se configuran los pines de control de flujo correspondientes. nRTS es una salida activa en nivel bajo y nCTS es una entrada activa en nivel bajo con resistencia pull-up habilitada. Para conectar el control de flujo, conecte el nCTS de la OpenMV Cam al nRTS del target y el nRTS de la OpenMV Cam al nCTS del target.

CTS: el target controla el transmisor de la OpenMV Cam

Si el control de flujo CTS está habilitado, el comportamiento de escritura es el siguiente:

Si se llama al método UART.write(buf) de la OpenMV Cam, la transmisión se detendrá durante los periodos en que nCTS sea False. Esto resultará en un tiempo de espera agotado si el búfer completo no se transmitió dentro del periodo de espera. El método devuelve el número de bytes escritos, lo que permite al usuario escribir el resto de los datos si es necesario. En caso de un tiempo de espera agotado, un carácter permanecerá en el UART a la espera de nCTS. El número de bytes que componen este carácter se incluirá en el valor de retorno.

Si se llama a UART.writechar() cuando nCTS es False, el método agotará el tiempo de espera a menos que el target afirme nCTS a tiempo. Si se agota el tiempo de espera, se lanzará OSError 116. El carácter se transmitirá tan pronto como el target afirme nCTS.

RTS: la OpenMV Cam controla el transmisor del target

Si el control de flujo RTS está habilitado, el comportamiento es el siguiente:

Si se utiliza entrada con búfer (read_buf_len > 0), los caracteres entrantes se almacenan en el búfer. Si el búfer se llena, el siguiente carácter que llegue hará que nRTS pase a False: el target debería cesar la transmisión. nRTS pasará a True cuando se lean caracteres del búfer.

Tenga en cuenta que el método any() devuelve el número de bytes en el búfer. Suponga una longitud de búfer de N bytes. Si el búfer se llena y llega otro carácter, nRTS se establecerá en False, y any() devolverá el recuento N. Cuando se lean caracteres, el carácter adicional se colocará en el búfer y se incluirá en el resultado de una llamada posterior a any().

Si no se utiliza entrada con búfer (read_buf_len == 0), la llegada de un carácter hará que nRTS pase a False hasta que se lea el carácter.