クラス 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 を有効にすると bits には 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.flush()¶
すべてのデータが送信されるまで待機します。タイムアウトの場合、例外が発生します。タイムアウト時間は、送信バッファサイズとボーレートに依存します。フロー制御が有効でない限り、タイムアウトは発生しないはずです。
注釈
esp8266 と nrf ポートでは、最後のバイトが送信される間に呼出しが返されます。必要に応じて、呼出し側のスクリプトに1文字の待ち時間を追加してください。
対応ポート: rp2, esp32, esp8266, mimxrt, cc3200, stm32, nrf ポート, renesas-ra
- UART.txdone()¶
すべてのデータが送信されたのか、またはデータ転送が行われていないのかを知らせます。そのような場合にが
True
を返します。もしデータ転送が進行中であればFalse
を返します。注釈
esp8266 と nrf ポートでは、転送の最後のバイトがまだ送信中であっても、この呼出しが
True
を返すかもしれません。必要に応じて、呼出し側のスクリプトに1文字の待ち時間を追加してください。対応ポート: rp2, esp32, esp8266, mimxrt, cc3200, stm32, nrf ポート, renesas-ra
- UART.irq(handler=None, trigger=0, hard=False)¶
UART イベントが発生した場合に呼び出される割り込みハンドラーを設定します。
引数は次のとおりです:
hanfler は新しい割り込みイベントが発生した場合に呼び出されるオプションの関数です。このハンドラーは
UART
インスタンスだけを引数に持つものでなければなりません。trigger には、割り込みを発生させることができるイベントを指定します。可能な値は以下のいずれか、または複数のマスクです。
UART.IRQ_RXIDLE
は1文字以上を受信した後、RX ラインがアイドル状態になったときに割り込みを発生させます。UART.IRQ_RX
は受信する各文字ごとに割り込みを発生させます。UART.IRQ_TXIDLE
はメッセージの最後の文字を送信後または送信中に割り込みを発生させます。UART.IRQ_BREAK
は RX でブレーク状態が検出されたときに割り込みを発生させます。
hard に True を指定した場合、ハードウェア割り込みが使用されます。これにより、ピンの状態変化とハンドラの呼び出しとの間の遅延が減少します。ハードウェア割り込みのハンドラではメモリを割り当てることができません。 割り込みハンドラの作成 を参照。
戻り値は irq オブジェクトです。
ハードウェアの制約により、すべての発生イベントがすべてのポートで利用できるわけではありません。
利用できる発生イベント¶ ポート / 発生イベント
IRQ_RXIDLE
IRQ_RX
IRQ_TXIDLE
IRQ_BREAK
CC3200
利用可能
ESP32
利用可能
利用可能
利用可能
MIMXRT
利用可能
利用可能
NRF
利用可能
利用可能
RENESAS-RA
利用可能
利用可能
RP2
利用可能
利用可能
利用可能
SAMD
利用可能
利用可能
利用可能
STM32
利用可能
利用可能
注釈
ESP32 ポートでは hard=True オプションをサポートしていません。
rp2 ポートの UART.IRQ_TXIDLE は、メッセージが5文字以上で、送信すべき文字がまだ 5 文字残っているときに発生します。
rp2 ポートの UART.IRQ_BREAK が再び発生されるようになるには有効な文字を受信する必要があります。
SAMD ポートの UART.IRQ_TXIDLE は、最後の文字を送信している間に発生します。
STM32F4xx MCU で UART.IRQ_RXIDLE イベントを指定すると、ハンドラは最初の文字受信後とメッセージの終わりでラインがアイドル状態のときに呼び出されます。
対応ポート: cc3200, esp32, mimxrt, nrf, renesas-ra, rp2, samd, stm32