class UART -- 全二重シリアル通信バス

UART は標準的な UART/USART 全二重シリアル通信プロトコルを実装します。物理層では RX と TX の 2 本の信号線で構成されます。通信の単位は文字(string の文字と混同しないでください)であり、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

ビット数は 7、8、または 9 にできます。ストップビットは 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 は 1 文字あたりのビット数で、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 は、受信 FIFO により多くのデータを受け入れる十分な空きがあるかどうかを通知するために RTS 出力ピンを使用して、受信フロー制御を有効にします。

    • UART.CTS は、受信側のバッファ空き容量が少なくなっていることを CTS 入力ピンが通知したときに送信を一時停止することで、送信フロー制御を有効にします。

    • UART.RTS | UART.CTS は両方を有効にし、完全なハードウェアフロー制御を実現します。

注釈

同じオブジェクトに対して init() を複数回呼び出して、UART を動的に再設定することが可能です。これにより、1 つの UART ペリフェラルを使用して、異なる GPIO ピンに接続された異なるデバイスを処理できます。ただしこの場合、一度に処理できるデバイスは 1 つだけです。また、init() を再度呼び出せなくなるため、deinit() を呼び出さないでください。

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

改行文字で終わる 1 行を読み取ります。タイムアウトに達した場合は、それより早く返ることがあります。タイムアウトはコンストラクタで設定できます。

戻り値: 読み取った行。タイムアウト時は None を返します。

write(buf: bytes) int | None

バイトのバッファをバスに書き込みます。

戻り値: 書き込んだバイト数。タイムアウト時は None を返します。

sendbreak() None

バス上にブレーク状態を送出します。つまり、1 文字分の時間より長く TX をローに駆動します。STM32 と mimxrt で利用できます。alif では公開されていません。

readchar() int

UART から 1 文字を読み取り、整数として返します(タイムアウト時は -1)。bytes オブジェクトを割り当てないため、read(1) よりオーバーヘッドが小さくなります。STM32 のみ。

writechar(char: int) None

1 文字 char0 -- 255 の範囲の整数)を 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 は、どのイベントがコールバックを発火させるかを選択する 1 つ以上の IRQ_* 定数(後述の「定数」を参照)のビットマスクです。

hard=True はハード割り込みハンドラを登録します(レイテンシは低くなりますが、ハンドラはメモリ割り当てを行ってはなりません)。デフォルトはスケジュールされたコールバックです。

irq オブジェクトを返します。

すべての IRQ ソースがすべてのポートで利用できるわけではありません。ポートごとの利用可否については、個々の IRQ_* 定数を参照してください。

定数

RTS: int

受信側で RTS ハードウェアフロー制御を有効にするために flow に渡します。CTS と OR で組み合わせると、両方を有効にできます。

CTS: int

送信側で CTS ハードウェアフロー制御を有効にするために flow に渡します。

IRQ_RXIDLE: int

irq() トリガフラグ: 1 文字以上が受信され、その後 RX 信号線がアイドルになると一度だけ発火します。すべての OpenMV ポートで利用できます。

IRQ_RX: int

irq() トリガフラグ: 受信した文字ごとに発火します。STM32 と alif で利用できます。

IRQ_TXIDLE: int

irq() トリガフラグ: 送信の最後の文字がクロック出力されたときに発火します。mimxrt と alif で利用できます。

IRQ_BREAK: int

irq() トリガフラグ: RX 上でブレーク状態が検出されたときに発火します。OpenMV のどのポートでも利用できません。