classe UART – barramento de comunicação serial duplex¶
A UART implementa o protocolo padrão de comunicações seriais duplex UART/USART. No nível físico, ela consiste em 2 linhas: RX e TX. A unidade de comunicação é um caractere (que não deve ser confundido com um caractere de string) que pode ter 8 ou 9 bits de largura.
Objetos UART podem ser criados e inicializados 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 pode ser 7, 8 ou 9. A paridade pode ser None, 0 (par) ou 1 (ímpar). Stop pode ser 1 ou 2.
Observação: 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 age 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
Caracteres individuais podem ser lidos/escritos usando:
uart.readchar() # read 1 character and returns it as an integer
uart.writechar(42) # write 1 character
Para verificar se há algo a ser lido, use:
uart.any() # returns the number of characters waiting
Observação: As funções de stream read, write, etc. são novas na MicroPython v1.3.4. Versões anteriores usam uart.send e uart.recv.
Construtores¶
- class pyb.UART(bus: int | str, *args, **kwargs)¶
Constrói um objeto UART no
busfornecido (um índice inteiro de periférico, por exemplo3paraUART3). Sem parâmetros adicionais, o objeto é criado mas não inicializado (ele mantém as configurações anteriores do barramento, se houver); se argumentos extras forem fornecidos, o barramento é inicializado. Consulteinit()para os parâmetros disponíveis.UART(3)está conectado aos mesmos pinos do header em toda OpenMV Cam STM32:Sinal
Pino do header
TXP4RXP5Barramentos UART adicionais estão disponíveis em algumas placas:
Barramento
Pino TX
Pino RX
Disponível em
UART(1)P1P0OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal
UART(4)P2P3OpenMV Cam N6
UART(7)P14P13OpenMV 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 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.flowdefine o tipo de controle de fluxo. Pode ser 0,UART.RTS,UART.CTSouUART.RTS | UART.CTS.timeouté o tempo limite em milissegundos para aguardar a escrita/leitura do primeiro caractere.timeout_charé o tempo limite em milissegundos para aguardar entre caracteres durante a escrita ou leitura.read_buf_lené o comprimento em caracteres do buffer de leitura (0 para desabilitar).
Este método lançará uma exceção se a baudrate não puder ser definida dentro de 5% do valor desejado.
Observação: com parity=None, apenas 8 e 9 bits são suportados. Com a paridade habilitada, apenas 7 e 8 bits são suportados.
- read(nbytes: int | None = None) bytes | None¶
Lê caracteres. Se
nbytesfor especificado, lê no máximo essa quantidade de bytes. Senbytesestiverem disponíveis no buffer, retorna imediatamente; caso contrário, retorna quando caracteres suficientes chegarem ou quando o tempo limite expirar.Se
nbytesnão for fornecido, o método lê a maior quantidade de dados possível. Ele retorna após o tempo limite ter expirado.Observação: para caracteres de 9 bits, cada caractere ocupa dois bytes,
nbytesdeve ser par, e o número de caracteres énbytes/2.Valor de retorno: um objeto bytes contendo os bytes lidos. Retorna
Noneem caso de tempo limite.
- readchar() int¶
Recebe um único caractere no barramento.
Valor de retorno: O caractere lido, como um inteiro. Retorna -1 em caso de tempo limite.
- 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.Valor de retorno: número de bytes lidos e armazenados em
bufouNoneem caso de tempo limite.
- readline() bytes | None¶
Lê uma linha, terminada por um caractere de nova linha. Se tal linha existir, o retorno é imediato. Se o tempo limite expirar, todos os dados disponíveis são retornados independentemente de existir ou não uma nova linha.
Valor de retorno: a linha lida ou
Noneem caso de tempo limite se nenhum dado estiver disponível.
- write(buf: bytes | bytearray | str) int | None¶
Escreve o buffer de bytes no barramento. Se os caracteres tiverem 7 ou 8 bits de largura, então cada byte é um caractere. Se os caracteres tiverem 9 bits de largura, então dois bytes são usados para cada caractere (little endian), e
bufdeve conter um número par de bytes.Valor de retorno: número de bytes escritos. Se ocorrer um tempo limite e nenhum byte tiver sido escrito, retorna
None.
Constantes¶
Controle de Fluxo¶
UART(3) suporta controle de fluxo por hardware RTS/CTS. Nas OpenMV Cam M7, H7, H7 Plus e Pure Thermal os pinos de controle de fluxo são:
(TX, RX, nRTS, nCTS) = (P4, P5, P1, P2)
Na OpenMV Cam N6 apenas nRTS é exposto (no pino P7 do header); nCTS não é roteado para o header de I/O.
Nos parágrafos a seguir, o termo “alvo” refere-se ao dispositivo conectado à UART.
Quando o método init() da UART é chamado com flow definido como um ou ambos de UART.RTS e UART.CTS, os pinos de controle de fluxo relevantes são configurados. nRTS é uma saída ativa em nível baixo e nCTS é uma entrada ativa em nível baixo com pull-up habilitado. Para conectar o controle de fluxo, ligue o nCTS da OpenMV Cam ao nRTS do alvo e o nRTS da OpenMV Cam ao nCTS do alvo.
CTS: o alvo controla o transmissor da OpenMV Cam¶
Se o controle de fluxo CTS estiver habilitado, o comportamento de escrita é o seguinte:
Se o método UART.write(buf) da OpenMV Cam for chamado, a transmissão será interrompida durante qualquer período em que nCTS for False. Isso resultará em um tempo limite se o buffer inteiro não tiver sido transmitido dentro do período de tempo limite. O método retorna o número de bytes escritos, permitindo que o usuário escreva o restante dos dados se necessário. Em caso de tempo limite, um caractere permanecerá na UART aguardando nCTS. O número de bytes que compõem esse caractere será incluído no valor de retorno.
Se UART.writechar() for chamado quando nCTS for False, o método atingirá o tempo limite a menos que o alvo afirme nCTS a tempo. Se atingir o tempo limite, OSError 116 será lançado. O caractere será transmitido assim que o alvo afirmar nCTS.
RTS: a OpenMV Cam controla o transmissor do alvo¶
Se o controle de fluxo RTS estiver habilitado, o comportamento é o seguinte:
Se a entrada com buffer for usada (read_buf_len > 0), os caracteres recebidos são armazenados em buffer. Se o buffer ficar cheio, o próximo caractere a chegar fará com que nRTS vá para False: o alvo deve cessar a transmissão. nRTS irá para True quando os caracteres forem lidos do buffer.
Observe que o método any() retorna o número de bytes no buffer. Suponha um comprimento de buffer de N bytes. Se o buffer ficar cheio e outro caractere chegar, nRTS será definido como False, e any() retornará a contagem N. Quando os caracteres forem lidos, o caractere adicional será colocado no buffer e será incluído no resultado de uma chamada subsequente de any().
Se a entrada com buffer não for usada (read_buf_len == 0), a chegada de um caractere fará com que nRTS vá para False até que o caractere seja lido.