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 vodičů: RX a TX. Jednotkou komunikace je znak (nezaměňovat se znakem řetězce), který může být 8 nebo 9 bitů široký.
Objekty UART lze vytvořit a inicializovat pomocí:
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)
Bitů může být 7, 8 nebo 9. Parita může být None, 0 (sudá) nebo 1 (lichá). Stop může být 1 nebo 2.
Poznámka: 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í 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
Jednotlivé znaky lze číst/zapisovat pomocí:
uart.readchar() # read 1 character and returns it as an integer
uart.writechar(42) # write 1 character
Pro kontrolu, zda je něco ke čtení, použijte:
uart.any() # returns the number of characters waiting
Poznámka: Funkce streamu read, write atd. jsou nové v MicroPython v1.3.4. Dřívější verze používají uart.send a uart.recv.
Konstruktory¶
- class pyb.UART(bus: int | str, *args, **kwargs)¶
Vytvoří objekt UART na zadané sběrnici
bus(celočíselný index periferie, např.3proUART3). Bez dalších parametrů je objekt vytvořen, ale neinicializován (ponechá si předchozí nastavení sběrnice, pokud existují); pokud jsou zadány další argumenty, sběrnice se inicializuje. Dostupné parametry vizinit().UART(3)je na každé STM32 OpenMV Cam připojen ke stejným pinům konektoru:Signál
Pin konektoru
TXP4RXP5Na některých deskách jsou k dispozici další sběrnice UART:
Sběrnice
Pin TX
Pin RX
Dostupné na
UART(1)P1P0OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal
UART(4)P2P3OpenMV Cam N6
UART(7)P14P13OpenMV Cam N6
Metody¶
- 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¶
Inicializuje sběrnici UART se zadanými parametry:
baudrateje hodinová frekvence.bitsje počet bitů na znak, 7, 8 nebo 9.parityje parita,None, 0 (sudá) nebo 1 (lichá).stopje počet stop bitů, 1 nebo 2.flownastavuje typ řízení toku. Může být 0,UART.RTS,UART.CTSneboUART.RTS | UART.CTS.timeoutje časový limit v milisekundách pro čekání na zápis/čtení prvního znaku.timeout_charje časový limit v milisekundách pro čekání mezi znaky během zápisu nebo čtení.read_buf_lenje délka čtecího bufferu ve znacích (0 pro vypnutí).
Tato metoda vyvolá výjimku, pokud přenosovou rychlost nelze nastavit do 5 % požadované hodnoty.
Poznámka: s parity=None jsou podporovány pouze 8 a 9 bitů. Se zapnutou paritou jsou podporovány pouze 7 a 8 bitů.
- read(nbytes: int | None = None) bytes | None¶
Čte znaky. Pokud je zadáno
nbytes, přečte nejvýše tolik bajtů. Pokud je v bufferunbytesk dispozici, vrátí se okamžitě, jinak se vrátí, jakmile dorazí dostatek znaků nebo uplyne časový limit.Pokud
nbytesnení zadáno, metoda přečte co nejvíce dat. Vrátí se po uplynutí časového limitu.Poznámka: pro 9bitové znaky zabírá každý znak dva bajty,
nbytesmusí být sudé a počet znaků jenbytes/2.Návratová hodnota: objekt bytes obsahující načtené bajty. Při vypršení časového limitu vrátí
None.
- readchar() int¶
Přijme jediný znak ze sběrnice.
Návratová hodnota: přečtený znak jako celé číslo. Při vypršení časového limitu vrátí -1.
- 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ů.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¶
Přečte řádek zakončený znakem nového řádku. Pokud takový řádek existuje, vrátí se okamžitě. Pokud uplyne časový limit, vrátí se všechna dostupná data bez ohledu na to, zda znak nového řádku existuje.
Návratová hodnota: přečtený řádek nebo
Nonepři vypršení časového limitu, pokud nejsou k dispozici žádná data.
- write(buf: bytes | bytearray | str) int | None¶
Zapíše buffer bajtů na sběrnici. Pokud jsou znaky 7 nebo 8 bitů široké, pak je každý bajt jedním znakem. Pokud jsou znaky 9 bitů široké, použijí se pro každý znak dva bajty (little endian) a
bufmusí obsahovat sudý počet bajtů.Návratová hodnota: počet zapsaných bajtů. Pokud dojde k vypršení časového limitu a žádné bajty nebyly zapsány, vrátí
None.
Konstanty¶
Řízení toku¶
UART(3) podporuje hardwarové řízení toku RTS/CTS. Na OpenMV Cam M7, H7, H7 Plus a Pure Thermal jsou piny řízení toku:
(TX, RX, nRTS, nCTS) = (P4, P5, P1, P2)
Na OpenMV Cam N6 je vyveden pouze nRTS (na pinu konektoru P7); nCTS není na I/O konektor směrován.
V následujících odstavcích výraz „cíl“ označuje zařízení připojené k UART.
Když je metoda init() UARTu volána s flow nastaveným na jednu nebo obě hodnoty UART.RTS a UART.CTS, příslušné piny řízení toku se nakonfigurují. nRTS je výstup aktivní v nízké úrovni a nCTS je vstup aktivní v nízké úrovni se zapnutým pull-up. Pro zapojení řízení toku připojte nCTS OpenMV Cam k nRTS cíle a nRTS OpenMV Cam k nCTS cíle.
CTS: cíl řídí vysílač OpenMV Cam¶
Pokud je zapnuto řízení toku CTS, chování zápisu je následující:
Pokud je volána metoda UART.write(buf) OpenMV Cam, přenos se pozastaví po dobu všech period, kdy je nCTS False. To bude mít za následek vypršení časového limitu, pokud nebyl celý buffer odeslán v rámci časového limitu. Metoda vrátí počet zapsaných bajtů, což uživateli umožní v případě potřeby zapsat zbytek dat. V případě vypršení časového limitu zůstane v UARTu znak čekající na nCTS. Počet bajtů tvořících tento znak bude zahrnut do návratové hodnoty.
Pokud je UART.writechar() voláno, když je nCTS False, metoda vyprší, pokud cíl včas neaktivuje nCTS. Pokud vyprší, bude vyvolán OSError 116. Znak bude odeslán, jakmile cíl aktivuje nCTS.
RTS: OpenMV Cam řídí vysílač cíle¶
Pokud je zapnuto řízení toku RTS, chování je následující:
Pokud se používá bufferovaný vstup (read_buf_len > 0), příchozí znaky se ukládají do bufferu. Pokud se buffer zaplní, další příchozí znak způsobí, že nRTS přejde na False: cíl by měl přestat vysílat. nRTS přejde na True, když jsou znaky čteny z bufferu.
Všimněte si, že metoda any() vrací počet bajtů v bufferu. Předpokládejme délku bufferu N bajtů. Pokud se buffer zaplní a dorazí další znak, nRTS se nastaví na False a any() vrátí počet N. Když jsou znaky čteny, další znak se umístí do bufferu a bude zahrnut do výsledku následujícího volání any().
Pokud se bufferovaný vstup nepoužívá (read_buf_len == 0), příchod znaku způsobí, že nRTS přejde na False, dokud není znak přečten.