ESP-IDFを使ってみる

コンソールコンポーネント


ESP-IDFは、シリアルポート上で対話型コンソールを開発するために必要な構成要素を含むコンソールコンポーネントを提供しています。
コンソールコンポーネントを使うと、コマンドラインのパースや、コマンドに応じた関数の実行、
ヘルプの表示、TABキーによるauto-completeなどが簡単に実装できてしまいます。

コンソールコンポーネントの詳細はこ ちらにありますが、動作を確認するためのサンプルがこ ちらで提供されています。


例えばnvs_setコマンドを実行する場合、コマンドを入力すると必要な引数を自動的表示してくれます。






コンソールコンポーネントはコマンドヒストリーをサポートしていて、上矢印キーで過去のコマンドを呼び出すことができますが、
メモリ上に覚えているので、プログラムを終了すると、全てクリアされてしまいます。

maneuconfigのExample Configurationで「Store command history in flash」を有効にすると、
SPIFFS上のファイル(/data/history.txt)にコマンドを覚えるので、
プログラムを再起動しても、昔のコマンドヒストリーが上矢印キーで表示されます。

少し前のバージョンでは「Store command history in flash」はデフォルトで無効となっていましたが、
最新バージョンではデフォルトで有効に変わっています。

ESP-IDFに付属する対話型のサンプルコードではコンソールコンポーネントが多用されています。



ESP32Cシリーズの中には、UART-USB変換チップを省略して、GPIO18とGPIO19をUSBとして使う
USB Serial/JTAG Controller Console機能が使われている製品が有ります。
USB Serial/JTAG Controller Console機能のUSBポートを使う場合、以下を変更する必要が有ります。
これを変更しないと、コンソールコンポーネントが使えません。
menuconfigでconsole outputの定義をUSB Serial/JTAG Controllerに変更すると、stdin/stdoutがUART0→USB Serialポートに切り替わります。


また、ESP32Sシリーズの中には、USBポートが2つあって、1つはUART-USB変換チップが提供するUSB、
1つはUSB Serial/JTAG Controller Console機能を使ったUSBの製品が有ります。
これも、USB Serial/JTAG Controller Console機能を使ったUSBポートを使う場合は、上の定義を有効にする必要が有ります。
つまり、使用するUSBポートによりコンソールコンポーネントが使えるかどうかが変わり、非常に混乱します。

さらに、fgetc()、getchar()、getc()など標準入力からの入力関数や、printf()など標準出力への出力関数も、
USB Serial/JTAG Controller Console機能を使ったUSBポートでは、デフォルトでは使えません。
USB Serial/JTAG Controller Console機能を使ったUSBポートでは、これらの入出力関数は以下の様なエラーとなります。
これも、menuconfigでconsole outputの定義を変更することで使えるようになります。
Writing to serial is timing out.
Please make sure that your application supports an interactive console and that you have picked the correct console for serial communication.

逆に言えば、USBポートが2つある製品で、以下のコードが動けばUART-USB変換チップが提供するUSBポート、
動かなければUSB Serial/JTAG Controller Console機能が提供するUSBポートです。
#include <stdio.h>
#include <unistd.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

void app_main()
{
    while (1) {
        int c = fgetc(stdin);
        if (c != 0xffffffff) printf("fgetc c=%x\n", c);
        vTaskDelay(1);
    }
}

USB Serial/JTAG Controller Consoleの機能は、UART0の入出力をUSBポートの入出力に置き換えるもので、
シリアルポートを追加するものではありません。

続く...