class UART – magistrală de comunicație serială duplex

UART implementează protocolul standard de comunicație serială duplex UART/USART. La nivel fizic, acesta constă din 2 linii: RX și TX. Unitatea de comunicație este un caracter (a nu se confunda cu un caracter dintr-un șir) care poate avea o lățime de 8 sau 9 biți.

Obiectele UART pot fi create și inițializate folosind:

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)

Numărul de biți poate fi 7, 8 sau 9. Paritatea poate fi None, 0 (pară) sau 1 (impară). Bitul de stop poate fi 1 sau 2.

Notă: cu parity=None, sunt acceptați doar 8 și 9 biți. Cu paritatea activată, sunt acceptați doar 7 și 8 biți.

Un obiect UART se comportă ca un obiect stream, iar citirea și scrierea se realizează folosind metodele standard de flux:

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

Caracterele individuale pot fi citite/scrise folosind:

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

Pentru a verifica dacă există ceva de citit, folosiți:

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

Notă: funcțiile de flux read, write, etc. sunt noi în MicroPython v1.3.4. Versiunile anterioare folosesc uart.send și uart.recv.

Constructori

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

Construiește un obiect UART pe bus-ul dat (un index întreg al perifericului, de ex. 3 pentru UART3). Fără parametri suplimentari, obiectul este creat dar nu este inițializat (păstrează setările anterioare ale magistralei, dacă există); dacă se furnizează argumente suplimentare, magistrala este inițializată. Consultați init() pentru parametrii disponibili.

UART(3) este conectat la aceiași pini de antet pe fiecare OpenMV Cam STM32:

Semnal

Pin de antet

TX

P4

RX

P5

Magistrale UART suplimentare sunt disponibile pe unele plăci:

Magistrală

Pin TX

Pin RX

Disponibil pe

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

Metode

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

Inițializează magistrala UART cu parametrii dați:

  • baudrate este rata de ceas.

  • bits este numărul de biți per caracter, 7, 8 sau 9.

  • parity este paritatea, None, 0 (pară) sau 1 (impară).

  • stop este numărul de biți de stop, 1 sau 2.

  • flow setează tipul de control al fluxului. Poate fi 0, UART.RTS, UART.CTS sau UART.RTS | UART.CTS.

  • timeout este timpul de așteptare (timeout) în milisecunde pentru scrierea/citirea primului caracter.

  • timeout_char este timpul de așteptare (timeout) în milisecunde între caractere în timpul scrierii sau citirii.

  • read_buf_len este lungimea în caractere a tamponului (buffer) de citire (0 pentru a-l dezactiva).

Această metodă va genera o excepție dacă rata baud nu a putut fi setată în limita a 5% din valoarea dorită.

Notă: cu parity=None, sunt acceptați doar 8 și 9 biți. Cu paritatea activată, sunt acceptați doar 7 și 8 biți.

deinit() None

Oprește magistrala UART.

any() int

Returnează numărul de octeți în așteptare (poate fi 0).

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

Citește caractere. Dacă nbytes este specificat, citește cel mult atâția octeți. Dacă nbytes sunt disponibili în tampon (buffer), returnează imediat, altfel returnează când sosesc suficiente caractere sau când expiră timpul de așteptare.

Dacă nbytes nu este dat, metoda citește cât mai multe date posibil. Returnează după expirarea timpului de așteptare.

Notă: pentru caracterele de 9 biți, fiecare caracter ocupă doi octeți, nbytes trebuie să fie par, iar numărul de caractere este nbytes/2.

Valoare returnată: un obiect bytes care conține octeții citiți. Returnează None la expirarea timpului de așteptare.

readchar() int

Primește un singur caracter pe magistrală.

Valoare returnată: caracterul citit, sub formă de întreg. Returnează -1 la expirarea timpului de așteptare.

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

Citește octeți în buf. Dacă nbytes este specificat, citește cel mult atâția octeți. Altfel, citește cel mult len(buf) octeți.

Valoare returnată: numărul de octeți citiți și stocați în buf sau None la expirarea timpului de așteptare.

readline() bytes | None

Citește o linie, terminată cu un caracter de linie nouă. Dacă o astfel de linie există, returnarea este imediată. Dacă timpul de așteptare expiră, sunt returnate toate datele disponibile, indiferent dacă există un caracter de linie nouă.

Valoare returnată: linia citită sau None la expirarea timpului de așteptare dacă nu sunt date disponibile.

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

Scrie tamponul (buffer) de octeți pe magistrală. Dacă caracterele au o lățime de 7 sau 8 biți, atunci fiecare octet este un caracter. Dacă caracterele au o lățime de 9 biți, atunci se folosesc doi octeți pentru fiecare caracter (little endian), iar buf trebuie să conțină un număr par de octeți.

Valoare returnată: numărul de octeți scriși. Dacă survine o expirare a timpului de așteptare și nu s-a scris niciun octet, returnează None.

writechar(char: int) None

Scrie un singur caracter pe magistrală. char este un întreg care urmează să fie scris. Consultați secțiunea CTS flow control de mai jos pentru semantica de blocare atunci când controlul fluxului CTS este activat.

sendbreak() None

Trimite o condiție de break pe magistrală. Aceasta forțează magistrala la nivel scăzut pe durata a 13 biți.

Constante

RTS: int

Indicator de bit (bit flag) pentru argumentul flow al init(); activează controlul hardware al fluxului RTS (request-to-send) pe calea de recepție.

CTS: int

Indicator de bit (bit flag) pentru argumentul flow al init(); activează controlul hardware al fluxului CTS (clear-to-send) pe calea de transmisie. Poate fi combinat prin OR cu RTS pentru a activa ambele direcții.

Control al fluxului

UART(3) acceptă controlul hardware al fluxului RTS/CTS. Pe OpenMV Cam M7, H7, H7 Plus și Pure Thermal, pinii de control al fluxului sunt:

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

Pe OpenMV Cam N6 este expus doar nRTS (pe pinul de antet P7); nCTS nu este rutat la antetul de I/O.

În paragrafele următoare, termenul „țintă” se referă la dispozitivul conectat la UART.

Când metoda init() a UART-ului este apelată cu flow setat la una sau ambele dintre UART.RTS și UART.CTS, pinii de control al fluxului relevanți sunt configurați. nRTS este o ieșire activă pe nivel scăzut, iar nCTS este o intrare activă pe nivel scăzut cu pull-up activat. Pentru a conecta controlul fluxului, legați nCTS al OpenMV Cam la nRTS al țintei și nRTS al OpenMV Cam la nCTS al țintei.

CTS: ținta controlează transmițătorul OpenMV Cam

Dacă controlul fluxului CTS este activat, comportamentul la scriere este următorul:

Dacă metoda UART.write(buf) a OpenMV Cam este apelată, transmisia se va opri pe orice perioadă în care nCTS este False. Aceasta va duce la o expirare a timpului de așteptare dacă întregul tampon nu a fost transmis în perioada de timeout. Metoda returnează numărul de octeți scriși, permițând utilizatorului să scrie restul datelor dacă este necesar. În cazul unei expirări a timpului de așteptare, un caracter va rămâne în UART în așteptarea nCTS. Numărul de octeți care compun acest caracter va fi inclus în valoarea returnată.

Dacă UART.writechar() este apelată când nCTS este False, metoda va expira dacă ținta nu activează nCTS la timp. Dacă expiră, se va genera OSError 116. Caracterul va fi transmis de îndată ce ținta activează nCTS.

RTS: OpenMV Cam controlează transmițătorul țintei

Dacă controlul fluxului RTS este activat, comportamentul este următorul:

Dacă se folosește intrarea cu tampon (read_buf_len > 0), caracterele primite sunt stocate în tampon. Dacă tamponul se umple, următorul caracter care sosește va face ca nRTS să devină False: ținta ar trebui să înceteze transmisia. nRTS va deveni True când caracterele sunt citite din tampon.

Rețineți că metoda any() returnează numărul de octeți din tampon. Să presupunem o lungime a tamponului de N octeți. Dacă tamponul se umple și sosește un alt caracter, nRTS va fi setat la False, iar any() va returna valoarea N. Când caracterele sunt citite, caracterul suplimentar va fi plasat în tampon și va fi inclus în rezultatul unui apel ulterior al any().

Dacă intrarea cu tampon nu este folosită (read_buf_len == 0), sosirea unui caracter va face ca nRTS să devină False până când caracterul este citit.