クラス UART -- 二重シリアル通信バス

UART は標準の UART/USART 二重シリアル通信プロトコルを実装しています。物理レベルでは RX と TX の2線で構成されています。通信の単位は 8 または 9 ビット幅の文字です(string 型の文字と混同しないでください)。

UART オブジェクトは以下をように作成、初期化できます:

from machine import UART

uart = UART(1, 9600)                         # 与えたボーレートで初期化
uart.init(9600, bits=8, parity=None, stop=1) # 与えたパラメータで初期化

サポートされているパラメータはボードによって異なります:

pyboard: bits は 7, 8, 9 にすることができます。stop は 1 または 2 にすることができます。 parity=None の場合、bitsは 8 と 9 のみがサポートされます。parity を有効にすると 7 と 8 のビット幅のみがサポートされます。

WiPy/CC3200: ビット幅は 5, 6, 7, 8 です。stop は 1 または 2 です。

UART オブジェクトはストリーム(stream)オブジェクトのように機能し、読み書きは標準のストリームメソッドを使って行われます。

uart.read(10)       # 10文字を読み込んで、bytes 型オブジェクトを返す
uart.read()         # 可能な限り文字を読み込む
uart.readline()     # 1行を読み込む
uart.readinto(buf)  # 読み込んで、与えたバッファに格納
uart.write('abc')   # 3文字を書き込む

コンストラクタ

class machine.UART(id, ...)

指定した id の UART オブジェクトを構築します。

メソッド

UART.init(baudrate=9600, bits=8, parity=None, stop=1, *, ...)

与えたパラメータで 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 は受信フロー制御を有効にします。RTS 出力ピンを使い、受信 FIFO にさらなるデータを受け入れるための十分なスペースがあるかどうかを通知します。
    • UART.CTS は送信フロー制御を有効にします。CTS 入力ピンが受信側のバッファ容量が不足していることを通知した場合、送信を一時停止します。
    • UART.RTS | UART.CTS では両方が有効となり、完全なハードウェアフロー制御となります。

WiPy では、次のキーワード指定のみのパラメータがサポートされています。

  • pins は TX, RX, RTS, CTS ピンを(この順序で)示す4または2項目のリストです。限られた機能で UART を動作させたい場合は、どのピンも None にできます。RTS ピンが与えられている場合は RX ピンも与えられなければなりません。同じことが CTS にも当てはまります。ピンが指定されていない場合は、デフォルトの TX ピンと RX ピンが使われ、ハードウェアフロー制御は無効になります。pins が None の場合、ピンの割り当ては行われません。

注釈

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

UART.deinit()

UART バスをオフにします。

注釈

deinit() の後に、そのオブジェクトに対して init() を呼び出すことはできません。その場合、新しいインスタンスを作成する必要があります。

UART.any()

ブロックなしで読み込める文字数を整数で返します。読み込める文字がない場合は 0 を返し、文字がある場合は正の数を返します。読み込める文字が複数ある場合でも、このメソッドは 1 を返すことがあります。

読み込める文字のより洗練された問い合わせには select.poll を使ってください:

poll = select.poll()
poll.register(uart, select.POLLIN)
poll.poll(timeout)
UART.read([nbytes])

文字を読み込みます。 nbytes を指定した場合は、最大でそのバイト数を読み込みます。 nbytes を指定しなかった場合は、できるだけ多くのデータを読み込みます。タイムアウトにより、より早く戻ることがあります。タイムアウトはコンストラクタで設定できます。

戻り値: 読み込んだバイト列を含む bytes 型オブジェクト。タイムアウト時は None を返します。

UART.readinto(buf[, nbytes])

buf にバイトを読み込みます。 nbytes が指定されている場合は、最大でそのバイト数を読み取ります。nbytes を指定しなかった場合は、最大で len(buf) バイト数を読み込みます。タイムアウトにより、より早く戻ることがあります。タイムアウトはコンストラクタで設定できます。

戻り値: 読み込んで buf に格納したバイト数。タイムアウト時は None を返します。

UART.readline()

改行文字で終わる行を読みます。タイムアウトにより、より早く戻ることがあります。タイムアウトはコンストラクタで設定できます。

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

UART.write(buf)

バッファの bytes 型オブジェクトをバスに書き込みます。

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

UART.sendbreak()

バスにブレーク信号を送信します。これは通常の文字伝送に必要とされるよりも長い期間にわたってバスをローで駆動します。

UART.irq(trigger, priority=1, handler=None, wake=machine.IDLE)

データが UART で受信されたときにトリガーされるコールバックを作成します。

  • trigger には UART.RX_ANY だけを指定できます。
  • priority は割り込みの優先順位です。1-7 の範囲の値を取ることができます。値が大きいほど優先順位が高くなります。
  • hanfler は新しい文字が到着したときに呼び出されるオプションの関数です。
  • wake には machine.IDLE だけを指定できます。

注釈

このハンドラは、次の2つの条件のいずれかが満たされると必ず呼び出されます:

  • 新規に8文字を受信した。
  • 少なくとも新規の1文字が Rx バッファーで待機していて、Rx の線が1つの完全なフレームの間、何も受信していない。

つまり、ハンドラ関数が呼び出されると、1 から 8 文字の間の待機があります。

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

可用性: WiPy

UART.flush()

すべてのデータが送信されるまで待機します。タイムアウトの場合、例外が発生します。タイムアウト時間は、送信バッファサイズとボーレートに依存します。フロー制御が有効でない限り、タイムアウトは発生しないはずです。

注釈

rp2, esp8266, nrf ポートでは、最後のバイトが送信される間に呼出しが返されます。必要に応じて、呼出し側のスクリプトに1文字の待ち時間を追加してください。

このメソッドの可用性: rp2, esp32, esp8266, mimxrt, cc3200, stm32, nrf ポート

UART.txdone()

すべてのデータが送信されたのか、またはデータ転送が行われていないのかを知らせます。そのような場合にが True を返します。もしデータ転送が進行中であれば False を返します。

注釈

rp2, esp8266, nrf ポートでは、転送の最後のバイトがまだ送信中であっても、この呼出しが True を返すかもしれません。必要に応じて、呼出し側のスクリプトに1文字の待ち時間を追加してください。

このメソッドの可用性: rp2, esp32, esp8266, mimxrt, cc3200, stm32, nrf ポート

定数

UART.RX_ANY

IRQ トリガーソース

可用性: WiPy