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.
0não invertirá as linhas (o estado inactivo de ambas as linhas é lógico alto).UART.INV_TXinvertirá a linha TX (o estado inactivo da linha TX passa a lógico baixo).UART.INV_RXinvertirá a linha RX (o estado inactivo da linha RX passa a lógico baixo).UART.INV_TX | UART.INV_RXinvertirá 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.
0ignorará os sinais de controlo de fluxo por hardware.UART.RTSactivará 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.CTSactivará 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.CTSactivará 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 chamardeinit()pois impedirá a chamada deinit()novamente.
- deinit() None¶
Desliga o bus UART.
Nota
Não será possível chamar
init()no objecto apósdeinit(). 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
nbytesfor 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
Noneem caso de timeout.
- readinto(buf: bytearray, nbytes: int | None = None, /) int | None¶
Lê bytes para o
buf. Senbytesfor especificado, lê no máximo esse número de bytes. Caso contrário, lê no máximolen(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
bufouNoneem 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
Noneem caso de timeout.
- write(buf: bytes) int | None¶
Escreve o buffer de bytes no bus.
Valor de retorno: número de bytes escritos ou
Noneem 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
-1em caso de timeout). Menor overhead do queread(1)pois não é alocado nenhum objectobytes. Apenas STM32.
- writechar(char: int) None¶
Escreve o único carácter
char(um inteiro no intervalo0–255) na UART. Menor overhead do quewrite()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
OSErrorem 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
Truequando não há transmissão em curso (o buffer TX está vazio e o registo de deslocamento foi drenado),Falsecaso contrário. Útil como alternativa não bloqueante aflush().
- 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ânciaUARTcomo único argumento. PasseNonepara remover um handler previamente instalado.triggeré uma máscara de bits de uma ou mais constantesIRQ_*(ver Constantes abaixo) que seleccionam quais os eventos que disparam o callback.hard=Trueregista 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
flowpara activar o controlo de fluxo por hardware RTS no lado de recepção. Combinar comCTSvia OR para activar ambos.
- 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.