třída UART – duplexní sériová komunikační sběrnice

UART implementuje standardní duplexní sériový komunikační protokol UART/USART. Na fyzické úrovni se skládá ze 2 linek: RX a TX. Jednotkou komunikace je znak (nezaměňovat se znakem řetězce), který může být široký 8 nebo 9 bitů.

Objekty UART lze vytvořit a inicializovat pomocí:

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

Bity mohou být 7, 8 nebo 9. Stop bity mohou být 1 nebo 2. S parity=None jsou podporovány pouze 8 a 9 bitů. Se zapnutou paritou jsou podporovány pouze 7 a 8 bitů.

Objekt UART se chová jako objekt stream a čtení a zápis se provádějí pomocí standardních metod streamu:

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

Konstruktory

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)

Vytvoří objekt UART s daným id.

Metody

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

Inicializuje sběrnici UART s danými parametry:

  • baudrate je rychlost hodin.

  • bits je počet bitů na znak, 7, 8 nebo 9.

  • parity je parita, None, 0 (sudá) nebo 1 (lichá).

  • stop je počet stop bitů, 1 nebo 2.

Další pojmenované parametry, které mohou být portem podporovány, jsou:

  • tx určuje, který TX pin se má použít.

  • rx určuje, který RX pin se má použít.

  • rts určuje RTS (výstupní) pin, který se má použít pro hardwarové řízení toku příjmu.

  • cts určuje CTS (vstupní) pin, který se má použít pro hardwarové řízení toku vysílání.

  • txbuf určuje délku TX bufferu ve znacích.

  • rxbuf určuje délku RX bufferu ve znacích.

  • timeout určuje dobu čekání na první znak (v ms).

  • timeout_char určuje dobu čekání mezi znaky (v ms).

  • invert určuje, které linky se mají invertovat.

    • 0 neinvertuje žádné linky (klidový stav obou linek je logická jednička).

    • UART.INV_TX invertuje TX linku (klidový stav TX linky je nyní logická nula).

    • UART.INV_RX invertuje RX linku (klidový stav RX linky je nyní logická nula).

    • UART.INV_TX | UART.INV_RX invertuje obě linky (klidový stav na logické nule).

  • flow určuje, které signály hardwarového řízení toku se mají použít. Hodnota je bitová maska.

    • 0 ignoruje signály hardwarového řízení toku.

    • UART.RTS zapne řízení toku příjmu pomocí výstupního pinu RTS, který signalizuje, zda má přijímací FIFO dostatek místa pro přijetí dalších dat.

    • UART.CTS zapne řízení toku vysílání pozastavením vysílání, když vstupní pin CTS signalizuje, že přijímači dochází místo v bufferu.

    • UART.RTS | UART.CTS zapne obojí, pro plné hardwarové řízení toku.

Poznámka

Na stejném objektu je možné volat init() vícekrát za účelem překonfigurování UART za běhu. To umožňuje použít jednu UART periferii k obsluze různých zařízení připojených k různým GPIO pinům. V takovém případě lze obsluhovat pouze jedno zařízení najednou. Také nevolejte deinit(), protože by to zabránilo opětovnému volání init().

deinit() None

Vypne sběrnici UART.

Poznámka

Po deinit() nebudete moci na objektu volat init(). V takovém případě je třeba vytvořit novou instanci.

any() int

Vrací celé číslo udávající počet znaků, které lze přečíst bez blokování. Vrátí 0, pokud nejsou k dispozici žádné znaky, a kladné číslo, pokud nějaké znaky jsou. Metoda může vrátit 1, i když je ke čtení k dispozici více než jeden znak.

Pro sofistikovanější dotazování na dostupné znaky použijte select.poll:

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

Čte znaky. Pokud je zadáno nbytes, přečte nejvýše tolik bajtů, jinak přečte co nejvíce dat. Může vrátit dříve, pokud je dosaženo časového limitu. Časový limit je konfigurovatelný v konstruktoru.

Návratová hodnota: objekt bytes obsahující přečtené bajty. Vrací None při vypršení časového limitu.

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

Čte bajty do buf. Pokud je zadáno nbytes, přečte nejvýše tolik bajtů. Jinak přečte nejvýše len(buf) bajtů. Může vrátit dříve, pokud je dosaženo časového limitu. Časový limit je konfigurovatelný v konstruktoru.

Návratová hodnota: počet bajtů přečtených a uložených do buf nebo None při vypršení časového limitu.

readline() bytes | None

Čte řádek zakončený znakem nového řádku. Může vrátit dříve, pokud je dosaženo časového limitu. Časový limit je konfigurovatelný v konstruktoru.

Návratová hodnota: přečtený řádek nebo None při vypršení časového limitu.

write(buf: bytes) int | None

Zapíše buffer bajtů na sběrnici.

Návratová hodnota: počet zapsaných bajtů nebo None při vypršení časového limitu.

sendbreak() None

Vyšle na sběrnici break podmínku – stáhne TX na nízkou úroveň po dobu delší než jeden znakový čas. Dostupné na STM32 a mimxrt; není zpřístupněno na alif.

readchar() int

Přečte jediný znak z UART a vrátí jej jako celé číslo (nebo -1 při vypršení časového limitu). Nižší režie než read(1), protože se nealokuje žádný bytes objekt. Pouze STM32.

writechar(char: int) None

Zapíše jediný znak char (celé číslo v rozsahu 0255) do UART. Nižší režie než write() pro odeslání jednoho bajtu. Pouze STM32.

flush() None

Blokuje, dokud nebude každý bajt aktuálně ve vysílacím bufferu vyslán na TX. Vyvolá OSError při vypršení časového limitu; časový limit je odvozen od velikosti TX bufferu a nastavené přenosové rychlosti, takže pokud není zapnuto řízení toku a přijímač neuvázne, volání se vrátí výrazně před vypršením časového limitu.

txdone() bool

Vrací True, když neprobíhá žádné vysílání (TX buffer je prázdný a posuvný registr je vyprázdněn), jinak False. Užitečné jako neblokující alternativa k flush().

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

Nainstaluje callback, který se spustí při událostech UART.

handler je funkce, která se má vyvolat. Jako svůj jediný argument přijímá instanci UART. Předáním None odeberete dříve nainstalovaný handler.

trigger je bitová maska jedné nebo více konstant IRQ_* (viz Konstanty níže), která vybírá, které události callback spustí.

hard=True zaregistruje handler tvrdého přerušení (nižší latence, ale handler nesmí alokovat). Výchozí je naplánovaný callback.

Vrací objekt irq.

Ne každý zdroj IRQ je dostupný na každém portu – viz jednotlivé konstanty IRQ_* ohledně dostupnosti pro daný port.

Konstanty

RTS: int

Předejte do flow pro zapnutí hardwarového řízení toku RTS na přijímací straně. Zkombinujte s CTS pomocí OR pro zapnutí obojího.

CTS: int

Předejte do flow pro zapnutí hardwarového řízení toku CTS na vysílací straně.

IRQ_RXIDLE: int

Příznak spouštěče irq(): spustí se jednou poté, co byl přijat jeden nebo více znaků a RX linka se poté přepne do klidového stavu. Dostupné na všech OpenMV portech.

IRQ_RX: int

Příznak spouštěče irq(): spustí se po každém přijatém znaku. Dostupné na STM32 a alif.

IRQ_TXIDLE: int

Příznak spouštěče irq(): spustí se, když byl vyslán poslední znak vysílání. Dostupné na mimxrt a alif.

IRQ_BREAK: int

Příznak spouštěče irq(): spustí se, když je na RX detekována break podmínka. Není dostupné na žádném OpenMV portu.