class UART – duplex soros kommunikációs busz

A UART a szabványos UART/USART duplex soros kommunikációs protokollt valósítja meg. Fizikai szinten 2 vonalból áll: RX és TX. A kommunikáció egysége egy karakter (nem összetévesztendő egy karakterlánc karakterével), amely 8 vagy 9 bit széles lehet.

A UART objektumokat a következőképpen lehet létrehozni és inicializálni:

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

A bitek száma 7, 8 vagy 9 lehet. A stopbit 1 vagy 2 lehet. A parity=None esetén csak a 8 és 9 bit támogatott. Engedélyezett paritás esetén csak a 7 és 8 bit támogatott.

A UART objektum úgy viselkedik, mint egy stream objektum, és az olvasás, valamint az írás a szabványos stream metódusokkal történik:

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

Konstruktorok

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)

Létrehoz egy UART objektumot az adott id alapján.

Metódusok

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

Inicializálja a UART buszt a megadott paraméterekkel:

  • A baudrate az órajel sebessége.

  • A bits a karakterenkénti bitek száma, 7, 8 vagy 9.

  • A parity a paritás, None, 0 (páros) vagy 1 (páratlan).

  • A stop a stopbitek száma, 1 vagy 2.

További, csak kulcsszóként megadható paraméterek, amelyeket egy port támogathat:

  • A tx megadja a használandó TX lábat.

  • Az rx megadja a használandó RX lábat.

  • Az rts megadja a hardveres fogadási folyamatvezérléshez használandó RTS (kimeneti) lábat.

  • A cts megadja a hardveres adási folyamatvezérléshez használandó CTS (bemeneti) lábat.

  • A txbuf megadja a TX puffer hosszát karakterekben.

  • Az rxbuf megadja az RX puffer hosszát karakterekben.

  • A timeout megadja az első karakterre való várakozás idejét (ms-ban).

  • A timeout_char megadja a karakterek közötti várakozás idejét (ms-ban).

  • Az invert megadja, mely vonalakat kell invertálni.

    • A 0 nem invertálja a vonalakat (mindkét vonal nyugalmi állapota logikai magas).

    • A UART.INV_TX invertálja a TX vonalat (a TX vonal nyugalmi állapota innentől logikai alacsony).

    • A UART.INV_RX invertálja az RX vonalat (az RX vonal nyugalmi állapota innentől logikai alacsony).

    • A UART.INV_TX | UART.INV_RX mindkét vonalat invertálja (nyugalmi állapot logikai alacsonyon).

  • A flow megadja, mely hardveres folyamatvezérlő jeleket kell használni. Az érték egy bitmaszk.

    • A 0 figyelmen kívül hagyja a hardveres folyamatvezérlő jeleket.

    • A UART.RTS engedélyezi a fogadási folyamatvezérlést az RTS kimeneti láb használatával, amely jelzi, hogy a fogadási FIFO-ban van-e elegendő hely további adatok fogadásához.

    • A UART.CTS engedélyezi az adási folyamatvezérlést azáltal, hogy szünetelteti az adást, amikor a CTS bemeneti láb jelzi, hogy a vevő puffertere kezd kifogyni.

    • A UART.RTS | UART.CTS mindkettőt engedélyezi a teljes hardveres folyamatvezérléshez.

Megjegyzés

Lehetséges az init() többszöri meghívása ugyanazon az objektumon, hogy a UART menet közben újrakonfigurálható legyen. Ez lehetővé teszi egyetlen UART periféria használatát különböző GPIO lábakhoz csatlakoztatott különböző eszközök kiszolgálására. Ebben az esetben egyszerre csak egy eszköz szolgálható ki. Továbbá ne hívd meg a deinit()-et, mivel az megakadályozza az init() újbóli meghívását.

deinit() None

Kikapcsolja a UART buszt.

Megjegyzés

A deinit() után nem tudod meghívni az init()-et az objektumon. Ebben az esetben új példányt kell létrehozni.

any() int

Egy egész számot ad vissza, amely megszámolja a blokkolás nélkül beolvasható karakterek számát. 0-t ad vissza, ha nincs elérhető karakter, és pozitív számot, ha vannak karakterek. A metódus akkor is visszaadhat 1-et, ha egynél több karakter is elérhető olvasásra.

Az elérhető karakterek kifinomultabb lekérdezéséhez használd a select.poll-t:

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

Karaktereket olvas be. Ha a nbytes meg van adva, akkor legfeljebb annyi bájtot olvas be, egyébként a lehető legtöbb adatot olvassa be. Hamarabb is visszatérhet, ha eléri az időtúllépést. Az időtúllépés a konstruktorban állítható be.

Visszatérési érték: egy bytes objektum, amely a beolvasott bájtokat tartalmazza. Időtúllépés esetén None-t ad vissza.

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

Bájtokat olvas be a buf-ba. Ha a nbytes meg van adva, akkor legfeljebb annyi bájtot olvas be. Egyébként legfeljebb len(buf) bájtot olvas be. Hamarabb is visszatérhet, ha eléri az időtúllépést. Az időtúllépés a konstruktorban állítható be.

Visszatérési érték: a buf-ba beolvasott és eltárolt bájtok száma, vagy None időtúllépés esetén.

readline() bytes | None

Beolvas egy sort, amely sortörés karakterrel végződik. Hamarabb is visszatérhet, ha eléri az időtúllépést. Az időtúllépés a konstruktorban állítható be.

Visszatérési érték: a beolvasott sor, vagy None időtúllépés esetén.

write(buf: bytes) int | None

Kiírja a bájtpuffert a buszra.

Visszatérési érték: a kiírt bájtok száma, vagy None időtúllépés esetén.

sendbreak() None

Break feltételt küld a buszra – a TX-et egy karakteridőnél hosszabb ideig alacsonyan tartja. Elérhető STM32-n és mimxrt-n; alif-on nincs kitéve.

readchar() int

Egyetlen karaktert olvas be a UART-ból, és egész számként adja vissza (vagy -1-et időtúllépés esetén). Kisebb többletterheléssel jár, mint a read(1), mivel nem allokál bytes objektumot. Csak STM32.

writechar(char: int) None

Kiírja az egyetlen char karaktert (egy egész szám a 0255 tartományban) a UART-ra. Kisebb többletterheléssel jár, mint a write() egyetlen bájt küldéséhez. Csak STM32.

flush() None

Blokkol, amíg az adópufferben jelenleg lévő összes bájt ki nem lett léptetve a TX-en. Időtúllépés esetén OSError kivételt vált ki; az időtúllépés a TX puffer méretéből és a beállított átviteli sebességből (baud) származik, így hacsak a folyamatvezérlés nincs engedélyezve és a vevő nem akad el, a hívás jóval az időtúllépés előtt visszatér.

txdone() bool

True-t ad vissza, amikor nincs folyamatban adás (a TX puffer üres és a léptetőregiszter kiürült), egyébként False-t. Hasznos a flush() nem blokkoló alternatívájaként.

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

Telepít egy visszahívást, amely UART eseményekre fut le.

A handler a meghívandó függvény. Egyetlen argumentumként a UART példányt kapja. Adj át None-t egy korábban telepített kezelő eltávolításához.

A trigger egy bitmaszk egy vagy több IRQ_* konstansból (lásd alább a Konstansokat), amely kiválasztja, mely események váltsák ki a visszahívást.

A hard=True egy kemény megszakítás-kezelőt regisztrál (alacsonyabb késleltetés, de a kezelő nem allokálhat). Az alapértelmezett egy ütemezett visszahívás.

Egy irq objektumot ad vissza.

Nem minden IRQ forrás érhető el minden porton – a portonkénti elérhetőségről lásd az egyes IRQ_* konstansokat.

Konstansok

RTS: int

Add át a flow-nak az RTS hardveres folyamatvezérlés engedélyezéséhez a fogadási oldalon. Kombináld a CTS-szel OR művelettel mindkettő engedélyezéséhez.

CTS: int

Add át a flow-nak a CTS hardveres folyamatvezérlés engedélyezéséhez az adási oldalon.

IRQ_RXIDLE: int

Az irq() kioldó jelzője: egyszer lép működésbe, miután egy vagy több karakter beérkezett, és az RX vonal ezután nyugalmi állapotba kerül. Minden OpenMV porton elérhető.

IRQ_RX: int

Az irq() kioldó jelzője: minden beérkezett karakter után működésbe lép. Elérhető STM32-n és alif-on.

IRQ_TXIDLE: int

Az irq() kioldó jelzője: akkor lép működésbe, amikor egy adás utolsó karaktere ki lett léptetve. Elérhető mimxrt-n és alif-on.

IRQ_BREAK: int

Az irq() kioldó jelzője: akkor lép működésbe, amikor break feltétel észlelhető az RX-en. Egyetlen OpenMV porton sem érhető el.