classe UART – bus de comunicação série duplex

A UART implementa o protocolo de comunicação série duplex UART/USART padrão. A nível físico é composto por 2 linhas: RX e TX. A unidade de comunicação é um carácter (não confundir com um carácter de string) que pode ter 8 ou 9 bits de largura.

Os objectos UART podem ser criados e inicializados da seguinte forma:

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

Os bits podem ser 7, 8 ou 9. O stop pode ser 1 ou 2. Com parity=None, apenas 8 e 9 bits são suportados. Com paridade activada, apenas 7 e 8 bits são suportados.

Um objecto UART comporta-se como um objecto stream e a leitura e escrita são feitas utilizando os métodos padrão 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

Construtores

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)

Constrói um objecto UART com o id fornecido.

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 o bus UART com os parâmetros fornecidos:

  • baudrate é a taxa de clock.

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

  • parity é a paridade, None, 0 (par) ou 1 (ímpar).

  • stop é o número de bits de paragem, 1 ou 2.

Parâmetros adicionais apenas por palavra-chave que podem ser suportados por um port são:

  • tx especifica o pino TX a utilizar.

  • rx especifica o pino RX a utilizar.

  • rts especifica o pino RTS (saída) a utilizar para controlo de fluxo de recepção por hardware.

  • cts especifica o pino CTS (entrada) a utilizar para controlo de fluxo de transmissão por hardware.

  • txbuf especifica o comprimento em caracteres do buffer TX.

  • rxbuf especifica o comprimento em caracteres do buffer RX.

  • timeout especifica o tempo de espera pelo primeiro carácter (em ms).

  • timeout_char especifica o tempo de espera entre caracteres (em ms).

  • invert especifica quais as linhas a inverter.

    • 0 não invertirá as linhas (o estado inactivo de ambas as linhas é lógico alto).

    • UART.INV_TX invertirá a linha TX (o estado inactivo da linha TX passa a lógico baixo).

    • UART.INV_RX invertirá a linha RX (o estado inactivo da linha RX passa a lógico baixo).

    • UART.INV_TX | UART.INV_RX invertirá ambas as linhas (estado inactivo em lógico baixo).

  • flow especifica os sinais de controlo de fluxo por hardware a utilizar. O valor é uma máscara de bits.

    • 0 ignorará os sinais de controlo de fluxo por hardware.

    • UART.RTS activará o controlo de fluxo de recepção utilizando o pino de saída RTS para sinalizar se o FIFO de recepção tem espaço suficiente para aceitar mais dados.

    • UART.CTS activará o controlo de fluxo de transmissão pausando a transmissão quando o pino de entrada CTS sinalizar que o receptor está com pouco espaço no buffer.

    • UART.RTS | UART.CTS activará ambos, para controlo de fluxo por hardware completo.

Nota

É possível chamar init() várias vezes no mesmo objecto para reconfigurar a UART em tempo de execução. Isso permite utilizar um único periférico UART para servir diferentes dispositivos ligados a diferentes pinos GPIO. Apenas um dispositivo pode ser servido de cada vez nesse caso. Também não deve chamar deinit() pois impedirá a chamada de init() novamente.

deinit() None

Desliga o bus UART.

Nota

Não será possível chamar init() no objecto após deinit(). Nesse caso, é necessário criar uma nova instância.

any() int

Devolve um inteiro que conta o número de caracteres que podem ser lidos sem bloquear. Devolverá 0 se não houver caracteres disponíveis e um número positivo se houver caracteres. O método pode devolver 1 mesmo que haja mais de um carácter disponível para leitura.

Para consultas mais sofisticadas sobre caracteres disponíveis, utilize select.poll:

poll = select.poll()
poll.register(uart, select.POLLIN)
poll.poll(timeout)
read(nbytes: int | None = None, /) bytes | None

Lê caracteres. Se nbytes for especificado, lê no máximo esse número de bytes; caso contrário, lê o máximo de dados possível. Pode retornar mais cedo se for atingido um timeout. O timeout é configurável no construtor.

Valor de retorno: um objecto bytes contendo os bytes lidos. Devolve None em caso de timeout.

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

Lê bytes para o buf. Se nbytes for especificado, lê no máximo esse número de bytes. Caso contrário, lê no máximo len(buf) bytes. Pode retornar mais cedo se for atingido um timeout. O timeout é configurável no construtor.

Valor de retorno: número de bytes lidos e armazenados em buf ou None em caso de timeout.

readline() bytes | None

Lê uma linha, terminando num carácter de nova linha. Pode retornar mais cedo se for atingido um timeout. O timeout é configurável no construtor.

Valor de retorno: a linha lida ou None em caso de timeout.

write(buf: bytes) int | None

Escreve o buffer de bytes no bus.

Valor de retorno: número de bytes escritos ou None em caso de timeout.

sendbreak() None

Envia uma condição de break no bus – mantém TX em baixo durante mais tempo do que um carácter. Disponível em STM32 e mimxrt; não exposto em alif.

readchar() int

Lê um único carácter da UART e devolve-o como um inteiro (ou -1 em caso de timeout). Menor overhead do que read(1) pois não é alocado nenhum objecto bytes. Apenas STM32.

writechar(char: int) None

Escreve o único carácter char (um inteiro no intervalo 0255) na UART. Menor overhead do que write() para envios de byte único. Apenas STM32.

flush() None

Bloqueia até que todos os bytes actualmente no buffer de transmissão tenham sido enviados em TX. Lança OSError em caso de timeout; o timeout é derivado do tamanho do buffer TX e da taxa de baud configurada, pelo que, salvo se o controlo de fluxo estiver activado e o receptor estiver parado, a chamada retorna muito antes do timeout.

txdone() bool

Devolve True quando não há transmissão em curso (o buffer TX está vazio e o registo de deslocamento foi drenado), False caso contrário. Útil como alternativa não bloqueante a flush().

irq(handler: Callable[[UART], None] | None = None, trigger: int = 0, hard: bool = False) None

Instala um callback para disparar em eventos UART.

handler é a função a invocar. Recebe a instância UART como único argumento. Passe None para remover um handler previamente instalado.

trigger é uma máscara de bits de uma ou mais constantes IRQ_* (ver Constantes abaixo) que seleccionam quais os eventos que disparam o callback.

hard=True regista um handler de interrupção rígida (menor latência, mas o handler não deve alocar memória). O padrão é um callback agendado.

Devolve um objecto irq.

Nem todas as fontes IRQ estão disponíveis em todos os ports – consulte as constantes IRQ_* individuais para disponibilidade por port.

Constantes

RTS: int

Passar a flow para activar o controlo de fluxo por hardware RTS no lado de recepção. Combinar com CTS via OR para activar ambos.

CTS: int

Passar a flow para activar o controlo de fluxo por hardware CTS no lado de transmissão.

IRQ_RXIDLE: int

Flag de disparo de irq(): dispara uma vez após um ou mais caracteres terem sido recebidos e a linha RX ficar inactiva. Disponível em todos os ports OpenMV.

IRQ_RX: int

Flag de disparo de irq(): dispara após cada carácter recebido. Disponível em STM32 e alif.

IRQ_TXIDLE: int

Flag de disparo de irq(): dispara quando o último carácter de uma transmissão é enviado. Disponível em mimxrt e alif.

IRQ_BREAK: int

Flag de disparo de irq(): dispara quando uma condição de break é detectada em RX. Não disponível em nenhum port OpenMV.