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 brkati sa znakom niza) koji može biti širok 8 ili 9 bitova.

UART objekti mogu se stvoriti i inicijalizirati pomoću:

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)

Bits može biti 7, 8 ili 9. Parity može biti None, 0 (parno) ili 1 (neparno). Stop može biti 1 ili 2.

Napomena: uz parity=None, podržani su samo 8 i 9 bitova. Kada je parnost omogućena, podržani su 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

Pojedinačni znakovi mogu se čitati/pisati pomoću:

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

Da biste provjerili ima li čega za čitanje, koristite:

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

Napomena: Funkcije toka read, write itd. nove su u MicroPython v1.3.4. Ranije verzije koriste uart.send i uart.recv.

Konstruktori

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

Konstruira UART objekt na zadanoj sabirnici bus (cjelobrojni indeks periferije, npr. 3 za UART3). Bez dodatnih parametara objekt se stvara, ali ne inicijalizira (zadržava prethodne postavke sabirnice, ako postoje); ako se navedu dodatni argumenti, sabirnica se inicijalizira. Pogledajte init() za dostupne parametre.

UART(3) je ožičen na iste pinove zaglavlja na svakoj STM32 OpenMV Cam:

Signal

Pin zaglavlja

TX

P4

RX

P5

Dodatne UART sabirnice dostupne su na nekim pločama:

Sabirnica

TX pin

RX pin

Dostupno na

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

Inicijalizira UART sabirnicu sa zadanim parametrima:

  • baudrate je brzina takta.

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

  • parity je parnost, None, 0 (parno) ili 1 (neparno).

  • stop je broj stop bitova, 1 ili 2.

  • flow postavlja vrstu kontrole protoka. Može biti 0, UART.RTS, UART.CTS ili UART.RTS | UART.CTS.

  • timeout je istek vremena u milisekundama za čekanje na pisanje/čitanje prvog znaka.

  • timeout_char je istek vremena u milisekundama za čekanje između znakova tijekom pisanja ili čitanja.

  • read_buf_len je duljina međuspremnika za čitanje u znakovima (0 za onemogućavanje).

Ova metoda će izazvati iznimku ako brzina prijenosa (baud) nije mogla biti postavljena unutar 5% željene vrijednosti.

Napomena: uz parity=None, podržani su samo 8 i 9 bitova. Kada je parnost omogućena, podržani su samo 7 i 8 bitova.

deinit() None

Isključuje UART sabirnicu.

any() int

Vraća broj bajtova koji čekaju (može biti 0).

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

Čita znakove. Ako je naveden nbytes, čita najviše toliko bajtova. Ako je nbytes dostupno u međuspremniku, vraća se odmah, inače se vraća kada pristigne dovoljno znakova ili istekne vrijeme.

Ako nbytes nije naveden, metoda čita što je više moguće podataka. Vraća se nakon isteka vremena.

Napomena: za 9-bitne znakove svaki znak zauzima dva bajta, nbytes mora biti paran, a broj znakova je nbytes/2.

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

readchar() int

Prima jedan znak na sabirnici.

Povratna vrijednost: pročitani znak, kao cijeli broj. Vraća -1 pri isteku vremena.

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

Čita bajtove u buf. Ako je naveden nbytes, čita najviše toliko bajtova. Inače čita najviše len(buf) bajtova.

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

readline() bytes | None

Čita redak koji završava znakom novog retka. Ako takav redak postoji, povrat je trenutačan. Ako istekne vrijeme, vraćaju se svi dostupni podaci bez obzira na to postoji li znak novog retka.

Povratna vrijednost: pročitani redak ili None pri isteku vremena ako nema dostupnih podataka.

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

Piše međuspremnik bajtova na sabirnicu. Ako su znakovi široki 7 ili 8 bitova, svaki bajt je jedan znak. Ako su znakovi široki 9 bitova, za svaki znak koriste se dva bajta (little endian), a buf mora sadržavati paran broj bajtova.

Povratna vrijednost: broj zapisanih bajtova. Ako dođe do isteka vremena i niti jedan bajt nije zapisan, vraća None.

writechar(char: int) None

Piše jedan znak na sabirnicu. char je cijeli broj koji se zapisuje. Pogledajte odjeljak CTS flow control u nastavku za semantiku blokiranja kada je CTS kontrola protoka omogućena.

sendbreak() None

Šalje break uvjet na sabirnicu. To povlači sabirnicu na nisku razinu u trajanju od 13 bitova.

Konstante

RTS: int

Bitna zastavica za argument flow metode init(); omogućuje RTS (request-to-send) hardversku kontrolu protoka na putu primanja.

CTS: int

Bitna zastavica za argument flow metode init(); omogućuje CTS (clear-to-send) hardversku kontrolu protoka na putu odašiljanja. Može se OR-ati s RTS za omogućavanje oba smjera.

Kontrola protoka

UART(3) podržava RTS/CTS hardversku kontrolu protoka. Na OpenMV Cam M7, H7, H7 Plus i Pure Thermal pinovi za kontrolu protoka su:

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

Na OpenMV Cam N6 izložen je samo nRTS (na pinu zaglavlja P7); nCTS nije usmjeren na ulazno/izlazno zaglavlje.

U sljedećim odlomcima izraz „target” odnosi se na uređaj povezan s UART-om.

Kada se UART-ova metoda init() pozove s argumentom flow postavljenim na jednu ili obje vrijednosti UART.RTS i UART.CTS, konfiguriraju se odgovarajući pinovi za kontrolu protoka. nRTS je izlaz aktivan na niskoj razini, a nCTS je ulaz aktivan na niskoj razini s omogućenim pull-up otpornikom. Za ožičavanje kontrole protoka povežite nCTS OpenMV Cam s nRTS ciljnog uređaja, a nRTS OpenMV Cam s nCTS ciljnog uređaja.

CTS: ciljni uređaj upravlja odašiljačem OpenMV Cam

Ako je CTS kontrola protoka omogućena, ponašanje pri pisanju je sljedeće:

Ako se pozove metoda UART.write(buf) OpenMV Cam, odašiljanje će zastati za sva razdoblja kada je nCTS False. To će rezultirati istekom vremena ako cijeli međuspremnik nije odaslan unutar razdoblja isteka. Metoda vraća broj zapisanih bajtova, omogućujući korisniku da zapiše ostatak podataka po potrebi. U slučaju isteka vremena, jedan znak ostat će u UART-u na čekanju za nCTS. Broj bajtova koji čine taj znak bit će uključen u povratnu vrijednost.

Ako se UART.writechar() pozove kada je nCTS False, metoda će isteći osim ako ciljni uređaj na vrijeme ne aktivira nCTS. Ako istekne, bit će izazvana OSError 116. Znak će biti odaslan čim ciljni uređaj aktivira nCTS.

RTS: OpenMV Cam upravlja odašiljačem ciljnog uređaja

Ako je RTS kontrola protoka omogućena, ponašanje je sljedeće:

Ako se koristi međuspremnik ulaza (read_buf_len > 0), dolazni znakovi se spremaju u međuspremnik. Ako se međuspremnik napuni, sljedeći znak koji pristigne uzrokovat će da nRTS postane False: ciljni uređaj treba prekinuti odašiljanje. nRTS će postati True kada se znakovi pročitaju iz međuspremnika.

Imajte na umu da metoda any() vraća broj bajtova u međuspremniku. Pretpostavimo duljinu međuspremnika od N bajtova. Ako se međuspremnik napuni i pristigne još jedan znak, nRTS će se postaviti na False, a any() će vratiti broj N. Kada se znakovi pročitaju, dodatni znak bit će smješten u međuspremnik i bit će uključen u rezultat sljedećeg poziva any().

Ako se međuspremnik ulaza ne koristi (read_buf_len == 0), dolazak znaka uzrokovat će da nRTS postane False dok se znak ne pročita.