class UART – kaksisuuntainen sarjaliikenneväylä

UART toteuttaa standardin UART/USART-kaksisuuntaisen sarjaliikenneprotokollan. Fyysisellä tasolla se koostuu kahdesta linjasta: RX ja TX. Liikenteen yksikkö on merkki (jota ei pidä sekoittaa merkkijonon merkkiin), joka voi olla 8 tai 9 bittiä leveä.

UART-objekteja voidaan luoda ja alustaa seuraavasti:

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)

Bittejä voi olla 7, 8 tai 9. Pariteetti voi olla None, 0 (parillinen) tai 1 (pariton). Pysäytysbittejä voi olla 1 tai 2.

Huomautus: arvolla parity=None vain 8 ja 9 bittiä ovat tuettuja. Pariteetin ollessa käytössä vain 7 ja 8 bittiä ovat tuettuja.

UART-objekti toimii kuten stream-objekti, ja luku ja kirjoitus tehdään tavanomaisilla stream-metodeilla:

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

Yksittäisiä merkkejä voidaan lukea/kirjoittaa seuraavasti:

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

Tarkistaaksesi, onko luettavaa, käytä:

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

Huomautus: stream-funktiot read, write jne. ovat uusia MicroPythonin versiossa v1.3.4. Aiemmat versiot käyttävät metodeja uart.send ja uart.recv.

Konstruktorit

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

Muodostaa UART-objektin annetulle väylälle bus (kokonaislukumuotoinen oheislaitteen indeksi, esim. 3 väylälle UART3). Ilman lisäparametreja objekti luodaan mutta sitä ei alusteta (se säilyttää väylän aiemmat asetukset, jos sellaisia on); jos lisäargumentteja annetaan, väylä alustetaan. Katso käytettävissä olevat parametrit metodista init().

UART(3) on kytketty samoihin liitinnastoihin jokaisessa STM32-pohjaisessa OpenMV Camissa:

Signaali

Liitinnasta

TX

P4

RX

P5

Joissakin korteissa on käytettävissä lisää UART-väyliä:

Väylä

TX-nasta

RX-nasta

Käytettävissä laitteissa

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

Metodit

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

Alustaa UART-väylän annetuilla parametreilla:

  • baudrate on kellotaajuus.

  • bits on bittien määrä merkkiä kohden, 7, 8 tai 9.

  • parity on pariteetti, None, 0 (parillinen) tai 1 (pariton).

  • stop on pysäytysbittien määrä, 1 tai 2.

  • flow asettaa vuonohjauksen tyypin. Voi olla 0, UART.RTS, UART.CTS tai UART.RTS | UART.CTS.

  • timeout on aikakatkaisu millisekunteina, jonka verran odotetaan ensimmäisen merkin kirjoittamista/lukemista.

  • timeout_char on aikakatkaisu millisekunteina, jonka verran odotetaan merkkien välillä kirjoitettaessa tai luettaessa.

  • read_buf_len on lukupuskurin pituus merkkeinä (0 poistaa sen käytöstä).

Tämä metodi nostaa poikkeuksen, jos siirtonopeutta ei voida asettaa 5 % tarkkuudella halutusta arvosta.

Huomautus: arvolla parity=None vain 8 ja 9 bittiä ovat tuettuja. Pariteetin ollessa käytössä vain 7 ja 8 bittiä ovat tuettuja.

deinit() None

Sammuttaa UART-väylän.

any() int

Palauttaa odottavien tavujen määrän (voi olla 0).

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

Lukee merkkejä. Jos nbytes on määritetty, luetaan enintään kyseinen määrä tavuja. Jos puskurissa on saatavilla nbytes tavua, palaa välittömästi, muutoin palaa kun riittävästi merkkejä saapuu tai aikakatkaisu kuluu umpeen.

Jos nbytes ei ole annettu, metodi lukee niin paljon dataa kuin mahdollista. Se palaa aikakatkaisun kuluttua umpeen.

Huomautus: 9-bittisillä merkeillä kukin merkki vie kaksi tavua, nbytes täytyy olla parillinen, ja merkkien määrä on nbytes/2.

Paluuarvo: bytes-objekti, joka sisältää luetut tavut. Palauttaa None aikakatkaisun yhteydessä.

readchar() int

Vastaanottaa yhden merkin väylältä.

Paluuarvo: luettu merkki kokonaislukuna. Palauttaa -1 aikakatkaisun yhteydessä.

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

Lukee tavuja puskuriin buf. Jos nbytes on määritetty, luetaan enintään kyseinen määrä tavuja. Muutoin luetaan enintään len(buf) tavua.

Paluuarvo: puskuriin buf luettujen ja tallennettujen tavujen määrä tai None aikakatkaisun yhteydessä.

readline() bytes | None

Lukee rivin, joka päättyy rivinvaihtomerkkiin. Jos tällainen rivi on olemassa, palataan välittömästi. Jos aikakatkaisu kuluu umpeen, kaikki saatavilla oleva data palautetaan riippumatta siitä, onko rivinvaihtoa olemassa.

Paluuarvo: luettu rivi tai None aikakatkaisun yhteydessä, jos dataa ei ole saatavilla.

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

Kirjoittaa tavupuskurin väylälle. Jos merkit ovat 7 tai 8 bittiä leveitä, kukin tavu on yksi merkki. Jos merkit ovat 9 bittiä leveitä, kullekin merkille käytetään kahta tavua (little endian), ja buf täytyy sisältää parillinen määrä tavuja.

Paluuarvo: kirjoitettujen tavujen määrä. Jos aikakatkaisu tapahtuu eikä yhtään tavua kirjoitettu, palauttaa None.

writechar(char: int) None

Kirjoittaa yhden merkin väylälle. char on kirjoitettava kokonaisluku. Katso alla oleva CTS-vuonohjaus-osio CTS-vuonohjauksen ollessa käytössä esiintyvistä lukitussemantiikoista.

sendbreak() None

Lähettää keskeytysehdon (break) väylälle. Tämä vetää väylän alas 13 bitin ajaksi.

Vakiot

RTS: int

Bittilippu metodin init() argumentille flow; ottaa käyttöön RTS (request-to-send) -laitteistovuonohjauksen vastaanottopolulla.

CTS: int

Bittilippu metodin init() argumentille flow; ottaa käyttöön CTS (clear-to-send) -laitteistovuonohjauksen lähetyspolulla. Voidaan yhdistää OR-operaatiolla arvoon RTS molempien suuntien käyttöön ottamiseksi.

Vuonohjaus

UART(3) tukee RTS/CTS-laitteistovuonohjausta. OpenMV Cam M7-, H7-, H7 Plus- ja Pure Thermal -malleissa vuonohjausnastat ovat:

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

OpenMV Cam N6 -mallissa vain nRTS on tuotu ulos (liitinnastaan P7); nCTS ei ole reititetty I/O-liittimeen.

Seuraavissa kappaleissa termi ”kohde” viittaa UART:iin kytkettyyn laitteeseen.

Kun UART:n init()-metodi kutsutaan flow-arvolla, joka on asetettu yhteen tai molempiin arvoista UART.RTS ja UART.CTS, asianmukaiset vuonohjausnastat määritetään. nRTS on aktiivi-matala lähtö ja nCTS on aktiivi-matala tulo ylösvetovastuksella varustettuna. Kytkeäksesi vuonohjauksen, yhdistä OpenMV Camin nCTS kohteen nRTS-nastaan ja OpenMV Camin nRTS kohteen nCTS-nastaan.

CTS: kohde ohjaa OpenMV Camin lähetintä

Jos CTS-vuonohjaus on käytössä, kirjoituskäyttäytyminen on seuraava:

Jos OpenMV Camin UART.write(buf)-metodi kutsutaan, lähetys pysähtyy kaikkina ajanjaksoina, joina nCTS on False. Tämä johtaa aikakatkaisuun, jos koko puskuria ei lähetetty aikakatkaisuajan kuluessa. Metodi palauttaa kirjoitettujen tavujen määrän, jolloin käyttäjä voi kirjoittaa loput datasta tarvittaessa. Aikakatkaisun yhteydessä yksi merkki jää UART:iin odottamaan nCTS-signaalia. Tämän merkin muodostavien tavujen määrä sisältyy paluuarvoon.

Jos UART.writechar() kutsutaan, kun nCTS on False, metodi aikakatkaistaan, ellei kohde aseta nCTS-signaalia ajoissa. Jos se aikakatkaistaan, nostetaan OSError 116. Merkki lähetetään heti, kun kohde asettaa nCTS-signaalin.

RTS: OpenMV Cam ohjaa kohteen lähetintä

Jos RTS-vuonohjaus on käytössä, käyttäytyminen on seuraava:

Jos puskuroitua tuloa käytetään (read_buf_len > 0), saapuvat merkit puskuroidaan. Jos puskuri tulee täyteen, seuraava saapuva merkki saa nRTS-signaalin menemään False-tilaan: kohteen tulee lopettaa lähetys. nRTS menee True-tilaan, kun merkkejä luetaan puskurista.

Huomaa, että any()-metodi palauttaa puskurissa olevien tavujen määrän. Oletetaan, että puskurin pituus on N tavua. Jos puskuri tulee täyteen ja toinen merkki saapuu, nRTS asetetaan tilaan False ja any() palauttaa lukumäärän N. Kun merkkejä luetaan, ylimääräinen merkki sijoitetaan puskuriin ja se sisältyy myöhemmän any()-kutsun tulokseen.

Jos puskuroitua tuloa ei käytetä (read_buf_len == 0), merkin saapuminen saa nRTS-signaalin menemään False-tilaan, kunnes merkki on luettu.