classe UART – barramento de comunicação serial duplex¶
A UART implementa o protocolo padrão de comunicação serial duplex UART/USART. No nível físico, ela consiste em 2 linhas: RX e TX. A unidade de comunicação é um caractere (não confundir com um caractere de string), que pode ter 8 ou 9 bits de largura.
Os objetos UART podem ser criados e inicializados 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
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 a paridade habilitada, apenas 7 e 8 bits são suportados.
Um objeto UART comporta-se como um objeto stream, e a leitura e a escrita são feitas usando 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 objeto 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 barramento UART com os parâmetros fornecidos:
baudrate é a taxa de clock.
bits é o número de bits por caractere: 7, 8 ou 9.
parity é a paridade:
None, 0 (par) ou 1 (ímpar).stop é o número de stop bits: 1 ou 2.
Parâmetros adicionais somente por palavra-chave que podem ser suportados por uma porta são:
tx especifica o pino TX a ser usado.
rx especifica o pino RX a ser usado.
rts especifica o pino RTS (saída) a ser usado para o controle de fluxo de recepção por hardware.
cts especifica o pino CTS (entrada) a ser usado para o controle de fluxo de transmissão por hardware.
txbuf especifica o comprimento em caracteres do buffer de TX.
rxbuf especifica o comprimento em caracteres do buffer de RX.
timeout especifica o tempo de espera pelo primeiro caractere (em ms).
timeout_char especifica o tempo de espera entre caracteres (em ms).
invert especifica quais linhas devem ser invertidas.
0não inverte as linhas (o estado ocioso de ambas as linhas é nível lógico alto).UART.INV_TXinverte a linha TX (o estado ocioso da linha TX passa a ser nível lógico baixo).UART.INV_RXinverte a linha RX (o estado ocioso da linha RX passa a ser nível lógico baixo).UART.INV_TX | UART.INV_RXinverte ambas as linhas (estado ocioso em nível lógico baixo).
flow especifica quais sinais de controle de fluxo por hardware usar. O valor é uma máscara de bits.
0ignora os sinais de controle de fluxo por hardware.UART.RTShabilita o controle de fluxo de recepção usando o pino de saída RTS para sinalizar se a FIFO de recepção tem espaço suficiente para aceitar mais dados.UART.CTShabilita o controle de fluxo de transmissão pausando a transmissão quando o pino de entrada CTS sinaliza que o receptor está com pouco espaço de buffer.UART.RTS | UART.CTShabilita ambos, para o controle de fluxo por hardware completo.
Nota
É possível chamar
init()várias vezes no mesmo objeto para reconfigurar a UART em tempo de execução. Isso permite usar um único periférico UART para atender a diferentes dispositivos conectados a diferentes pinos GPIO. Nesse caso, apenas um dispositivo pode ser atendido por vez. Além disso, não chamedeinit(), pois isso impedirá chamarinit()novamente.
- deinit() None¶
Desliga o barramento UART.
Nota
Você não conseguirá chamar
init()no objeto apósdeinit(). Nesse caso, é necessário criar uma nova instância.
- any() int¶
Retorna um inteiro contando o número de caracteres que podem ser lidos sem bloqueio. Retorna 0 se não houver caracteres disponíveis e um número positivo se houver caracteres. O método pode retornar 1 mesmo que haja mais de um caractere disponível para leitura.
Para uma consulta mais sofisticada dos caracteres disponíveis, use 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 essa quantidade de bytes; caso contrário, lê o máximo de dados possível. Pode retornar mais cedo se um timeout for atingido. O timeout é configurável no construtor.Valor de retorno: um objeto bytes contendo os bytes lidos. Retorna
Noneem caso de timeout.
- readinto(buf: bytearray, nbytes: int | None = None, /) int | None¶
Lê bytes para dentro de
buf. Senbytesfor especificado, lê no máximo essa quantidade de bytes. Caso contrário, lê no máximolen(buf)bytes. Pode retornar mais cedo se um timeout for atingido. 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 que termina com um caractere de nova linha. Pode retornar mais cedo se um timeout for atingido. 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 barramento.
Valor de retorno: número de bytes escritos ou
Noneem caso de timeout.
- sendbreak() None¶
Envia uma condição de break no barramento – mantém TX em nível baixo por mais tempo do que a duração de um caractere. Disponível em STM32 e mimxrt; não exposto em alif.
- readchar() int¶
Lê um único caractere da UART e o retorna como um inteiro (ou
-1em caso de timeout). Menor overhead do queread(1), já que nenhum objetobytesé alocado. Apenas STM32.
- writechar(char: int) None¶
Escreve o único caractere
char(um inteiro no intervalo0–255) na UART. Menor overhead do quewrite()para envios de um único byte. Apenas STM32.
- flush() None¶
Bloqueia até que cada byte atualmente no buffer de transmissão tenha sido enviado por TX. Levanta
OSErrorem caso de timeout; o timeout é derivado do tamanho do buffer de TX e da baud rate configurada, de modo que, a menos que o controle de fluxo esteja habilitado e o receptor trave, a chamada retorna bem antes do timeout.
- txdone() bool¶
Retorna
Truequando nenhuma transmissão está em andamento (o buffer de TX está vazio e o registrador de deslocamento foi esvaziado), eFalsecaso contrário. Útil como uma alternativa não bloqueante aflush().
- irq(handler: Callable[[UART], None] | None = None, trigger: int = 0, hard: bool = False) None¶
Instala um callback para ser disparado em eventos da UART.
handleré a função a ser invocada. Ela recebe a instânciaUARTcomo seu único argumento. PasseNonepara remover um handler instalado anteriormente.triggeré uma máscara de bits de uma ou mais constantesIRQ_*(veja Constantes abaixo) que selecionam quais eventos disparam o callback.hard=Trueregistra um handler de interrupção hard (menor latência, mas o handler não pode alocar). O padrão é um callback agendado.Retorna um objeto irq.
Nem toda fonte de IRQ está disponível em todas as portas – consulte as constantes
IRQ_*individuais para a disponibilidade por porta.
Constantes¶
- RTS: int¶
Passe para
flowpara habilitar o controle de fluxo por hardware RTS no lado da recepção. Combine comCTSpor meio de OR para habilitar ambos.
- CTS: int¶
Passe para
flowpara habilitar o controle de fluxo por hardware CTS no lado da transmissão.
- IRQ_RXIDLE: int¶
Flag de trigger de
irq(): dispara uma vez depois que um ou mais caracteres forem recebidos e a linha RX ficar ociosa em seguida. Disponível em todas as portas OpenMV.
- IRQ_RX: int¶
Flag de trigger de
irq(): dispara após cada caractere recebido. Disponível em STM32 e alif.