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

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

UART オブジェクトは次のように作成および初期化できます:

from pyb import UART

# init with the given baudrate
uart = UART(3, 9600, timeout_char=1000)

# init with explicit parameters
uart.init(9600, bits=8, parity=None, stop=1, timeout_char=1000)

Bits は 7、8、または 9 にできます。Parity は None、0(偶数)または 1(奇数)にできます。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

個々の文字は次のように読み書きできます:

uart.readchar()     # read 1 character and returns it as an integer
uart.writechar(42)  # write 1 character

読み取るべきデータがあるかどうかを確認するには、次を使用します:

uart.any()          # returns the number of characters waiting

注: ストリーム関数 readwrite などは MicroPython v1.3.4 で新たに追加されました。それ以前のバージョンでは uart.senduart.recv を使用します。

コンストラクタ

class pyb.UART(bus: int | str, *args, **kwargs)

指定した bus(整数のペリフェラルインデックス。例えば UART3 なら 3)上に UART オブジェクトを構築します。追加のパラメータを指定しない場合、オブジェクトは作成されますが初期化されません(以前のバス設定があればそれを保持します)。追加の引数を指定するとバスが初期化されます。利用可能なパラメータについては init() を参照してください。

UART(3) はすべての STM32 OpenMV Cam で同じヘッダーピンに配線されています:

信号

ヘッダーピン

TX

P4

RX

P5

一部のボードでは追加の UART バスが利用できます:

バス

TX ピン

RX ピン

利用可能なボード

UART(1)

P1

P0

OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal

UART(4)

P2

P3

OpenMV Cam N6

UART(7)

P14

P13

OpenMV Cam N6

メソッド

init(baudrate: int, bits: int = 8, parity: int | None = None, stop: int = 1, *, timeout: int = 1000, flow: int = 0, timeout_char: int = 0, read_buf_len: int = 64) None

指定したパラメータで UART バスを初期化します:

  • baudrate はクロックレートです。

  • bits は 1 文字あたりのビット数で、7、8、または 9 です。

  • parity はパリティで、None、0(偶数)または 1(奇数)です。

  • stop はストップビット数で、1 または 2 です。

  • flow はフロー制御の種類を設定します。0、UART.RTSUART.CTS、または UART.RTS | UART.CTS にできます。

  • timeout は最初の文字の書き込み/読み取りを待つタイムアウト(ミリ秒)です。

  • timeout_char は書き込みまたは読み取り中の文字間で待つタイムアウト(ミリ秒)です。

  • read_buf_len は読み取りバッファの文字長です(0 で無効化)。

このメソッドは、ボーレートを目的の値の 5% 以内に設定できなかった場合に例外を発生させます。

注: parity=None の場合は 8 ビットと 9 ビットのみがサポートされます。パリティを有効にした場合は 7 ビットと 8 ビットのみがサポートされます。

deinit() None

UART バスをオフにします。

any() int

待機中のバイト数を返します(0 の場合もあります)。

read(nbytes: int | None = None) bytes | None

文字を読み取ります。nbytes を指定した場合、最大でそのバイト数まで読み取ります。nbytes 分がバッファ内で利用可能な場合は即座に返します。そうでない場合は十分な文字が到着するか、タイムアウトが経過したときに返します。

nbytes を指定しない場合、このメソッドは可能な限り多くのデータを読み取ります。タイムアウトが経過した後に返します。

注: 9 ビット文字の場合、各文字は 2 バイトを使用するため、nbytes は偶数でなければならず、文字数は nbytes/2 になります。

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

readchar() int

バス上で 1 文字を受信します。

戻り値: 読み取った文字(整数)。タイムアウト時には -1 を返します。

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

バイトを buf に読み込みます。nbytes を指定した場合、最大でそのバイト数まで読み取ります。そうでない場合は最大 len(buf) バイトまで読み取ります。

戻り値: 読み取って buf に格納したバイト数、またはタイムアウト時には None

readline() bytes | None

改行文字で終わる 1 行を読み取ります。そのような行が存在する場合は即座に返します。タイムアウトが経過した場合は、改行が存在するかどうかにかかわらず、利用可能なすべてのデータを返します。

戻り値: 読み取った行、またはデータが利用できない場合のタイムアウト時には None

write(buf: bytes | bytearray | str) int | None

バイトのバッファをバスに書き込みます。文字が 7 ビットまたは 8 ビット幅の場合、各バイトが 1 文字になります。文字が 9 ビット幅の場合、各文字に 2 バイト(リトルエンディアン)が使用され、buf には偶数バイトを含める必要があります。

戻り値: 書き込んだバイト数。タイムアウトが発生し、1 バイトも書き込まれなかった場合は None を返します。

writechar(char: int) None

バス上で 1 文字を書き込みます。char は書き込む整数です。CTS フロー制御が有効な場合のブロッキング動作については、後述の CTS フロー制御 セクションを参照してください。

sendbreak() None

バス上でブレーク状態を送信します。これによりバスが 13 ビット分の期間 Low に駆動されます。

定数

RTS: int

init()flow 引数用のビットフラグ。受信パスで RTS(request-to-send)ハードウェアフロー制御を有効にします。

CTS: int

init()flow 引数用のビットフラグ。送信パスで CTS(clear-to-send)ハードウェアフロー制御を有効にします。RTS と OR して両方向を有効にできます。

フロー制御

UART(3) は RTS/CTS ハードウェアフロー制御をサポートします。OpenMV Cam M7、H7、H7 Plus、Pure Thermal では、フロー制御ピンは次のとおりです:

(TX, RX, nRTS, nCTS) = (P4, P5, P1, P2)

OpenMV Cam N6 では nRTS のみが公開されています(ヘッダーピン P7 上)。nCTS は I/O ヘッダーに配線されていません。

以下の段落では、「ターゲット」という用語は UART に接続されたデバイスを指します。

UART の init() メソッドが flowUART.RTSUART.CTS の一方または両方に設定して呼び出されると、該当するフロー制御ピンが構成されます。nRTS はアクティブ Low の出力で、nCTS はプルアップが有効なアクティブ Low の入力です。フロー制御を配線するには、OpenMV Cam の nCTS をターゲットの nRTS に、OpenMV Cam の nRTS をターゲットの nCTS に接続します。

CTS: ターゲットが OpenMV Cam の送信器を制御

CTS フロー制御が有効な場合、書き込み動作は次のとおりです:

OpenMV Cam の UART.write(buf) メソッドが呼び出されると、nCTSFalse の期間は送信が停止します。これにより、タイムアウト期間内にバッファ全体が送信されなかった場合はタイムアウトになります。このメソッドは書き込まれたバイト数を返すため、必要に応じてユーザーが残りのデータを書き込めます。タイムアウトが発生した場合、1 文字が nCTS を待つ状態で UART に残ります。この文字を構成するバイト数は戻り値に含まれます。

nCTSFalse のときに UART.writechar() が呼び出されると、ターゲットが間に合うように nCTS をアサートしない限り、このメソッドはタイムアウトします。タイムアウトすると OSError 116 が発生します。文字は、ターゲットが nCTS をアサートするとすぐに送信されます。

RTS: OpenMV Cam がターゲットの送信器を制御

RTS フロー制御が有効な場合、動作は次のとおりです:

バッファ付き入力を使用している場合(read_buf_len > 0)、受信した文字はバッファに格納されます。バッファがいっぱいになると、次に到着する文字によって nRTSFalse になります。ターゲットは送信を停止すべきです。バッファから文字が読み取られると nRTSTrue になります。

any() メソッドはバッファ内のバイト数を返すことに注意してください。バッファ長を N バイトと仮定します。バッファがいっぱいになり、さらに別の文字が到着すると、nRTS は False に設定され、any() はカウント N を返します。文字が読み取られると、その追加の文字がバッファに置かれ、後続の any() 呼び出しの結果に含まれます。

バッファ付き入力を使用していない場合(read_buf_len == 0)、文字の到着により、その文字が読み取られるまで nRTSFalse になります。