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 se pueden crear e inicializar usando:
from machine import UART
uart = UART(3, 9600) # init with given baudrate
uart.init(9600, bits=8, parity=None, stop=1) # init with given parameters
Bits puede ser 7, 8 o 9. Stop puede ser 1 o 2. 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 mediante los métodos estándar de stream:
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
Constructores¶
- class machine.UART(id: int, baudrate: int = 9600, bits: int = 8, parity: int | None = None, stop: int = 1, *, tx: Pin | None = None, rx: Pin | None = None, rts: Pin | None = None, cts: Pin | None = None, txbuf: int | None = None, rxbuf: int | None = None, timeout: int | None = None, timeout_char: int | None = None, invert: int = 0, flow: int = 0)¶
Construye un objeto UART con el id indicado.
Métodos¶
- init(baudrate: int = 9600, bits: int = 8, parity: int | None = None, stop: int = 1, *, tx: Pin | None = None, rx: Pin | None = None, rts: Pin | None = None, cts: Pin | None = None, txbuf: int | None = None, rxbuf: int | None = None, timeout: int | None = None, timeout_char: int | None = None, invert: int = 0, flow: int = 0) None¶
Inicializa el bus UART con los parámetros indicados:
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.
Parámetros adicionales solo por palabra clave que pueden estar admitidos por un puerto son:
tx especifica el pin TX a utilizar.
rx especifica el pin RX a utilizar.
rts especifica el pin RTS (salida) a utilizar para el control de flujo de recepción por hardware.
cts especifica el pin CTS (entrada) a utilizar para el control de flujo de transmisión por hardware.
txbuf especifica la longitud en caracteres del búfer de TX.
rxbuf especifica la longitud en caracteres del búfer de RX.
timeout especifica el tiempo de espera del primer carácter (en ms).
timeout_char especifica el tiempo de espera entre caracteres (en ms).
invert especifica qué líneas se deben invertir.
0no invertirá ninguna línea (el estado de reposo de ambas líneas es nivel lógico alto).UART.INV_TXinvertirá la línea TX (el estado de reposo de la línea TX pasa a ser nivel lógico bajo).UART.INV_RXinvertirá la línea RX (el estado de reposo de la línea RX pasa a ser nivel lógico bajo).UART.INV_TX | UART.INV_RXinvertirá ambas líneas (estado de reposo en nivel lógico bajo).
flow especifica qué señales de control de flujo por hardware utilizar. El valor es una máscara de bits.
0ignorará las señales de control de flujo por hardware.UART.RTShabilitará el control de flujo de recepción usando el pin de salida RTS para indicar si la FIFO de recepción tiene espacio suficiente para aceptar más datos.UART.CTShabilitará el control de flujo de transmisión pausando la transmisión cuando el pin de entrada CTS indique que al receptor le queda poco espacio en el búfer.UART.RTS | UART.CTShabilitará ambos, para un control de flujo por hardware completo.
Nota
Es posible llamar a
init()varias veces sobre el mismo objeto para reconfigurar la UART sobre la marcha. Esto permite usar un único periférico UART para atender distintos dispositivos conectados a diferentes pines GPIO. En ese caso, solo se puede atender un dispositivo a la vez. Tampoco llames adeinit(), ya que impedirá volver a llamar ainit().
- deinit() None¶
Apaga el bus UART.
Nota
No podrás llamar a
init()sobre el objeto después dedeinit(). En ese caso es necesario crear una nueva instancia.
- any() int¶
Devuelve un entero que cuenta el número de caracteres que se pueden leer sin bloqueo. Devolverá 0 si no hay caracteres disponibles y un número positivo si los hay. El método puede devolver 1 incluso si hay más de un carácter disponible para leer.
Para una consulta más sofisticada de los caracteres disponibles, usa select.poll:
poll = select.poll() poll.register(uart, select.POLLIN) poll.poll(timeout)
- read(nbytes: int | None = None, /) bytes | None¶
Lee caracteres. Si se especifica
nbytes, lee como máximo esa cantidad de bytes; de lo contrario, lee tantos datos como sea posible. Puede regresar antes si se alcanza un tiempo de espera. El tiempo de espera es configurable en el constructor.Valor de retorno: un objeto bytes que contiene los bytes leídos. Devuelve
Nonesi se agota el tiempo de espera.
- readinto(buf: bytearray, nbytes: int | None = None, /) int | None¶
Lee bytes en
buf. Si se especificanbytes, lee como máximo esa cantidad de bytes. De lo contrario, lee como máximolen(buf)bytes. Puede regresar antes si se alcanza un tiempo de espera. El tiempo de espera es configurable en el constructor.Valor de retorno: número de bytes leídos y almacenados en
buf, oNonesi se agota el tiempo de espera.
- readline() bytes | None¶
Lee una línea, terminada en un carácter de nueva línea. Puede regresar antes si se alcanza un tiempo de espera. El tiempo de espera es configurable en el constructor.
Valor de retorno: la línea leída o
Nonesi se agota el tiempo de espera.
- write(buf: bytes) int | None¶
Escribe el búfer de bytes en el bus.
Valor de retorno: número de bytes escritos o
Nonesi se agota el tiempo de espera.
- sendbreak() None¶
Envía una condición de break en el bus – pone TX a nivel bajo durante más tiempo que el de un carácter. Disponible en STM32 y mimxrt; no expuesto en alif.
- readchar() int¶
Lee un único carácter de la UART y lo devuelve como un entero (o
-1si se agota el tiempo de espera). Menor sobrecarga queread(1)ya que no se asigna ningún objetobytes. Solo STM32.
- writechar(char: int) None¶
Escribe el único carácter
char(un entero en el rango0–255) en la UART. Menor sobrecarga quewrite()para envíos de un solo byte. Solo STM32.
- flush() None¶
Se bloquea hasta que cada byte que hay actualmente en el búfer de transmisión haya salido por TX. Lanza
OSErrorsi se agota el tiempo de espera; el tiempo de espera se deriva del tamaño del búfer de TX y de la velocidad en baudios configurada, por lo que, a menos que el control de flujo esté habilitado y el receptor se detenga, la llamada regresa bastante antes del tiempo de espera.
- txdone() bool¶
Devuelve
Truecuando no hay ninguna transmisión en curso (el búfer de TX está vacío y el registro de desplazamiento se ha vaciado), yFalseen caso contrario. Útil como alternativa no bloqueante aflush().
- irq(handler: Callable[[UART], None] | None = None, trigger: int = 0, hard: bool = False) None¶
Instala una función de retorno (callback) para que se active en eventos de la UART.
handleres la función a invocar. Recibe la instancia deUARTcomo su único argumento. PasaNonepara eliminar un manejador instalado previamente.triggeres una máscara de bits de una o más constantesIRQ_*(ver Constantes más abajo) que selecciona qué eventos activan la función de retorno (callback).hard=Trueregistra un manejador de interrupción dura (menor latencia, pero el manejador no debe asignar memoria). El valor predeterminado es una función de retorno (callback) programada.Devuelve un objeto irq.
No todas las fuentes de IRQ están disponibles en todos los puertos – consulta las constantes
IRQ_*individuales para conocer la disponibilidad por puerto.
Constantes¶
- RTS: int¶
Pásalo a
flowpara habilitar el control de flujo por hardware RTS en el lado de recepción. Combínalo conCTSmediante OR para habilitar ambos.
- CTS: int¶
Pásalo a
flowpara habilitar el control de flujo por hardware CTS en el lado de transmisión.
- IRQ_RXIDLE: int¶
Indicador de activación de
irq(): se activa una vez después de que se hayan recibido uno o más caracteres y la línea RX pase entonces a reposo. Disponible en todos los puertos de OpenMV.
- IRQ_RX: int¶
Indicador de activación de
irq(): se activa tras cada carácter recibido. Disponible en STM32 y alif.