classe UART – bus di comunicazione seriale duplex

UART implementa il protocollo standard di comunicazione seriale duplex UART/USART. A livello fisico è costituito da 2 linee: RX e TX. L’unità di comunicazione è un carattere (da non confondere con un carattere di stringa) che può essere largo 8 o 9 bit.

Gli oggetti UART possono essere creati e inizializzati 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

I bit possono essere 7, 8 o 9. Lo stop può essere 1 o 2. Con parity=None, sono supportati solo 8 e 9 bit. Con la parità abilitata, sono supportati solo 7 e 8 bit.

Un oggetto UART si comporta come un oggetto stream e la lettura e la scrittura vengono eseguite usando i metodi standard degli 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

Costruttori

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)

Costruisce un oggetto UART con l’id specificato.

Metodi

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

Inizializza il bus UART con i parametri specificati:

  • baudrate è la frequenza di clock.

  • bits è il numero di bit per carattere, 7, 8 o 9.

  • parity è la parità, None, 0 (pari) o 1 (dispari).

  • stop è il numero di bit di stop, 1 o 2.

Parametri aggiuntivi solo a parole chiave che possono essere supportati da una porta sono:

  • tx specifica il pin TX da usare.

  • rx specifica il pin RX da usare.

  • rts specifica il pin RTS (output) da usare per il controllo di flusso hardware in ricezione.

  • cts specifica il pin CTS (input) da usare per il controllo di flusso hardware in trasmissione.

  • txbuf specifica la lunghezza in caratteri del buffer TX.

  • rxbuf specifica la lunghezza in caratteri del buffer RX.

  • timeout specifica il tempo di attesa per il primo carattere (in ms).

  • timeout_char specifica il tempo di attesa tra i caratteri (in ms).

  • invert specifica quali linee invertire.

    • 0 non invertirà le linee (lo stato di riposo di entrambe le linee è il livello logico alto).

    • UART.INV_TX invertirà la linea TX (lo stato di riposo della linea TX è ora il livello logico basso).

    • UART.INV_RX invertirà la linea RX (lo stato di riposo della linea RX è ora il livello logico basso).

    • UART.INV_TX | UART.INV_RX invertirà entrambe le linee (stato di riposo al livello logico basso).

  • flow specifica quali segnali di controllo di flusso hardware usare. Il valore è una maschera di bit.

    • 0 ignorerà i segnali di controllo di flusso hardware.

    • UART.RTS abiliterà il controllo di flusso in ricezione usando il pin di output RTS per segnalare se il FIFO di ricezione ha spazio sufficiente per accettare altri dati.

    • UART.CTS abiliterà il controllo di flusso in trasmissione mettendo in pausa la trasmissione quando il pin di input CTS segnala che il ricevitore sta esaurendo lo spazio di buffer.

    • UART.RTS | UART.CTS abiliterà entrambi, per un controllo di flusso hardware completo.

Nota

È possibile chiamare init() più volte sullo stesso oggetto per riconfigurare la UART al volo. Questo consente di usare una singola periferica UART per servire dispositivi diversi collegati a pin GPIO diversi. In tal caso può essere servito un solo dispositivo alla volta. Inoltre non chiamare deinit() poiché impedirebbe di chiamare di nuovo init().

deinit() None

Disattiva il bus UART.

Nota

Non sarà possibile chiamare init() sull’oggetto dopo deinit(). In tal caso è necessario creare una nuova istanza.

any() int

Restituisce un intero che conta il numero di caratteri leggibili senza bloccarsi. Restituirà 0 se non ci sono caratteri disponibili e un numero positivo se ci sono caratteri. Il metodo può restituire 1 anche se è disponibile più di un carattere per la lettura.

Per un’interrogazione più sofisticata dei caratteri disponibili usare select.poll:

poll = select.poll()
poll.register(uart, select.POLLIN)
poll.poll(timeout)
read(nbytes: int | None = None, /) bytes | None

Legge caratteri. Se nbytes è specificato legge al massimo quel numero di byte, altrimenti legge quanti più dati possibile. Può ritornare prima se viene raggiunto un timeout. Il timeout è configurabile nel costruttore.

Valore di ritorno: un oggetto bytes contenente i byte letti. Restituisce None in caso di timeout.

readinto(buf: bytearray, nbytes: int | None = None, /) int | None

Legge byte nel buf. Se nbytes è specificato legge al massimo quel numero di byte. Altrimenti, legge al massimo len(buf) byte. Può ritornare prima se viene raggiunto un timeout. Il timeout è configurabile nel costruttore.

Valore di ritorno: numero di byte letti e memorizzati in buf oppure None in caso di timeout.

readline() bytes | None

Legge una riga, terminante con un carattere di newline. Può ritornare prima se viene raggiunto un timeout. Il timeout è configurabile nel costruttore.

Valore di ritorno: la riga letta oppure None in caso di timeout.

write(buf: bytes) int | None

Scrive il buffer di byte sul bus.

Valore di ritorno: numero di byte scritti oppure None in caso di timeout.

sendbreak() None

Invia una condizione di break sul bus – mantiene TX basso per più del tempo di un carattere. Disponibile su STM32 e mimxrt; non esposto su alif.

readchar() int

Legge un singolo carattere dalla UART e lo restituisce come intero (oppure -1 in caso di timeout). Overhead inferiore rispetto a read(1) poiché non viene allocato alcun oggetto bytes. Solo STM32.

writechar(char: int) None

Scrive il singolo carattere char (un intero nell’intervallo 0255) sulla UART. Overhead inferiore rispetto a write() per invii di un singolo byte. Solo STM32.

flush() None

Si blocca finché ogni byte attualmente presente nel buffer di trasmissione non è stato inviato su TX. Solleva OSError in caso di timeout; il timeout è derivato dalla dimensione del buffer TX e dal baudrate configurato, quindi a meno che il controllo di flusso non sia abilitato e il ricevitore non si blocchi, la chiamata ritorna ben prima del timeout.

txdone() bool

Restituisce True quando non è in corso alcuna trasmissione (il buffer TX è vuoto e il registro di shift è stato svuotato), False altrimenti. Utile come alternativa non bloccante a flush().

irq(handler: Callable[[UART], None] | None = None, trigger: int = 0, hard: bool = False) None

Installa una callback da attivare sugli eventi UART.

handler è la funzione da invocare. Riceve l’istanza UART come unico argomento. Passare None per rimuovere un handler installato in precedenza.

trigger è una maschera di bit di una o più costanti IRQ_* (vedere Costanti più sotto) che seleziona quali eventi attivano la callback.

hard=True registra un handler di interrupt hardware (latenza inferiore, ma l’handler non deve allocare). Il valore predefinito è una callback pianificata.

Restituisce un oggetto irq.

Non tutte le sorgenti IRQ sono disponibili su tutte le porte – vedere le singole costanti IRQ_* per la disponibilità per porta.

Costanti

RTS: int

Da passare a flow per abilitare il controllo di flusso hardware RTS sul lato di ricezione. Combinare con CTS tramite OR per abilitare entrambi.

CTS: int

Da passare a flow per abilitare il controllo di flusso hardware CTS sul lato di trasmissione.

IRQ_RXIDLE: int

Flag di trigger di irq(): si attiva una volta dopo che uno o più caratteri sono stati ricevuti e la linea RX passa quindi allo stato di riposo. Disponibile su tutte le porte OpenMV.

IRQ_RX: int

Flag di trigger di irq(): si attiva dopo ogni carattere ricevuto. Disponibile su STM32 e alif.

IRQ_TXIDLE: int

Flag di trigger di irq(): si attiva quando l’ultimo carattere di una trasmissione è stato inviato. Disponibile su mimxrt e alif.

IRQ_BREAK: int

Flag di trigger di irq(): si attiva quando viene rilevata una condizione di break su RX. Non disponibile su nessuna porta OpenMV.