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.
0neinvertuje žádné linky (klidový stav obou linek je logická jednička).UART.INV_TXinvertuje TX linku (klidový stav TX linky je nyní logická nula).UART.INV_RXinvertuje RX linku (klidový stav RX linky je nyní logická nula).UART.INV_TX | UART.INV_RXinvertuje 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.
0ignoruje signály hardwarového řízení toku.UART.RTSzapne ří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.CTSzapne ří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.CTSzapne 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é nevolejtedeinit(), 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 volatinit(). 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í
Nonepři vypršení časového limitu.
- readinto(buf: bytearray, nbytes: int | None = None, /) int | None¶
Čte bajty do
buf. Pokud je zadánonbytes, přečte nejvýše tolik bajtů. Jinak přečte nejvýšelen(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
bufneboNonepř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
Nonepř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
Nonepř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
-1při vypršení časového limitu). Nižší režie nežread(1), protože se nealokuje žádnýbytesobjekt. Pouze STM32.
- writechar(char: int) None¶
Zapíše jediný znak
char(celé číslo v rozsahu0–255) 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á
OSErrorpř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), jinakFalse. Užitečné jako neblokující alternativa kflush().
- irq(handler: Callable[[UART], None] | None = None, trigger: int = 0, hard: bool = False) None¶
Nainstaluje callback, který se spustí při událostech UART.
handlerje funkce, která se má vyvolat. Jako svůj jediný argument přijímá instanciUART. PředánímNoneodeberete dříve nainstalovaný handler.triggerje bitová maska jedné nebo více konstantIRQ_*(viz Konstanty níže), která vybírá, které události callback spustí.hard=Truezaregistruje 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
flowpro zapnutí hardwarového řízení toku RTS na přijímací straně. Zkombinujte sCTSpomocí OR pro zapnutí obojího.
- 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.