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
注: ストリーム関数 read、write などは MicroPython v1.3.4 で新たに追加されました。それ以前のバージョンでは uart.send と uart.recv を使用します。
コンストラクタ¶
- class pyb.UART(bus: int | str, *args, **kwargs)¶
指定した
bus(整数のペリフェラルインデックス。例えばUART3なら3)上に UART オブジェクトを構築します。追加のパラメータを指定しない場合、オブジェクトは作成されますが初期化されません(以前のバス設定があればそれを保持します)。追加の引数を指定するとバスが初期化されます。利用可能なパラメータについてはinit()を参照してください。UART(3)はすべての STM32 OpenMV Cam で同じヘッダーピンに配線されています:信号
ヘッダーピン
TXP4RXP5一部のボードでは追加の UART バスが利用できます:
バス
TX ピン
RX ピン
利用可能なボード
UART(1)P1P0OpenMV Cam M7 / H7 / H7 Plus / Pure Thermal
UART(4)P2P3OpenMV Cam N6
UART(7)P14P13OpenMV 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.RTS、UART.CTS、またはUART.RTS | UART.CTSにできます。timeoutは最初の文字の書き込み/読み取りを待つタイムアウト(ミリ秒)です。timeout_charは書き込みまたは読み取り中の文字間で待つタイムアウト(ミリ秒)です。read_buf_lenは読み取りバッファの文字長です(0 で無効化)。
このメソッドは、ボーレートを目的の値の 5% 以内に設定できなかった場合に例外を発生させます。
注: parity=None の場合は 8 ビットと 9 ビットのみがサポートされます。パリティを有効にした場合は 7 ビットと 8 ビットのみがサポートされます。
- read(nbytes: int | None = None) bytes | None¶
文字を読み取ります。
nbytesを指定した場合、最大でそのバイト数まで読み取ります。nbytes分がバッファ内で利用可能な場合は即座に返します。そうでない場合は十分な文字が到着するか、タイムアウトが経過したときに返します。nbytesを指定しない場合、このメソッドは可能な限り多くのデータを読み取ります。タイムアウトが経過した後に返します。注: 9 ビット文字の場合、各文字は 2 バイトを使用するため、
nbytesは偶数でなければならず、文字数はnbytes/2になります。戻り値: 読み込んだバイトを含む 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 | bytearray | str) int | None¶
バイトのバッファをバスに書き込みます。文字が 7 ビットまたは 8 ビット幅の場合、各バイトが 1 文字になります。文字が 9 ビット幅の場合、各文字に 2 バイト(リトルエンディアン)が使用され、
bufには偶数バイトを含める必要があります。戻り値: 書き込んだバイト数。タイムアウトが発生し、1 バイトも書き込まれなかった場合は
Noneを返します。
定数¶
フロー制御¶
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() メソッドが flow を UART.RTS と UART.CTS の一方または両方に設定して呼び出されると、該当するフロー制御ピンが構成されます。nRTS はアクティブ Low の出力で、nCTS はプルアップが有効なアクティブ Low の入力です。フロー制御を配線するには、OpenMV Cam の nCTS をターゲットの nRTS に、OpenMV Cam の nRTS をターゲットの nCTS に接続します。
CTS: ターゲットが OpenMV Cam の送信器を制御¶
CTS フロー制御が有効な場合、書き込み動作は次のとおりです:
OpenMV Cam の UART.write(buf) メソッドが呼び出されると、nCTS が False の期間は送信が停止します。これにより、タイムアウト期間内にバッファ全体が送信されなかった場合はタイムアウトになります。このメソッドは書き込まれたバイト数を返すため、必要に応じてユーザーが残りのデータを書き込めます。タイムアウトが発生した場合、1 文字が nCTS を待つ状態で UART に残ります。この文字を構成するバイト数は戻り値に含まれます。
nCTS が False のときに UART.writechar() が呼び出されると、ターゲットが間に合うように nCTS をアサートしない限り、このメソッドはタイムアウトします。タイムアウトすると OSError 116 が発生します。文字は、ターゲットが nCTS をアサートするとすぐに送信されます。
RTS: OpenMV Cam がターゲットの送信器を制御¶
RTS フロー制御が有効な場合、動作は次のとおりです:
バッファ付き入力を使用している場合(read_buf_len > 0)、受信した文字はバッファに格納されます。バッファがいっぱいになると、次に到着する文字によって nRTS が False になります。ターゲットは送信を停止すべきです。バッファから文字が読み取られると nRTS は True になります。
any() メソッドはバッファ内のバイト数を返すことに注意してください。バッファ長を N バイトと仮定します。バッファがいっぱいになり、さらに別の文字が到着すると、nRTS は False に設定され、any() はカウント N を返します。文字が読み取られると、その追加の文字がバッファに置かれ、後続の any() 呼び出しの結果に含まれます。
バッファ付き入力を使用していない場合(read_buf_len == 0)、文字の到着により、その文字が読み取られるまで nRTS が False になります。