class UART -- 雙工序列通訊匯流排

UART 實作標準的 UART/USART 雙工序列通訊協定。在實體層上它由 2 條線路組成:RX 與 TX。通訊的單位是一個字元(不要與字串字元混淆),其寬度可為 8 或 9 位元。

UART 物件可使用以下方式建立並初始化::

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 可為 7、8 或 9。Stop 可為 1 或 2。當 parity=None 時,只支援 8 與 9 位元。啟用同位檢查時,只支援 7 與 8 位元。

UART 物件的行為類似 stream 物件,讀取與寫入都使用標準的串流方法::

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

建構子

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)

建構一個具有指定 id 的 UART 物件。

方法

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

以指定參數初始化 UART 匯流排:

  • baudrate 是時脈速率。

  • bits 是每個字元的位元數,7、8 或 9。

  • parity 是同位檢查,None、0(偶同位)或 1(奇同位)。

  • stop 是停止位元的數量,1 或 2。

連接埠可能支援的其他僅限關鍵字參數有:

  • tx 指定要使用的 TX 接腳。

  • rx 指定要使用的 RX 接腳。

  • rts 指定用於硬體接收流量控制的 RTS(輸出)接腳。

  • cts 指定用於硬體傳輸流量控制的 CTS(輸入)接腳。

  • txbuf 指定 TX 緩衝區的字元長度。

  • rxbuf 指定 RX 緩衝區的字元長度。

  • timeout 指定等待第一個字元的時間(以毫秒計)。

  • timeout_char 指定字元之間等待的時間(以毫秒計)。

  • invert 指定要反相的線路。

    • 0 不會反相線路(兩條線路的閒置狀態均為邏輯高電位)。

    • UART.INV_TX 會反相 TX 線路(此時 TX 線路的閒置狀態為邏輯低電位)。

    • UART.INV_RX 會反相 RX 線路(此時 RX 線路的閒置狀態為邏輯低電位)。

    • UART.INV_TX | UART.INV_RX 會反相兩條線路(閒置狀態皆為邏輯低電位)。

  • flow 指定要使用的硬體流量控制訊號。其值為位元遮罩。

    • 0 會忽略硬體流量控制訊號。

    • UART.RTS 會啟用接收流量控制,使用 RTS 輸出接腳來表示接收 FIFO 是否有足夠空間接受更多資料。

    • UART.CTS 會啟用傳輸流量控制,當 CTS 輸入接腳表示接收端的緩衝區空間即將不足時暫停傳輸。

    • UART.RTS | UART.CTS 會同時啟用兩者,以實現完整的硬體流量控制。

備註

可以對同一個物件多次呼叫 init(),以便即時重新設定 UART。這樣便能使用單一 UART 周邊裝置來服務連接到不同 GPIO 接腳的不同裝置。在此情況下,一次只能服務一個裝置。此外請勿呼叫 deinit(),因為這會妨礙再次呼叫 init()

deinit() None

關閉 UART 匯流排。

備註

deinit() 之後,你將無法對該物件呼叫 init()。在此情況下需要建立新的實例。

any() int

傳回一個整數,計算可在不阻塞的情況下讀取的字元數。如果沒有可用字元則傳回 0,如果有字元則傳回正數。即使有超過一個字元可供讀取,此方法也可能傳回 1。

若要更精密地查詢可用字元,請使用 select.poll::

poll = select.poll()
poll.register(uart, select.POLLIN)
poll.poll(timeout)
read(nbytes: int | None = None, /) bytes | None

讀取字元。如果指定了 nbytes,則最多讀取那麼多位元組,否則盡可能多地讀取資料。若達到逾時可能會提早傳回。逾時可在建構子中設定。

傳回值:一個包含所讀入位元組的 bytes 物件。逾時則傳回 None

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

將位元組讀入 buf。如果指定了 nbytes,則最多讀取那麼多位元組。否則最多讀取 len(buf) 個位元組。若達到逾時可能會提早傳回。逾時可在建構子中設定。

傳回值:讀取並儲存到 buf 的位元組數,或逾時則傳回 None

readline() bytes | None

讀取一行,以換行字元結尾。若達到逾時可能會提早傳回。逾時可在建構子中設定。

傳回值:讀取到的行,或逾時則傳回 None

write(buf: bytes) int | None

將位元組緩衝區寫入匯流排。

傳回值:寫入的位元組數,或逾時則傳回 None

sendbreak() None

在匯流排上送出中斷狀況(break condition)——將 TX 拉至低電位,持續時間超過一個字元時間。可在 STM32 與 mimxrt 上使用;alif 上未提供。

readchar() int

從 UART 讀取單一字元並以整數傳回(逾時則傳回 -1)。由於不會配置 bytes 物件,因此比 read(1) 的開銷更低。僅限 STM32。

writechar(char: int) None

將單一字元 char(範圍 0255 的整數)寫入 UART。對於單一位元組的傳送,比 write() 的開銷更低。僅限 STM32。

flush() None

阻塞直到傳輸緩衝區中目前的每個位元組都已從 TX 送出。逾時會引發 OSError;逾時是由 TX 緩衝區大小與設定的鮑率推算而來,因此除非啟用了流量控制且接收端停滯,否則此呼叫會在逾時之前就傳回。

txdone() bool

當沒有傳輸進行中(TX 緩衝區為空且移位暫存器已排空)時傳回 True,否則傳回 False。可作為 flush() 的非阻塞替代方案。

irq(handler: Callable[[UART], None] | None = None, trigger: int = 0, hard: bool = False) None

安裝一個在 UART 事件時觸發的回呼函式。

handler 是要呼叫的函式。它接收 UART 實例作為其唯一引數。傳入 None 可移除先前安裝的處理常式。

trigger 是一個或多個 IRQ_* 常數的位元遮罩(請參閱下方的「常數」),用於選擇哪些事件會觸發回呼函式。

hard=True 會註冊一個硬中斷處理常式(延遲較低,但處理常式不得配置記憶體)。預設為排程的回呼函式。

傳回一個 irq 物件。

並非每個連接埠都提供每一個 IRQ 來源——請參閱各個 IRQ_* 常數以了解各連接埠的可用性。

常數

RTS: int

傳入 flow 以在接收端啟用 RTS 硬體流量控制。透過 OR 與 CTS 結合即可同時啟用兩者。

CTS: int

傳入 flow 以在傳輸端啟用 CTS 硬體流量控制。

IRQ_RXIDLE: int

irq() 觸發旗標:在接收到一個或多個字元且 RX 線路隨後變為閒置後觸發一次。可在所有 OpenMV 連接埠上使用。

IRQ_RX: int

irq() 觸發旗標:在每次接收到字元後觸發。可在 STM32 與 alif 上使用。

IRQ_TXIDLE: int

irq() 觸發旗標:當傳輸的最後一個字元已送出時觸發。可在 mimxrt 與 alif 上使用。

IRQ_BREAK: int

irq() 觸發旗標:當在 RX 上偵測到中斷狀況時觸發。任何 OpenMV 連接埠上皆不提供。