稼働中

マイクロビット(m_10)microbit.uart

uart

「microbit」モジュールには「display, Image, button_a, button_b, accelerometer, compass,pin0, pin1, pin2, pin3, pin4 pin5, pin6, pin7, pin8, pin9, pin10, pin11, pin12,pin13, pin14, pin15, pin16, pin19, pin20,i2c, spi, uart, panic, reset, running_time, sleep, temperature」の関数などがあります。

※「microbit」モジュールを「from microbit import *」でインポートした前提で記載しています。

(09)microbit.uart

シリアルインタフェースを使用してボードに接続されたデバイスと非同期でシリアル通信を行います。
「init, any, read, readline, readinto, write, ODD, EVEN」の関数があります。
※thonny-microbitを使っているので既にシリアル通信されています。thonny-microbitとの送受信を記載しています。

(09-1)init

uart.init(baudrate=9600, bits=8, parity=None, stop=1, *, tx=None, rx=None)
uart.init(115200)で、Python のコンソールを復元できます。
baudrate は通信速度を定義します。一般的なボーレートは 9600、14400、19200、28800、38400、57600、115200です。
現在のところは bits=8 だけのサポートらしいです。
parity パラメータはNone, uart.ODD, uart.EVEN が可能です。
stopは、ストップビットの数です。現状では 1 にする必要があるそうです。
tx と rx を指定しない場合はmicro:bit の USB シリアルコンバータに接続し、UART を PC に接続するそうです。

(09-2)any()

待機データがあれば True を返し、なければ False を返します。

(09-3)read([nbytes])

バイト列を読み込みます。nbytesまで読み込みます。指定されていなければ、できるだけ多く読み込みます。
以下はbytes指定の場合の例です。(無指定の場合はuart.any()の項を参照)


from microbit import *
uart.write(b'input chara\r\n')

while True:
    if uart.any():
        s=uart.read(2)              #2bytesを読み込む
        print(s)
        #break
    sleep(1000)
実行結果
>>> %Run 0911_uart_00.py
input chara
ABCD                        
b'AB'               #読み込んだ2bytesをprint
b'CD'               #次の2bytes
b'\r\n'             #次の2bytes

(09-4)readinto()

uart.readinto(buf[, nbytes])
buf にバイト列を読み込みます。nbytes数まで読み込みます。指定数がなければ len(buf) のバイト数まで読み込みます。

myFrameの3バイトづつ読込、myFrameに格納、返り値は格納数


from microbit import *
uart.write(b'input chara\r\n')

myFrame = bytearray(3)         #myFrameに3バイトのバッファ
print(myFrame)

while True:
    if uart.any():
        s=uart.readinto(myFrame) #3バイト読み込む
        print('s=',s)
        print(myFrame)
実行結果
>>> %Run 0911_uart_02-2.py
input chara
bytearray(b'\x00\x00\x00')          #myFrameの初期の中
ABCDEFGHI                           #micro:bitに送信
s= 3                                #格納したバイト数
bytearray(b'ABC')                   #格納したデータ
s= 3
bytearray(b'DEF')
s= 3
bytearray(b'GHI')
s= 2                                #残りのバイト数
bytearray(b'\r\nI')                 #格納したデータ

(09-5)readline()

1行の改行文字まで読み込みます。バイト列に改行文字は含まれます。
thonny-micropythonでは改行文字無くても読み込みました。※やり方が悪いのでしょうか?


from microbit import *
uart.write(b'input chara\r\n')

while True:
    if uart.any():
        r=uart.readline()
        print(r)
        break
    sleep(1000)
実行結果
>>> %Run 0911_uart_00.py
input chara
abcdef
b'abcdef\r\n'

(09-6)write(buf)

バッファをバスに書き出します。バッファはバイト列か文字列です。


#!/usr/bin/env python
# -*- coding: utf-8 -*-
from microbit import *

uart.write(b'input chara\r\n')
uart.write(b'あいう\r\n')

#'あいう'.encode('utf-8)
x=b'\xe3\x81\x82\xe3\x81\x84\xe3\x81\x86'    #エンコードした’あいう'を送信
print(len(x))
z=uart.write(x+'\r\n')                       #改行文字を加えて送信
print(z)
実行結果
>>> %Run 0911_uart_00_w.py
input chara
あいう
9                       #ひらがな3bytesx3文字
あいう                   #ひらがなに戻っている
11                      #送信したbyte数

■PuTTYで接続

リモートログオンターミナルクライアントソフトのPuTTY(パティ)を使ってシリアル通信をしてみます。「SSH」「Telnet」「rlogin」にも対応しています。

Serialを選択してシリアル通信の接続先、ボーレート等をinitの項を参考にして設定します。
「open」をクリックします。

PuTTY

PuTTYのターミナルが開きます。
thonny-micropytonのshellと同じように使えます。

PuTTYのターミナル

ちなみに外枠上で右クリックをして、メニューを表示させPuTTYをresetすると以下のようになります。

PuTTYをreset


from microbit import *
uart.write(b'input chara \r\n')

while True:
    if uart.any():
        #sleep(2000)                        #PuTTY時にコメントアウト
        s=uart.read(2)                      #2bytes受信
        r=str(s)
        uart.write('microbit >> '+r+'\r\n') #受信2byteに文字付加して送信
       #break
    sleep(500)
実行結果
>>> %Run 0911_uart_00.py
input chara 
ABCDE                   #thonnyからmicro:bitへ送信
microbit >> b'AB'       #受信した2byteをmicro:bitが送信、改行されている
microbit >> b'CD'
microbit >> b'E\r'
microbit >> b'\n'

ちなみに送信データに改行コード ‘\r\n’が無いと


microbit >> b'AB'microbit >> b'CD'microbit >> b'\r\n'

改行なしで返ります。

このスクリプトをmicro:bitへmain.pyとしてアップロードします。

upload

thonnyを閉じてPuTTYを立ち上げます。
micro:bit本体の裏面のリセットボタンを押すか、PuTTYの外枠で右クリックから「Special command>Break」します。

Break

「ABCD」と打ち込みたいのですが、入力後uart.any()がTrueになるので以下のように一文字づづ返ってしまします。thonny-shellとやや動作が違います。

一文字で返る

先のスクリプトでuart.any()直下のsleep(2000)を有効にします。そうすれば1文字目から2秒間の間に打ち込まれた文字に対応するはずです。
有効にしたらmain.pyとしてmicro:bitにアップロードします。
どうにか動いているようです。もっといい方法がありそうですが・・。

時間内の文字が返る

※thonny-microbitで動作する場合にsleep(2000)を有効にするとエラーになります。

まとめ

microbitモジュールのuartについて記載しました。thonny-microbitでは既にuart接続されています。thonny-microbitを使わずにPuTTYを使ってシリアル通信の確認をしてみました。