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ř. 3 pro UART3). 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 viz init().

UART(3) je na každé STM32 OpenMV Cam připojen ke stejným pinům konektoru:

Signál

Pin konektoru

TX

P4

RX

P5

Na některých deskách jsou k dispozici další sběrnice UART:

Sběrnice

Pin TX

Pin RX

Dostupné na

UART(1)

P1

P0

OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal

UART(4)

P2

P3

OpenMV Cam N6

UART(7)

P14

P13

OpenMV 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:

  • baudrate je hodinová frekvence.

  • 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.

  • flow nastavuje typ řízení toku. Může být 0, UART.RTS, UART.CTS nebo UART.RTS | UART.CTS.

  • timeout je časový limit v milisekundách pro čekání na zápis/čtení prvního znaku.

  • timeout_char je časový limit v milisekundách pro čekání mezi znaky během zápisu nebo čtení.

  • read_buf_len je 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ů.

deinit() None

Vypne sběrnici UART.

any() int

Vrátí počet bajtů čekajících ve frontě (může být 0).

read(nbytes: int | None = None) bytes | None

Čte znaky. Pokud je zadáno nbytes, přečte nejvýše tolik bajtů. Pokud je v bufferu nbytes k dispozici, vrátí se okamžitě, jinak se vrátí, jakmile dorazí dostatek znaků nebo uplyne časový limit.

Pokud nbytes není 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, nbytes musí být sudé a počet znaků je nbytes/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áno nbytes, přečte nejvýše tolik bajtů. Jinak přečte nejvýše len(buf) bajtů.

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

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 None př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 buf musí 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.

writechar(char: int) None

Zapíše jediný znak na sběrnici. char je celé číslo k zápisu. Sémantiku blokování při zapnutém řízení toku CTS viz sekce Řízení toku CTS níže.

sendbreak() None

Vyšle na sběrnici stav break. Ten drží sběrnici v nízké úrovni po dobu 13 bitů.

Konstanty

RTS: int

Bitový příznak pro argument flow metody init(); zapíná hardwarové řízení toku RTS (request-to-send) na přijímací cestě.

CTS: int

Bitový příznak pro argument flow metody init(); zapíná hardwarové řízení toku CTS (clear-to-send) na vysílací cestě. Lze ho zkombinovat operací OR s RTS pro zapnutí obou směrů.

Ří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.