前回のESP8266のUARTの記事で、ESP8266からRaspberry Piに対してUARTでデータを送信してみた。

Raspberry Piでは任意のデータを受け取れたが、合わせてREPLに関する値も含まれていた。


REPL周りは置いといて、今回はESP8266を受信側にして試してみる。


ESP8266(NodeMCU)のコードを下記のように変更してみる。

※前回のコードから変更する場合、ファームウェアの再インストールが必要になるかもしれないので、その時はNodeMCUにファームウェアをインストールするの記事を参考にして再インストールを行う。

main.py

import machine
import time

uart = machine.UART(0)                         # init with given baudrate
uart.init(9600, timeout=3000) # init with given parameters

while True:
    # データを受け取った時
    if uart.any() > 0:
        msg = uart.readline()
        # 値の確認
        if msg is not None:
            raspberry piから受け取った値を少し変更して送り返す
            msg = str(msg.decode('utf-8'))
            msg = 'received:' + msg
            # 下記のコードはエンコードすると受信側でエラーになるのでエンコードしないで送信
            uart.write(msg)
            time.sleep(1)

上記のコードで注意する点はuart.any()で、BBC Micro:bitの方のMicroPythonにもuart.any()があったが、こちらの返り値がbooleanに対して、ESP8266の方の返り値が0 or 1となっている。




続いて、Raspberry Piの方のコードを作成する。

/path/to/dir/uart_pi_srv.py

import serial
import time

ser = serial.Serial('/dev/ttyS0', 9600, timeout=3)

print("uart:receiver")

try:
    while True:
        msg = "send from pi."
        ser.write(msg.encode())
        
        msgFromEsp8266 = ser.readline()            
        print(msgFromEsp8266.decode('UTF-8'))
        time.sleep(1)
except KeyboardInterrupt:
    print(' Ctrl+C was pressed')

finally:
    if ser.is_open:
        ser.close()
        print(' Serial connection was closed') 

上記のコードはsend from pi.というメッセージを何度も送信というもの。


Raspberry Pi側で端末を立ち上げ、下記のコードを実行してスタンバイしておく。

$ python3 /path/to/dir/uart_pi_srv.py
uart:receiver

ESP8266(NodeMCU)のUSBをコンセントに繋いだ後に、Raspberry Piの方の端末を確認してみると、

$ python3 /path/to/dir/uart_pi_srv.py
uart:receiver
received:send from pi.

となった。


ESP8266のUARTを受信側にすると、返ってくるデータはREPLではなくなるようだ。