klasa UART – dvosmjerna serijska komunikacijska sabirnica

UART implementira standardni UART/USART dvosmjerni serijski komunikacijski protokol. Na fizičkoj razini sastoji se od 2 linije: RX i TX. Jedinica komunikacije je znak (ne treba ga miješati sa znakom u nizu) koji može biti širine 8 ili 9 bitova.

UART objekti mogu se stvoriti i inicijalizirati pomoću:

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

Broj bitova može biti 7, 8 ili 9. Stop bitova može biti 1 ili 2. Uz parity=None podržano je samo 8 i 9 bitova. Kada je paritet omogućen, podržano je samo 7 i 8 bitova.

UART objekt ponaša se poput stream objekta, a čitanje i pisanje obavljaju se pomoću standardnih metoda toka:

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

Konstruktori

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)

Stvara UART objekt sa zadanim id-om.

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

Inicijalizira UART sabirnicu sa zadanim parametrima:

  • baudrate je brzina takta.

  • bits je broj bitova po znaku, 7, 8 ili 9.

  • parity je paritet, None, 0 (parni) ili 1 (neparni).

  • stop je broj stop bitova, 1 ili 2.

Dodatni parametri koji se zadaju samo kao ključne riječi i koje pojedini port može podržavati su:

  • tx određuje koji TX pin koristiti.

  • rx određuje koji RX pin koristiti.

  • rts određuje koji RTS (izlazni) pin koristiti za hardversku kontrolu toka prijema.

  • cts određuje koji CTS (ulazni) pin koristiti za hardversku kontrolu toka slanja.

  • txbuf određuje duljinu TX međuspremnika u znakovima.

  • rxbuf određuje duljinu RX međuspremnika u znakovima.

  • timeout određuje vrijeme čekanja na prvi znak (u ms).

  • timeout_char određuje vrijeme čekanja između znakova (u ms).

  • invert određuje koje linije invertirati.

    • 0 neće invertirati linije (mirno stanje obje linije je logička jedinica).

    • UART.INV_TX invertirat će TX liniju (mirno stanje TX linije sada je logička nula).

    • UART.INV_RX invertirat će RX liniju (mirno stanje RX linije sada je logička nula).

    • UART.INV_TX | UART.INV_RX invertirat će obje linije (mirno stanje na logičkoj nuli).

  • flow određuje koje signale hardverske kontrole toka koristiti. Vrijednost je bitmaska.

    • 0 će zanemariti signale hardverske kontrole toka.

    • UART.RTS omogućit će kontrolu toka prijema koristeći RTS izlazni pin za signaliziranje ima li prijemni FIFO dovoljno mjesta za prihvat dodatnih podataka.

    • UART.CTS omogućit će kontrolu toka slanja pauziranjem prijenosa kada CTS ulazni pin signalizira da prijemniku ponestaje prostora u međuspremniku.

    • UART.RTS | UART.CTS omogućit će oboje, za potpunu hardversku kontrolu toka.

Napomena

Moguće je pozvati init() više puta na istom objektu kako bi se UART rekonfigurirao u hodu. To omogućuje korištenje jedne UART periferije za posluživanje različitih uređaja spojenih na različite GPIO pinove. U tom se slučaju u jednom trenutku može posluživati samo jedan uređaj. Također nemojte pozivati deinit() jer će to spriječiti ponovni poziv init().

deinit() None

Isključuje UART sabirnicu.

Napomena

Nećete moći pozvati init() na objektu nakon deinit(). U tom slučaju treba stvoriti novu instancu.

any() int

Vraća cijeli broj koji broji koliko se znakova može pročitati bez blokiranja. Vratit će 0 ako nema dostupnih znakova, a pozitivan broj ako znakova ima. Metoda može vratiti 1 čak i ako je za čitanje dostupno više od jednog znaka.

Za sofisticiraniji upit o dostupnim znakovima koristite select.poll:

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

Čita znakove. Ako je navedeno nbytes, čita najviše toliko bajtova, inače čita što više podataka. Može se vratiti i ranije ako se dosegne istek vremena. Istek vremena podesiv je u konstruktoru.

Povratna vrijednost: bytes objekt koji sadrži pročitane bajtove. Vraća None pri isteku vremena.

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

Čita bajtove u buf. Ako je navedeno nbytes, čita najviše toliko bajtova. Inače čita najviše len(buf) bajtova. Može se vratiti i ranije ako se dosegne istek vremena. Istek vremena podesiv je u konstruktoru.

Povratna vrijednost: broj bajtova pročitanih i spremljenih u buf ili None pri isteku vremena.

readline() bytes | None

Čita liniju koja završava znakom novog reda. Može se vratiti i ranije ako se dosegne istek vremena. Istek vremena podesiv je u konstruktoru.

Povratna vrijednost: pročitana linija ili None pri isteku vremena.

write(buf: bytes) int | None

Zapisuje međuspremnik bajtova na sabirnicu.

Povratna vrijednost: broj zapisanih bajtova ili None pri isteku vremena.

sendbreak() None

Šalje break uvjet na sabirnicu – drži TX nisko dulje od trajanja jednog znaka. Dostupno na STM32 i mimxrt; nije izloženo na alif.

readchar() int

Čita jedan znak iz UART-a i vraća ga kao cijeli broj (ili -1 pri isteku vremena). Manji troškovi nego read(1) jer se ne alocira bytes objekt. Samo STM32.

writechar(char: int) None

Zapisuje jedan znak char (cijeli broj u rasponu 0255) u UART. Manji troškovi nego write() za slanje jednog bajta. Samo STM32.

flush() None

Blokira dok svaki bajt koji je trenutno u međuspremniku za slanje ne bude poslan na TX. Podiže OSError pri isteku vremena; istek vremena izveden je iz veličine TX međuspremnika i konfigurirane brzine prijenosa, pa se, osim ako je omogućena kontrola toka i prijemnik zastane, poziv vraća znatno prije isteka vremena.

txdone() bool

Vraća True kada nije u tijeku nikakav prijenos (TX međuspremnik je prazan i pomačni registar je ispražnjen), inače False. Korisno kao neblokirajuća alternativa metodi flush().

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

Instalira povratni poziv koji se aktivira pri UART događajima.

handler je funkcija koja se poziva. Prima UART instancu kao svoj jedini argument. Proslijedite None za uklanjanje prethodno instaliranog rukovatelja.

trigger je bitmaska jedne ili više IRQ_* konstanti (vidjeti Konstante u nastavku) koja odabire koji događaji aktiviraju povratni poziv.

hard=True registrira rukovatelja tvrdog prekida (manje kašnjenje, ali rukovatelj ne smije alocirati). Zadano je zakazani povratni poziv.

Vraća irq objekt.

Nije svaki izvor IRQ-a dostupan na svakom portu – vidjeti pojedine IRQ_* konstante za dostupnost po portovima.

Konstante

RTS: int

Proslijedite u flow za omogućavanje RTS hardverske kontrole toka na strani prijema. Kombinirajte s CTS putem OR-a za omogućavanje oboje.

CTS: int

Proslijedite u flow za omogućavanje CTS hardverske kontrole toka na strani slanja.

IRQ_RXIDLE: int

Zastavica okidača metode irq(): aktivira se jednom nakon što je primljen jedan ili više znakova, a RX linija zatim prijeđe u mirovanje. Dostupno na svim OpenMV portovima.

IRQ_RX: int

Zastavica okidača metode irq(): aktivira se nakon svakog primljenog znaka. Dostupno na STM32 i alif.

IRQ_TXIDLE: int

Zastavica okidača metode irq(): aktivira se kada je posljednji znak slanja poslan. Dostupno na mimxrt i alif.

IRQ_BREAK: int

Zastavica okidača metode irq(): aktivira se kada se na RX otkrije break uvjet. Nije dostupno ni na jednom OpenMV portu.