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

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

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

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)

O número de bits pode ser 7, 8 ou 9. A paridade pode ser None, 0 (par) ou 1 (ímpar). O número de bits de paragem pode ser 1 ou 2.

Nota: com parity=None, apenas são suportados 8 e 9 bits. Com paridade ativada, apenas são suportados 7 e 8 bits.

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

Os carateres individuais podem ser lidos/escritos da seguinte forma:

uart.readchar()     # read 1 character and returns it as an integer
uart.writechar(42)  # write 1 character

Para verificar se há dados disponíveis para leitura, utilize:

uart.any()          # returns the number of characters waiting

Nota: As funções de stream read, write, etc. são novas no MicroPython v1.3.4. As versões anteriores utilizam uart.send e uart.recv.

Construtores

class pyb.UART(bus: int | str, *args, **kwargs)

Constrói um objeto UART no bus indicado (um índice inteiro de periférico, p. ex. 3 para UART3). Sem parâmetros adicionais, o objeto é criado mas não inicializado (mantém as definições anteriores do barramento, se existirem); se forem fornecidos argumentos extra, o barramento é inicializado. Consulte init() para os parâmetros disponíveis.

UART(3) está ligado aos mesmos pinos de header em todos os OpenMV Cam STM32:

Sinal

Pino de header

TX

P4

RX

P5

Barramentos UART adicionais estão disponíveis em algumas placas:

Barramento

Pino TX

Pino RX

Disponível em

UART(1)

P1

P0

OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal

UART(4)

P2

P3

OpenMV Cam N6

UART(7)

P14

P13

OpenMV 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 indicados:

  • 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.

  • flow define o tipo de controlo de fluxo. Pode ser 0, UART.RTS, UART.CTS ou UART.RTS | UART.CTS.

  • timeout é o tempo limite em milissegundos para aguardar a escrita/leitura do primeiro carácter.

  • timeout_char é o tempo limite em milissegundos entre carateres durante a escrita ou leitura.

  • read_buf_len é o comprimento em carateres do buffer de leitura (0 para desativar).

Este método lançará uma exceção se a taxa de baud não puder ser definida dentro de 5% do valor pretendido.

Nota: com parity=None, apenas são suportados 8 e 9 bits. Com paridade ativada, apenas são suportados 7 e 8 bits.

deinit() None

Desativa o barramento UART.

any() int

Devolve o número de bytes disponíveis para leitura (pode ser 0).

read(nbytes: int | None = None) bytes | None

Lê carateres. Se nbytes for especificado, lê no máximo esse número de bytes. Se nbytes estiverem disponíveis no buffer, retorna imediatamente; caso contrário, retorna quando chegarem carateres suficientes ou o tempo limite expirar.

Se nbytes não for indicado, o método lê o máximo de dados possível. Retorna após o tempo limite ter expirado.

Nota: para carateres de 9 bits, cada carácter ocupa dois bytes, nbytes tem de ser par, e o número de carateres é nbytes/2.

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

readchar() int

Recebe um único carácter no barramento.

Valor de retorno: o carácter lido, como inteiro. Devolve -1 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.

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

readline() bytes | None

Lê uma linha, terminada num carácter de nova linha. Se tal linha existir, o retorno é imediato. Se o tempo limite expirar, todos os dados disponíveis são devolvidos independentemente de existir ou não uma nova linha.

Valor de retorno: a linha lida ou None em caso de timeout se não houver dados disponíveis.

write(buf: bytes | bytearray | str) int | None

Escreve o buffer de bytes no barramento. Se os carateres tiverem 7 ou 8 bits de largura, cada byte corresponde a um carácter. Se os carateres tiverem 9 bits de largura, são usados dois bytes por carácter (little endian) e buf deve conter um número par de bytes.

Valor de retorno: número de bytes escritos. Se ocorrer timeout e nenhum byte tiver sido escrito, devolve None.

writechar(char: int) None

Escreve um único carácter no barramento. char é um inteiro a escrever. Consulte a secção Controlo de fluxo CTS abaixo para a semântica de bloqueio quando o controlo de fluxo CTS está ativado.

sendbreak() None

Envia uma condição de break no barramento. Coloca o barramento em nível baixo durante 13 bits.

Constantes

RTS: int

Flag de bit para o argumento flow de init(); ativa o controlo de fluxo de hardware RTS (request-to-send) no caminho de receção.

CTS: int

Flag de bit para o argumento flow de init(); ativa o controlo de fluxo de hardware CTS (clear-to-send) no caminho de transmissão. Pode ser combinado com OR com RTS para ativar ambas as direções.

Controlo de Fluxo

UART(3) suporta controlo de fluxo de hardware RTS/CTS. No OpenMV Cam M7, H7, H7 Plus e Pure Thermal, os pinos de controlo de fluxo são:

(TX, RX, nRTS, nCTS) = (P4, P5, P1, P2)

No OpenMV Cam N6, apenas nRTS está exposto (no pino de header P7); nCTS não está encaminhado para o header de I/O.

Nos parágrafos seguintes, o termo «alvo» refere-se ao dispositivo ligado ao UART.

Quando o método init() do UART é chamado com flow definido para um ou ambos os valores UART.RTS e UART.CTS, os pinos de controlo de fluxo relevantes são configurados. nRTS é uma saída ativa-baixo e nCTS é uma entrada ativa-baixo com pull-up ativado. Para ligar o controlo de fluxo, conecte 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 controlo de fluxo CTS estiver ativado, o comportamento de escrita é o seguinte:

Se o método UART.write(buf) da OpenMV Cam for chamado, a transmissão ficará parada durante os períodos em que nCTS for False. Isto resultará num timeout se o buffer completo não for transmitido dentro do período de tempo limite. O método devolve o número de bytes escritos, permitindo ao utilizador escrever o restante dos dados se necessário. Em caso de timeout, um carácter ficará pendente no UART à espera de nCTS. O número de bytes que compõem esse carácter será incluído no valor de retorno.

Se UART.writechar() for chamado quando nCTS é False, o método entrará em timeout a menos que o alvo afirme nCTS a tempo. Se expirar o timeout, será lançado OSError 116. O carácter será transmitido assim que o alvo afirme nCTS.

RTS: a OpenMV Cam controla o transmissor do alvo

Se o controlo de fluxo RTS estiver ativado, o comportamento é o seguinte:

Se for utilizada entrada com buffer (read_buf_len > 0), os carateres recebidos são armazenados em buffer. Se o buffer ficar cheio, o próximo carácter a chegar fará com que nRTS passe a False: o alvo deverá cessar a transmissão. nRTS voltará a True quando os carateres forem lidos do buffer.

Note que o método any() devolve o número de bytes no buffer. Considere um comprimento de buffer de N bytes. Se o buffer ficar cheio e chegar outro carácter, nRTS será definido como False e any() devolverá a contagem N. Quando os carateres forem lidos, o carácter adicional será colocado no buffer e será incluído no resultado de uma chamada subsequente a any().

Se não for utilizada entrada com buffer (read_buf_len == 0), a chegada de um carácter fará com que nRTS passe a False até que o carácter seja lido.