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
busindicado (um índice inteiro de periférico, p. ex.3paraUART3). 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. Consulteinit()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
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 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.flowdefine o tipo de controlo 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 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.
- read(nbytes: int | None = None) bytes | None¶
Lê carateres. Se
nbytesfor especificado, lê no máximo esse número de bytes. Senbytesestiverem disponíveis no buffer, retorna imediatamente; caso contrário, retorna quando chegarem carateres suficientes ou o tempo limite expirar.Se
nbytesnã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,
nbytestem de ser par, e o número de carateres énbytes/2.Valor de retorno: um objeto bytes contendo os bytes lidos. Devolve
Noneem 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. Senbytesfor especificado, lê no máximo esse número 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 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
Noneem 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
bufdeve 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.
Constantes¶
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.