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.3pentruUART3). 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țiinit()pentru parametrii disponibili.UART(3)este conectat la aceiași pini de antet pe fiecare OpenMV Cam STM32:Semnal
Pin de antet
TXP4RXP5Magistrale UART suplimentare sunt disponibile pe unele plăci:
Magistrală
Pin TX
Pin RX
Disponibil pe
UART(1)P1P0OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal
UART(4)P2P3OpenMV Cam N6
UART(7)P14P13OpenMV 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:
baudrateeste rata de ceas.bitseste numărul de biți per caracter, 7, 8 sau 9.parityeste paritatea,None, 0 (pară) sau 1 (impară).stopeste numărul de biți de stop, 1 sau 2.flowsetează tipul de control al fluxului. Poate fi 0,UART.RTS,UART.CTSsauUART.RTS | UART.CTS.timeouteste timpul de așteptare (timeout) în milisecunde pentru scrierea/citirea primului caracter.timeout_chareste timpul de așteptare (timeout) în milisecunde între caractere în timpul scrierii sau citirii.read_buf_leneste 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.
- read(nbytes: int | None = None) bytes | None¶
Citește caractere. Dacă
nbyteseste specificat, citește cel mult atâția octeți. Dacănbytessunt disponibili în tampon (buffer), returnează imediat, altfel returnează când sosesc suficiente caractere sau când expiră timpul de așteptare.Dacă
nbytesnu 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,
nbytestrebuie să fie par, iar numărul de caractere estenbytes/2.Valoare returnată: un obiect bytes care conține octeții citiți. Returnează
Nonela 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ănbyteseste specificat, citește cel mult atâția octeți. Altfel, citește cel multlen(buf)octeți.Valoare returnată: numărul de octeți citiți și stocați în
bufsauNonela 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
Nonela 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
buftrebuie 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.
Constante¶
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.