class UART – duplex seriële communicatiebus¶
UART implementeert het standaard UART/USART duplex seriële communicatieprotocol. Op fysiek niveau bestaat het uit 2 lijnen: RX en TX. De communicatie-eenheid is een teken (niet te verwarren met een teken in een string) dat 8 of 9 bits breed kan zijn.
UART-objecten kunnen worden aangemaakt en geïnitialiseerd met:
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
Bits kan 7, 8 of 9 zijn. Stop kan 1 of 2 zijn. Met parity=None worden alleen 8 en 9 bits ondersteund. Met pariteit ingeschakeld worden alleen 7 en 8 bits ondersteund.
Een UART-object gedraagt zich als een stream-object en lezen en schrijven gebeurt met de standaard stream-methoden:
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
Constructors¶
- 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)¶
Construeert een UART-object met de gegeven id.
Methoden¶
- 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¶
Initialiseert de UART-bus met de gegeven parameters:
baudrate is de kloksnelheid.
bits is het aantal bits per teken, 7, 8 of 9.
parity is de pariteit,
None, 0 (even) of 1 (oneven).stop is het aantal stopbits, 1 of 2.
Aanvullende parameters die alleen als trefwoord kunnen worden opgegeven en die door een port ondersteund kunnen worden zijn:
tx specificeert de te gebruiken TX-pin.
rx specificeert de te gebruiken RX-pin.
rts specificeert de te gebruiken RTS-pin (uitgang) voor hardwarematige ontvangstflowcontrol.
cts specificeert de te gebruiken CTS-pin (ingang) voor hardwarematige verzendflowcontrol.
txbuf specificeert de lengte in tekens van de TX-buffer.
rxbuf specificeert de lengte in tekens van de RX-buffer.
timeout specificeert de wachttijd voor het eerste teken (in ms).
timeout_char specificeert de wachttijd tussen tekens (in ms).
invert specificeert welke lijnen geïnverteerd moeten worden.
0inverteert geen lijnen (de rusttoestand van beide lijnen is logisch hoog).UART.INV_TXinverteert de TX-lijn (de rusttoestand van de TX-lijn is nu logisch laag).UART.INV_RXinverteert de RX-lijn (de rusttoestand van de RX-lijn is nu logisch laag).UART.INV_TX | UART.INV_RXinverteert beide lijnen (rusttoestand op logisch laag).
flow specificeert welke hardwarematige flowcontrolsignalen gebruikt moeten worden. De waarde is een bitmasker.
0negeert hardwarematige flowcontrolsignalen.UART.RTSschakelt ontvangstflowcontrol in door de RTS-uitgangspin te gebruiken om aan te geven of de ontvangst-FIFO voldoende ruimte heeft om meer data te accepteren.UART.CTSschakelt verzendflowcontrol in door de verzending te pauzeren wanneer de CTS-ingangspin aangeeft dat de ontvanger weinig bufferruimte meer heeft.UART.RTS | UART.CTSschakelt beide in, voor volledige hardwarematige flowcontrol.
Notitie
Het is mogelijk om
init()meerdere keren op hetzelfde object aan te roepen om UART tijdens runtime te herconfigureren. Dit maakt het mogelijk om met één UART-randapparaat verschillende apparaten aangesloten op verschillende GPIO-pinnen te bedienen. In dat geval kan slechts één apparaat tegelijk worden bediend. Roep ookdeinit()niet aan, omdat dit het opnieuw aanroepen vaninit()verhindert.
- deinit() None¶
Schakelt de UART-bus uit.
Notitie
Je kunt
init()niet meer op het object aanroepen nadeinit(). In dat geval moet er een nieuwe instantie worden aangemaakt.
- any() int¶
Geeft een geheel getal terug dat het aantal tekens telt dat gelezen kan worden zonder te blokkeren. Het geeft 0 terug als er geen tekens beschikbaar zijn en een positief getal als er tekens zijn. De methode kan 1 teruggeven, zelfs als er meer dan één teken beschikbaar is om te lezen.
Gebruik voor geavanceerdere opvragingen van beschikbare tekens select.poll:
poll = select.poll() poll.register(uart, select.POLLIN) poll.poll(timeout)
- read(nbytes: int | None = None, /) bytes | None¶
Leest tekens. Als
nbytesis opgegeven, worden er hooguit zoveel bytes gelezen, anders wordt er zoveel data als mogelijk gelezen. De methode kan eerder terugkeren als er een timeout wordt bereikt. De timeout is configureerbaar in de constructor.Retourwaarde: een bytes-object met de ingelezen bytes. Geeft
Noneterug bij een timeout.
- readinto(buf: bytearray, nbytes: int | None = None, /) int | None¶
Leest bytes in
buf. Alsnbytesis opgegeven, worden er hooguit zoveel bytes gelezen. Anders worden er hooguitlen(buf)bytes gelezen. De methode kan eerder terugkeren als er een timeout wordt bereikt. De timeout is configureerbaar in de constructor.Retourwaarde: het aantal gelezen en in
bufopgeslagen bytes, ofNonebij een timeout.
- readline() bytes | None¶
Leest een regel, eindigend op een newline-teken. De methode kan eerder terugkeren als er een timeout wordt bereikt. De timeout is configureerbaar in de constructor.
Retourwaarde: de gelezen regel of
Nonebij een timeout.
- write(buf: bytes) int | None¶
Schrijft de buffer met bytes naar de bus.
Retourwaarde: het aantal geschreven bytes of
Nonebij een timeout.
- sendbreak() None¶
Verstuurt een break-conditie op de bus – houdt TX laag gedurende langer dan één tekentijd. Beschikbaar op STM32 en mimxrt; niet beschikbaar op alif.
- readchar() int¶
Leest een enkel teken van de UART en geeft het terug als een geheel getal (of
-1bij een timeout). Lagere overhead danread(1)omdat er geenbytes-object wordt gealloceerd. Alleen STM32.
- writechar(char: int) None¶
Schrijft het enkele teken
char(een geheel getal in het bereik0–255) naar de UART. Lagere overhead danwrite()voor verzendingen van één byte. Alleen STM32.
- flush() None¶
Blokkeert totdat elke byte die zich momenteel in de verzendbuffer bevindt op TX is uitgeklokt. Genereert
OSErrorbij een timeout; de timeout wordt afgeleid van de grootte van de TX-buffer en de geconfigureerde baudrate, dus tenzij flowcontrol is ingeschakeld en de ontvanger blokkeert, keert de aanroep ruim voor de timeout terug.
- txdone() bool¶
Geeft
Trueterug wanneer er geen verzending gaande is (de TX-buffer is leeg en het schuifregister is geleegd), andersFalse. Nuttig als niet-blokkerend alternatief voorflush().
- irq(handler: Callable[[UART], None] | None = None, trigger: int = 0, hard: bool = False) None¶
Installeert een callback die afgaat bij UART-events.
handleris de aan te roepen functie. Deze ontvangt deUART-instantie als enige argument. GeefNonedoor om een eerder geïnstalleerde handler te verwijderen.triggeris een bitmasker van een of meerIRQ_*-constanten (zie Constanten hieronder) dat selecteert welke events de callback laten afgaan.hard=Trueregistreert een hard-interrupt-handler (lagere latentie, maar de handler mag niet alloceren). De standaard is een ingeplande callback.Geeft een irq-object terug.
Niet elke IRQ-bron is op elke port beschikbaar – zie de afzonderlijke
IRQ_*-constanten voor de beschikbaarheid per port.
Constanten¶
- RTS: int¶
Geef door aan
flowom RTS-hardwareflowcontrol aan de ontvangstzijde in te schakelen. Combineer metCTSvia OR om beide in te schakelen.
- IRQ_RXIDLE: int¶
irq()triggervlag: gaat eenmalig af nadat een of meer tekens zijn ontvangen en de RX-lijn vervolgens inactief wordt. Beschikbaar op alle OpenMV-ports.