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 tekenreeksteken) dat 8 of 9 bits breed kan zijn.
UART-objecten kunnen worden aangemaakt en geïnitialiseerd met:
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 kan 7, 8 of 9 zijn. Parity kan None, 0 (even) of 1 (oneven) zijn. Stop kan 1 of 2 zijn.
Opmerking: met parity=None worden alleen 8 en 9 bits ondersteund. Met parity 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 streammethoden:
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
Afzonderlijke tekens kunnen worden gelezen/geschreven met:
uart.readchar() # read 1 character and returns it as an integer
uart.writechar(42) # write 1 character
Om te controleren of er iets te lezen is, gebruik:
uart.any() # returns the number of characters waiting
Opmerking: De streamfuncties read, write, enz. zijn nieuw in MicroPython v1.3.4. Eerdere versies gebruiken uart.send en uart.recv.
Constructors¶
- class pyb.UART(bus: int | str, *args, **kwargs)¶
Construeer een UART-object op de gegeven
bus(een geheel getal als randapparaatindex, bijv.3voorUART3). Zonder aanvullende parameters wordt het object aangemaakt maar niet geïnitialiseerd (het behoudt de vorige businstellingen, indien aanwezig); als er extra argumenten worden opgegeven, wordt de bus geïnitialiseerd. Zieinit()voor de beschikbare parameters.UART(3)is op elke STM32 OpenMV Cam aangesloten op dezelfde headerpinnen:Signaal
Headerpin
TXP4RXP5Op sommige boards zijn aanvullende UART-bussen beschikbaar:
Bus
TX-pin
RX-pin
Beschikbaar op
UART(1)P1P0OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal
UART(4)P2P3OpenMV Cam N6
UART(7)P14P13OpenMV Cam N6
Methoden¶
- 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¶
Initialiseer de UART-bus met de gegeven parameters:
baudrateis de kloksnelheid.bitsis het aantal bits per teken, 7, 8 of 9.parityis de pariteit,None, 0 (even) of 1 (oneven).stopis het aantal stopbits, 1 of 2.flowstelt het type stroombesturing in. Kan 0,UART.RTS,UART.CTSofUART.RTS | UART.CTSzijn.timeoutis de time-out in milliseconden om te wachten op het schrijven/lezen van het eerste teken.timeout_charis de time-out in milliseconden om tussen tekens te wachten tijdens het schrijven of lezen.read_buf_lenis de tekenlengte van de leesbuffer (0 om uit te schakelen).
Deze methode genereert een uitzondering als de baudrate niet binnen 5% van de gewenste waarde kon worden ingesteld.
Opmerking: met parity=None worden alleen 8 en 9 bits ondersteund. Met parity ingeschakeld worden alleen 7 en 8 bits ondersteund.
- read(nbytes: int | None = None) bytes | None¶
Lees tekens. Als
nbytesis opgegeven, lees dan maximaal zoveel bytes. Alsnbytesbeschikbaar zijn in de buffer, retourneert het direct, anders retourneert het wanneer er voldoende tekens binnenkomen of de time-out verstrijkt.Als
nbytesniet is opgegeven, leest de methode zoveel mogelijk data. Het retourneert nadat de time-out is verstreken.Opmerking: voor 9-bits tekens neemt elk teken twee bytes in beslag, moet
nbyteseven zijn en is het aantal tekensnbytes/2.Retourwaarde: een bytes-object met de ingelezen bytes. Retourneert
Nonebij een time-out.
- readchar() int¶
Ontvang een enkel teken op de bus.
Retourwaarde: het gelezen teken, als geheel getal. Retourneert -1 bij een time-out.
- readinto(buf: bytearray, nbytes: int | None = None) int | None¶
Lees bytes in
buf. Alsnbytesis opgegeven, lees dan maximaal zoveel bytes. Anders worden maximaallen(buf)bytes gelezen.Retourwaarde: aantal gelezen en in
bufopgeslagen bytes ofNonebij een time-out.
- readline() bytes | None¶
Lees een regel, eindigend op een nieuwe-regelteken. Als zo’n regel bestaat, wordt direct geretourneerd. Als de time-out verstrijkt, worden alle beschikbare data geretourneerd, ongeacht of er een nieuwe regel bestaat.
Retourwaarde: de gelezen regel of
Nonebij een time-out als er geen data beschikbaar is.
- write(buf: bytes | bytearray | str) int | None¶
Schrijf de buffer met bytes naar de bus. Als tekens 7 of 8 bits breed zijn, is elke byte één teken. Als tekens 9 bits breed zijn, worden twee bytes gebruikt voor elk teken (little endian) en moet
bufeen even aantal bytes bevatten.Retourwaarde: aantal geschreven bytes. Als er een time-out optreedt en er geen bytes zijn geschreven, retourneert het
None.
Constanten¶
Stroombesturing¶
UART(3) ondersteunt RTS/CTS hardware-stroombesturing. Op de OpenMV Cam M7, H7, H7 Plus en Pure Thermal zijn de stroombesturingspinnen:
(TX, RX, nRTS, nCTS) = (P4, P5, P1, P2)
Op de OpenMV Cam N6 is alleen nRTS beschikbaar (op headerpin P7); nCTS is niet doorverbonden naar de I/O-header.
In de volgende paragrafen verwijst de term “target” naar het apparaat dat op de UART is aangesloten.
Wanneer de init()-methode van de UART wordt aangeroepen met flow ingesteld op een of beide van UART.RTS en UART.CTS, worden de relevante stroombesturingspinnen geconfigureerd. nRTS is een actief-laag uitgang en nCTS is een actief-laag ingang met ingeschakelde pull-up. Om stroombesturing te bedraden, verbind de nCTS van de OpenMV Cam met de nRTS van de target en de nRTS van de OpenMV Cam met de nCTS van de target.
CTS: target bestuurt de zender van de OpenMV Cam¶
Als CTS-stroombesturing is ingeschakeld, is het schrijfgedrag als volgt:
Als de UART.write(buf)-methode van de OpenMV Cam wordt aangeroepen, wordt de transmissie onderbroken voor alle perioden waarin nCTS False is. Dit resulteert in een time-out als de volledige buffer niet binnen de time-outperiode is verzonden. De methode retourneert het aantal geschreven bytes, waardoor de gebruiker zo nodig de rest van de data kan schrijven. In het geval van een time-out blijft er een teken in de UART in afwachting van nCTS. Het aantal bytes waaruit dit teken bestaat, wordt opgenomen in de retourwaarde.
Als UART.writechar() wordt aangeroepen wanneer nCTS False is, zal de methode een time-out krijgen tenzij de target nCTS op tijd activeert. Als er een time-out optreedt, wordt OSError 116 gegenereerd. Het teken wordt verzonden zodra de target nCTS activeert.
RTS: OpenMV Cam bestuurt de zender van de target¶
Als RTS-stroombesturing is ingeschakeld, is het gedrag als volgt:
Als gebufferde invoer wordt gebruikt (read_buf_len > 0), worden binnenkomende tekens gebufferd. Als de buffer vol raakt, zal het volgende binnenkomende teken ervoor zorgen dat nRTS False wordt: de target moet de transmissie stoppen. nRTS wordt True wanneer er tekens uit de buffer worden gelezen.
Merk op dat de any()-methode het aantal bytes in de buffer retourneert. Stel een bufferlengte van N bytes voor. Als de buffer vol raakt en er nog een teken binnenkomt, wordt nRTS op False gezet en retourneert any() de telling N. Wanneer er tekens worden gelezen, wordt het extra teken in de buffer geplaatst en opgenomen in het resultaat van een volgende any()-aanroep.
Als er geen gebufferde invoer wordt gebruikt (read_buf_len == 0), zorgt de aankomst van een teken ervoor dat nRTS False wordt totdat het teken is gelezen.