前回、serial-outノードを使ってNode-REDからシリアルポート(UART)へデータを送出してみましたが、in/out の共存はなんだかよろしくなかったです。今回は、シリアル相手に「いってこい」してくれるserial-requestノードを使ってみます。これがなかなか具合がいいです。そして in/outとの共存もOKみたい。大丈夫か?
※「ブロックを積みながら」投稿順 index はこちら
※動作確認にはRaspberry Pi 3 model B+のRaspberry Pi OS(32bit)上にインストールした以下を使用しています。
-
- Node-RED v2.0.5
- node-red-dashboard 3.2.0
Serial Requestノード
Serial Requestノードは、入力されたmsgのpayloadを指定のシリアルポートで送信したのち、所定の期間(デフォルトは10秒みたいっす)シリアルポートからレスポンスが返ってくるのを待ちます。レスポンスが返ってきたらそれをpayloadに載せて下流に出力します。その際、元の入力メッセージをrequest_payloadというプロパティに載せてくれるので下流のノードはrequestとそのレスポンスを同時に受け取れる、という塩梅です。
気になるのは serial-in、serial-out ノードとの共存なのですが、今回実験してみた範囲では大丈夫みたいです。Serail RequestノードがFIFOを作ってくれるおかげか?
実験に使用したフロー(単独)
まずは、前回使用した serial-inとserial-outのフローを「無効」にしておいて、以下のserial request単独フローのみを有効としておきます。
-
- 左からInjectノード、”TEST msg”というテスト用文字列を送出
- 真ん中 serial requestノード、/dev/ttyS0(UART)に接続、入力msgをUARTで送信、UARTの受信内容を出力msgに載せて送出
- 右、Debugノード、serial requetの出力msgをデバッグウインドウに表示
であります。
肝心の serial requestの設定ですが、以下のように設定は多くありません。前回から使用している serial port ノードを指定するだけです。このノードの設定は前回と同じです。後で設定内容を示します。
serial requestノードにはタイムアウトなど設定可能なパラメータがいくつかあります。それらは以下の設定画面で全体に対して一律設定をするのではなく、msg内にプロパティという形で持たせて、msg毎個別に指定するようになってました。
Injectノードのボタンを押してフローを起動すると、対向機としてUARTの先に接続してあるラズパイ4のminicomには以下のようにTEST msgが伝わってきました。そこで慌てて(タイムアウトは10秒なので)「Helloリターン」と手で打ち込みます。ローカルエコーはONにしてなかったので、画面上には表示されないです。
すると、NodeREDのデバッグウインドウには以下のような msg が流れてきました。request_payloadが”TEST msg”で、payloadが”hello”、portは”/dev/ttyS0″だと。ちゃんと往復したみたいです。
単独での serial request 動作はOKっと。
Serial IN/OUTと同時使用のフローと挙動
続いて、前々回、前回と使用した serial out, serial in のフローを有効に戻してみます。全貌が以下に。
ここで不思議なのは、真ん中の serial in ノードが「未接続」と表示されていることです。しかし、動作させてみると期待通りに動きます。挙動を観察すると serial requestノードが作るFIFOに「寄生」して動いているみたい。それで serial requestと共存できるし、「未接続」表示になるのではないかと。知らんけど。
さて、serial in、serial out、serial requestの3つのノードが同じ serial-portノードを参照してます。その様子が以下に。最下行の黄色のマーカ部分をご覧ください。
さて、この状態で、 serial requestに TEST msg を送り出した場合が以下に。
Serial requsetノードに返ってきたものと同じ msg が 同一時刻に serial in ノードにも入力されていることがわかります。
一方的に対向機から何か送信されてきた場合は、serial requestノードが反応することはなく、serial inノードだけに結果が送られてきます。
また、単独の serial outノードで出力した場合、ちゃんと対向機に伝送されてました。勿論、serial requestノードは、反応することはありません。
serial requestノード、いい感じで「いってこい」?