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()。
- 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。
- sendbreak() None¶
在匯流排上送出中斷狀況(break condition)——將 TX 拉至低電位,持續時間超過一個字元時間。可在 STM32 與 mimxrt 上使用;alif 上未提供。
- flush() None¶
阻塞直到傳輸緩衝區中目前的每個位元組都已從 TX 送出。逾時會引發
OSError;逾時是由 TX 緩衝區大小與設定的鮑率推算而來,因此除非啟用了流量控制且接收端停滯,否則此呼叫會在逾時之前就傳回。
- 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_*常數以了解各連接埠的可用性。
常數¶