machine.UART 使い方
先の記事「RasPi, ESP32, PIC 使い分け」にも書きましたが、RasPiとESP32の接続はUARTを多用しています。RasPiのGPIOを出来るだけ使わず、USB-シリアル変換ケーブル等で接続することで、RasPiに限らずLinux PC や必要ならWindows PCに接続出来ることで選択肢を広げられると考えています。
そんな訳で、私にとってUARTはとても重要な存在です。
いろいろな関数があるようですが、ここでは私が実際に使っているものだけを紹介します。
machine.UARTクラスをインポート
次のように、machineモジュールのUARTクラスをインポートします。
from machine import UART
UARTの初期化
UART番号、ボーレート、Rxdピン番号、Txdピン番号を指定して初期化したオブジェクトを作成します。
以下の例ではオブジェクト ser を作成しています。
ser = UART(1, baudrate=9600, rx=33, tx=22)
文字列送信
上で作成したオブジェクト ser に文字列 'abc' を送信する例です。
ser.write('abc')
一行受信
前述のオブジェクト ser から変数 d に一行受信します。
d=ser.readline()
改行コードがあれば改行コードまで受信します。
そうでなければ、あるだけ受信します。
ESP32のUARTバッファサイズは64byteのようです。
バッファ内文字数確認
バッファ内に残っている文字数を読み出します。
l=ser.any()
実際の使用例
以下のようなclassを作って使っています。
class com: # UART
# バッファサイズ64bytes
def __init__(self):
self.urtn = 1
self.bps = 115200
self.rxpin = 33
self.txpin = 22
def init_com(self, urtn, bps, rxpin, txpin):
# urtn, bps, rxpin, txpin
# シリアルポート初期化
self.urtn = urtn
self.bps = bps
self.rxpin = rxpin
self.txpin = txpin
self.ser = UART(self.urtn,baudrate=self.bps,rx=self.rxpin,tx=self.txpin)
def send_l(self, line):
# 文字列送信
self.ser.write(line + '\r\n')
def receive_line(self):
# 既に何等か受信していればLFまで受信して文字列を返す。
# 未受信時にはNULL str を返す。
res = ''
c = self.ser.any()
while c > 0:
sleep(0.05)
l = self.ser.readline()
if l != None:
m = l.decode('utf-8')
res += m
if res[len(res)-1:] == '\n':
c = 0
return res
def check(self):
# 受信済beyte数を返す
l = self.ser.any()
return l
main では以下のようにオブジェクト ser を作成しています。
sub1 は前述のClassを含むファイルのインポート名です。
ser = sub1.com() # UART
ser.init_com(1, 9600, 33,22) # urtn, bps, rxpin, txpin
ser.send_l('test')
a = ser.receive_line()
とりあえず、これで動いています。
class の中にある receive_line(self): で m = l.decode('utf-8') のようにデコードしていますが、受信時の文字化けが発生するとデコード出来ずにエラーになる可能性があります。
この場合はTry分で対応しています。
お気づきの点などありましたら遠慮なくコメントで教えてください。
宜しくお願いいたします。
出来ればサポート頂けると、嬉しいです。 新しい基板や造形品を作る資金等に使いたいと思います。