IoT何をいまさら(25) ATコマンドパーサ、とりあえずの自作

JosephHalfmoon

数日、投稿をお休みしただけで浦島太郎状態です。何やっていたのか思い出せない。そういえば、ESP32をATコマンドで制御するために何かしようとしていたのではなかったかしら、という分けで、ATコマンドのパーサ作りから「復帰」するかと思い立ちました。しかし、Ebedのライブラリなどつらつら見るに

  • ArmコピーライトのWiFi制御の例題プログラムあり
  • それ以外のソースのAT Command Parserもあり

で、その辺を「使わせてもらって」お茶を濁せば良いのでないの、という気もしないでもないです。しかし、ま、諸般の都合あり、自作することにいたしました。

ATコマンドを受け付けるようにファームウエアを書き込んだESP32-DevKitC-32Dには、いろいろつなげてテストしようと考えておりますが、とりあえずということで、Nucleo-F401REを取り付けてESP32と通信させようと思います。取り付けたところの写真は以下です。

TXD, RXDとグランド、合計3本接続するだけですから、接続するピンさえ間違えなければ、赤子の手をひねる?ようなものです。

Nucleo-F401REに関しては、複数の開発環境が使えるようにしてきた分けなのですが、「お手軽さ」に「重き?」を置いているので、まずは

Ebed の Web開発環境で、OS2

でプロトタイプの作成作業に入りました。しかし、ボードを接続して、動かしながら思い出したのです。そういえば、

Web開発環境ではデバッグしづらいから、PC上のMSYSでプロト作る

つもりでした。しかし、初めてしまったものは止まりませぬ。とあれ、自作する方針を書き出しておきましょう。そうしないとそれすら忘れてしまうから。

  1. Nucleoだけでなく、手持ちのほとんどのボードで使えるようにすること
  2. ESP32のATコマンドセットだけでなく、「ちょい変」でシリアルで接続する各種のデバイスに流用できるようにすること

1の条件から、C言語の範囲で書く(Ebed OSならばC++で書けるが、Cベースの開発環境もあるのでCで書ける範囲に制限)、タイムアウトとか、シリアルの入出力とか、ボードやOS、ドライバに依存する部分とは切り離しておく、という2点を決めました。あくまで1バイト毎、シリアルから入ってきたものを順次よんで解釈していくことに専念し、実際の読み取りとか、読みたいけれどデータの入力がない(タイムアウト)とかは、外側の「環境依存部分」で始末する方針。

2の条件から、「パーサ」と呼びながらも、「スキャナ」と「パーサ」の2階建てに分けることにいたしました。「スキャナ」部分は、バイトの列を解釈して、必要なトークンを切り出すだけ、「パーサ」部分で、トークンを解釈して必要なデータを取り出したりする、と。ぶちゃけ、「パーサ」部分は、ESP32のATコマンドにベッタリのものを書いても、下の「スキャナ」はチョイ変でいろいろ使える筈、というのが目論見であります。

ずるずると書き始めて、Web開発環境で始めたのを悔やみ始めたころ(なんといってもデバッガ使えないので、ステートマシンのバグがなかなか抜けなかった。その代わりと言っては何ですが、TIMEOUTエラーは頻発したので、そのテストにはなった)「とりあえず版」のスキャナは動いた感じ。

上の画面は、Nucleoのデバッグ用の仮想端末のスクリーンショット。<<<NEW>>>の後、NucleoはESP32に”AT+GMR”コマンドを送りだします。ESP32は、ATコマンド自身を含めて返答をNucleo側に返してくる。Nuceloは、それを読みながらCR,LFなどは空白におき替え、空白文字の連続は1文字に圧縮して、デバッグ端末に返信をダンプ(テスト用)しているのが最初の行。最後の方のコマンド完了の

OK

を捕まえて、スキャナは一端終了し、上位に制御を移すと、上位層はタイムアウトなく戻ってきたので、>>OK.と合いの手をデバッグ端末に入れ、スキャナが内部のバッファにトークン化して保持している内容をデバッグ画面にプリント。一応、落ち漏れなく受信できとるわい、ということで、本日のところはおしまい。パーサといいつつ、スキャナで終わっている。まあ、ぼちぼち書きましょ。

IoT何をいまさら(24) TOFセンサに戻る

IoT何をいまさら(26) サーミスタで温度を測る その1 へ進む