UART osztály – 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ő a sztring karakterrel), amely 8 vagy 9 bit széles lehet.

UART objektumok az alábbi módon hozhatók létre és inicializálhatók:

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)

A bitek száma 7, 8 vagy 9 lehet. A paritás None, 0 (páros) vagy 1 (páratlan) lehet. A stop bitek száma 1 vagy 2 lehet.

Megjegyzés: parity=None esetén csak 8 és 9 bit támogatott. Engedélyezett paritás mellett csak 7 és 8 bit támogatott.

A UART objektum úgy viselkedik, mint egy stream objektum, és az olvasás és í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

Az egyes karakterek az alábbi módon olvashatók/írhatók:

uart.readchar()     # read 1 character and returns it as an integer
uart.writechar(42)  # write 1 character

Annak ellenőrzéséhez, hogy van-e bármi olvasnivaló, használja:

uart.any()          # returns the number of characters waiting

Megjegyzés: A read, write stb. stream függvények a MicroPython v1.3.4 verzióban újdonságok. A korábbi verziók a uart.send és uart.recv függvényeket használják.

Konstruktorok

class pyb.UART(bus: int | str, *args, **kwargs)

Létrehoz egy UART objektumot a megadott bus buszon (egész szám periféria-index, pl. 3 a UART3 esetén). További paraméterek nélkül az objektum létrejön, de nem inicializálódik (megőrzi a busz korábbi beállításait, ha vannak); ha további argumentumokat ad meg, a busz inicializálódik. Az elérhető paraméterekért lásd: init().

A UART(3) minden STM32 alapú OpenMV Cam esetében ugyanazokra a fejléc-lábakra van bekötve:

Jel

Fejléc-láb

TX

P4

RX

P5

Egyes lapokon további UART buszok is elérhetők:

Busz

TX láb

RX láb

Elérhető a következőkön

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

Metódusok

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

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 stop bitek száma: 1 vagy 2.

  • A flow az áramlásvezérlés típusát állítja be. Lehet 0, UART.RTS, UART.CTS vagy UART.RTS | UART.CTS.

  • A timeout az első karakter írására/olvasására való várakozás időkorlátja milliszekundumban.

  • A timeout_char az írás vagy olvasás közben a karakterek közötti várakozás időkorlátja milliszekundumban.

  • A read_buf_len az olvasási puffer karakterhossza (0 a letiltáshoz).

Ez a metódus kivételt vált ki, ha a baud sebességet nem sikerült a kívánt érték 5%-án belül beállítani.

Megjegyzés: parity=None esetén csak 8 és 9 bit támogatott. Engedélyezett paritás mellett csak 7 és 8 bit támogatott.

deinit() None

Kikapcsolja a UART buszt.

any() int

Visszaadja a várakozó bájtok számát (lehet 0 is).

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

Karaktereket olvas be. Ha a nbytes meg van adva, akkor legfeljebb annyi bájtot olvas be. Ha nbytes rendelkezésre áll a pufferben, azonnal visszatér, ellenkező esetben akkor tér vissza, amikor elegendő karakter érkezik, vagy lejár az időkorlát.

Ha a nbytes nincs megadva, akkor a metódus a lehető legtöbb adatot olvassa be. Az időkorlát lejárta után tér vissza.

Megjegyzés: 9 bites karakterek esetén minden karakter két bájtot foglal el, a nbytes értékének párosnak kell lennie, a karakterek száma pedig nbytes/2.

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

readchar() int

Egyetlen karaktert fogad a buszon.

Visszatérési érték: a beolvasott karakter egész számként. Időtúllépés esetén -1 értéket ad vissza.

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

Bájtokat olvas be a buf pufferbe. Ha a nbytes meg van adva, akkor legfeljebb annyi bájtot olvas be. Ellenkező esetben legfeljebb len(buf) bájtot olvas be.

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

readline() bytes | None

Beolvas egy sort, amely újsor karakterrel végződik. Ha ilyen sor létezik, a visszatérés azonnali. Ha lejár az időkorlát, az összes rendelkezésre álló adat visszaadásra kerül, függetlenül attól, hogy van-e benne újsor karakter.

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

write(buf: bytes | bytearray | str) int | None

A bájtokból álló puffert a buszra írja. Ha a karakterek 7 vagy 8 bit szélesek, akkor minden bájt egy karakter. Ha a karakterek 9 bit szélesek, akkor minden karakterhez két bájt használatos (little endian), és a buf puffernek páros számú bájtot kell tartalmaznia.

Visszatérési érték: a kiírt bájtok száma. Ha időtúllépés következik be, és egyetlen bájt sem került kiírásra, None értéket ad vissza.

writechar(char: int) None

Egyetlen karaktert ír a buszra. A char egy egész szám, amelyet ki kell írni. A blokkolási szemantikáért, amikor a CTS áramlásvezérlés engedélyezve van, lásd a CTS áramlásvezérlés szakaszt alább.

sendbreak() None

Break feltételt küld a buszon. Ez a buszt 13 bit időtartamára alacsony szintre húzza.

Konstansok

RTS: int

Bit jelző az init() flow argumentumához; engedélyezi az RTS (request-to-send) hardveres áramlásvezérlést a fogadási útvonalon.

CTS: int

Bit jelző az init() flow argumentumához; engedélyezi a CTS (clear-to-send) hardveres áramlásvezérlést az adási útvonalon. OR-olható a RTS jelzővel mindkét irány engedélyezéséhez.

Áramlásvezérlés

A UART(3) támogatja az RTS/CTS hardveres áramlásvezérlést. Az OpenMV Cam M7, H7, H7 Plus és Pure Thermal modelleken az áramlásvezérlési lábak a következők:

(TX, RX, nRTS, nCTS) = (P4, P5, P1, P2)

Az OpenMV Cam N6-on csak a nRTS érhető el (a P7 fejléc-lábon); a nCTS nincs az I/O fejlécre kivezetve.

A következő bekezdésekben a „cél” kifejezés a UART-hoz csatlakoztatott eszközre utal.

Amikor a UART init() metódusát úgy hívják meg, hogy a flow a UART.RTS és UART.CTS egyikére vagy mindkettőre van állítva, a megfelelő áramlásvezérlési lábak konfigurálódnak. A nRTS egy aktív-alacsony kimenet, a nCTS pedig egy aktív-alacsony bemenet engedélyezett felhúzással. Az áramlásvezérlés bekötéséhez csatlakoztassa az OpenMV Cam nCTS lábát a cél nRTS lábához, az OpenMV Cam nRTS lábát pedig a cél nCTS lábához.

CTS: a cél vezérli az OpenMV Cam adóját

Ha a CTS áramlásvezérlés engedélyezve van, az írási viselkedés a következő:

Ha az OpenMV Cam UART.write(buf) metódusát meghívják, az adás minden olyan időszakra leáll, amikor a nCTS értéke False. Ez időtúllépést eredményez, ha a teljes puffer nem került átvitelre az időkorláton belül. A metódus visszaadja a kiírt bájtok számát, lehetővé téve, hogy a felhasználó szükség esetén kiírja az adatok hátralévő részét. Időtúllépés esetén egy karakter a UART-ban marad, a nCTS jelre várva. Az ezt a karaktert alkotó bájtok száma is szerepel a visszatérési értékben.

Ha a UART.writechar() metódust akkor hívják meg, amikor a nCTS értéke False, a metódus időtúllépésig vár, hacsak a cél nem érvényesíti időben a nCTS jelet. Ha időtúllépés következik be, OSError 116 kivétel keletkezik. A karakter azonnal átvitelre kerül, amint a cél érvényesíti a nCTS jelet.

RTS: az OpenMV Cam vezérli a cél adóját

Ha az RTS áramlásvezérlés engedélyezve van, a viselkedés a következő:

Ha pufferelt bemenetet használnak (read_buf_len > 0), a bejövő karakterek pufferelődnek. Ha a puffer megtelik, a következő beérkező karakter hatására a nRTS False állapotba kerül: a célnak abba kell hagynia az adást. A nRTS True állapotba kerül, amikor karaktereket olvasnak ki a pufferből.

Vegye figyelembe, hogy az any() metódus a pufferben lévő bájtok számát adja vissza. Tegyük fel, hogy a puffer hossza N bájt. Ha a puffer megtelik, és újabb karakter érkezik, a nRTS False állapotba kerül, és az any() az N értéket adja vissza. Amikor karaktereket olvasnak ki, a további karakter a pufferbe kerül, és egy későbbi any() hívás eredményében szerepelni fog.

Ha nem használnak pufferelt bemenetet (read_buf_len == 0), egy karakter beérkezése a nRTS False állapotba kerülését okozza, amíg a karaktert ki nem olvassák.