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. 3 voor UART3). 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. Zie init() voor de beschikbare parameters.

UART(3) is op elke STM32 OpenMV Cam aangesloten op dezelfde headerpinnen:

Signaal

Headerpin

TX

P4

RX

P5

Op sommige boards zijn aanvullende UART-bussen beschikbaar:

Bus

TX-pin

RX-pin

Beschikbaar op

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

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:

  • 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.

  • flow stelt het type stroombesturing in. Kan 0, UART.RTS, UART.CTS of UART.RTS | UART.CTS zijn.

  • timeout is de time-out in milliseconden om te wachten op het schrijven/lezen van het eerste teken.

  • timeout_char is de time-out in milliseconden om tussen tekens te wachten tijdens het schrijven of lezen.

  • read_buf_len is 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.

deinit() None

Schakel de UART-bus uit.

any() int

Retourneert het aantal wachtende bytes (kan 0 zijn).

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

Lees tekens. Als nbytes is opgegeven, lees dan maximaal zoveel bytes. Als nbytes beschikbaar zijn in de buffer, retourneert het direct, anders retourneert het wanneer er voldoende tekens binnenkomen of de time-out verstrijkt.

Als nbytes niet 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 nbytes even zijn en is het aantal tekens nbytes/2.

Retourwaarde: een bytes-object met de ingelezen bytes. Retourneert None bij 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. Als nbytes is opgegeven, lees dan maximaal zoveel bytes. Anders worden maximaal len(buf) bytes gelezen.

Retourwaarde: aantal gelezen en in buf opgeslagen bytes of None bij 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 None bij 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 buf een even aantal bytes bevatten.

Retourwaarde: aantal geschreven bytes. Als er een time-out optreedt en er geen bytes zijn geschreven, retourneert het None.

writechar(char: int) None

Schrijf een enkel teken naar de bus. char is een geheel getal om te schrijven. Zie de sectie CTS-stroombesturing hieronder voor het blokkeergedrag wanneer CTS-stroombesturing is ingeschakeld.

sendbreak() None

Stuur een break-conditie op de bus. Dit trekt de bus laag gedurende 13 bits.

Constanten

RTS: int

Bitvlag voor het argument flow van init(); schakelt RTS (request-to-send) hardware-stroombesturing in op het ontvangstpad.

CTS: int

Bitvlag voor het argument flow van init(); schakelt CTS (clear-to-send) hardware-stroombesturing in op het verzendpad. Kan met RTS worden gecombineerd via OR om beide richtingen in te schakelen.

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.