clasa UART – magistrală de comunicație serială duplex¶
UART implementează protocolul standard de comunicație serială duplex UART/USART. La nivel fizic 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 machine import UART
uart = UART(3, 9600) # init with given baudrate
uart.init(9600, bits=8, parity=None, stop=1) # init with given parameters
Numărul de biți poate fi 7, 8 sau 9. Stop poate fi 1 sau 2. Cu parity=None, sunt acceptate doar 8 și 9 biți. Cu paritatea activată, sunt acceptate doar 7 și 8 biți.
Un obiect UART se comportă ca un obiect stream, iar citirea și scrierea se realizează folosind metodele standard pentru fluxuri:
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
Constructori¶
- 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)¶
Construiește un obiect UART cu id-ul dat.
Metode¶
- 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¶
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.
Parametri suplimentari, doar de tip cuvânt-cheie, care pot fi acceptați de un port sunt:
tx specifică pinul TX care urmează să fie folosit.
rx specifică pinul RX care urmează să fie folosit.
rts specifică pinul RTS (ieșire) care urmează să fie folosit pentru controlul hardware al fluxului la recepție.
cts specifică pinul CTS (intrare) care urmează să fie folosit pentru controlul hardware al fluxului la transmisie.
txbuf specifică lungimea, în caractere, a tamponului (buffer) TX.
rxbuf specifică lungimea, în caractere, a tamponului (buffer) RX.
timeout specifică timpul de așteptare pentru primul caracter (în ms).
timeout_char specifică timpul de așteptare între caractere (în ms).
invert specifică ce linii să fie inversate.
0nu va inversa liniile (starea de repaus a ambelor linii este nivelul logic ridicat).UART.INV_TXva inversa linia TX (starea de repaus a liniei TX devine acum nivelul logic coborât).UART.INV_RXva inversa linia RX (starea de repaus a liniei RX devine acum nivelul logic coborât).UART.INV_TX | UART.INV_RXva inversa ambele linii (starea de repaus la nivelul logic coborât).
flow specifică ce semnale de control hardware al fluxului să fie folosite. Valoarea este o mască de biți.
0va ignora semnalele de control hardware al fluxului.UART.RTSva activa controlul fluxului la recepție folosind pinul de ieșire RTS pentru a semnaliza dacă FIFO-ul de recepție are spațiu suficient pentru a accepta mai multe date.UART.CTSva activa controlul fluxului la transmisie prin întreruperea transmisiei atunci când pinul de intrare CTS semnalizează că receptorul rămâne fără spațiu de tampon (buffer).UART.RTS | UART.CTSle va activa pe ambele, pentru control hardware complet al fluxului.
Notă
Este posibil să apelați
init()de mai multe ori pe același obiect pentru a reconfigura UART din mers. Acest lucru permite folosirea unui singur periferic UART pentru a deservi diferite dispozitive conectate la diferiți pini GPIO. În acest caz, poate fi deservit un singur dispozitiv la un moment dat. De asemenea, nu apelațideinit(), deoarece acest lucru va împiedica apelarea din nou ainit().
- deinit() None¶
Oprește magistrala UART.
Notă
Nu veți putea apela
init()pe obiect dupădeinit(). În acest caz, trebuie creată o nouă instanță.
- any() int¶
Returnează un întreg ce numără caracterele care pot fi citite fără blocare. Va returna 0 dacă nu sunt caractere disponibile și un număr pozitiv dacă există caractere. Metoda poate returna 1 chiar dacă există mai mult de un caracter disponibil pentru citire.
Pentru o interogare mai sofisticată a caracterelor disponibile, folosiți select.poll:
poll = select.poll() poll.register(uart, select.POLLIN) poll.poll(timeout)
- read(nbytes: int | None = None, /) bytes | None¶
Citește caractere. Dacă
nbyteseste specificat, citește cel mult atâția octeți, altfel citește cât de multe date posibil. Poate returna mai devreme dacă se atinge un timeout. Timeout-ul este configurabil în constructor.Valoare returnată: un obiect bytes ce conține octeții citiți. Returnează
Nonela timeout.
- 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. Poate returna mai devreme dacă se atinge un timeout. Timeout-ul este configurabil în constructor.Valoare returnată: numărul de octeți citiți și stocați în
bufsauNonela timeout.
- readline() bytes | None¶
Citește o linie, care se termină cu un caracter de linie nouă. Poate returna mai devreme dacă se atinge un timeout. Timeout-ul este configurabil în constructor.
Valoare returnată: linia citită sau
Nonela timeout.
- write(buf: bytes) int | None¶
Scrie tamponul (buffer) de octeți pe magistrală.
Valoare returnată: numărul de octeți scriși sau
Nonela timeout.
- sendbreak() None¶
Trimite o condiție de break pe magistrală – menține TX la nivel coborât pentru o durată mai lungă decât timpul unui caracter. Disponibilă pe STM32 și mimxrt; nu este expusă pe alif.
- readchar() int¶
Citește un singur caracter din UART și îl returnează ca întreg (sau
-1la timeout). Are o suprasarcină mai mică decâtread(1), deoarece nu se alocă niciun obiectbytes. Doar STM32.
- writechar(char: int) None¶
Scrie un singur caracter
char(un întreg în intervalul0–255) în UART. Are o suprasarcină mai mică decâtwrite()pentru trimiteri de un singur octet. Doar STM32.
- flush() None¶
Blochează execuția până când fiecare octet aflat în prezent în tamponul de transmisie a fost transmis pe TX. Generează
OSErrorla timeout; timeout-ul este derivat din dimensiunea tamponului TX și rata baud configurată, astfel încât, dacă nu este activat controlul fluxului și receptorul nu se blochează, apelul revine cu mult înainte de timeout.
- txdone() bool¶
Returnează
Trueatunci când nu este nicio transmisie în curs (tamponul TX este gol și registrul de deplasare s-a golit),Falseîn caz contrar. Util ca alternativă neblocantă laflush().
- irq(handler: Callable[[UART], None] | None = None, trigger: int = 0, hard: bool = False) None¶
Instalează o funcție de retroapelare (callback) care să se declanșeze la evenimente UART.
handlereste funcția care urmează să fie apelată. Primește instanțaUARTca unic argument. TransmitețiNonepentru a elimina un handler instalat anterior.triggereste o mască de biți cu una sau mai multe constanteIRQ_*(vezi Constante mai jos) care selectează ce evenimente declanșează funcția de retroapelare (callback).hard=Trueînregistrează un handler de întrerupere hard (latență mai mică, dar handler-ul nu trebuie să aloce memorie). Implicit se folosește o funcție de retroapelare (callback) programată.Returnează un obiect irq.
Nu fiecare sursă IRQ este disponibilă pe fiecare port – vezi constantele individuale
IRQ_*pentru disponibilitatea pe fiecare port.
Constante¶
- RTS: int¶
Transmiteți către
flowpentru a activa controlul hardware al fluxului RTS pe partea de recepție. Combinați cuCTSprin OR pentru a le activa pe ambele.
- CTS: int¶
Transmiteți către
flowpentru a activa controlul hardware al fluxului CTS pe partea de transmisie.
- IRQ_RXIDLE: int¶
Indicator de declanșare
irq(): se declanșează o dată după ce unul sau mai multe caractere au fost recepționate, iar linia RX trece apoi în repaus. Disponibil pe toate porturile OpenMV.
- IRQ_RX: int¶
Indicator de declanșare
irq(): se declanșează după fiecare caracter recepționat. Disponibil pe STM32 și alif.