mcpField
E
esp32-serial-commands

esp32-serial-commands

github.com/h1dテスト・品質11279 回インストール40 週間前に更新
リポジトリ

esp32-serial-commands について

USBシリアル経由でESP32にコマンドを送り、ボタン操作などを再現するスキルです。パラメーター付きコマンドや、ログを確認しながらの反復テストに対応します。

主な機能

  1. 01USBシリアル経由のコマンド送信
  2. 02ボタン操作やユーザー操作の再現
  3. 03パラメーター付きコマンド
  4. 04ストレステストと安定性テスト
  5. 05ログでデバイスの応答を確認

活用シーン

  1. 01ボタンコマンドの自動反復送信
  2. 02長時間の安定性テスト
  3. 03ログによるコマンド処理の検証

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/h1d/agent-skills-esp32 --skill esp32-serial-commands

インストール後、Claude Code で/esp32-serial-commandsを入力して読み込まれたか確認します。

詳細

ESP32 シリアルコマンドエミュレーション

概要

シリアルポートにコマンドを直接送信して、ボタンの押下やユーザー操作をエミュレートします。USB シリアル経由で動作します。

ESP32 のセットアップ(デバイス側)

ESP-IDF フレームワーク
#include "esp_log.h"
#include <string.h>

static const char* TAG = "SerialCmd";

void serial_command_task(void* arg) {
    char buf[64];
    int idx = 0;

    while (1) {
        int c = getchar();
        if (c == EOF) {
            vTaskDelay(pdMS_TO_TICKS(10));
            continue;
        }

        if (c == '\n' || c == '\r') {
            buf[idx] = '\0';
            if (idx > 0) {
                ESP_LOGI(TAG, "Command: %s", buf);

                if (strcmp(buf, "PRESS") == 0) {
                    button_callback();
                } else if (strncmp(buf, "SCREEN:", 7) == 0) {
                    int screen = atoi(buf + 7);
                    go_to_screen(screen);
                }
            }
            idx = 0;
        } else if (idx < sizeof(buf) - 1) {
            buf[idx++] = c;
        }
    }
}

// In app_main():
// xTaskCreate(serial_command_task, "serial_cmd", 2048, NULL, 5, NULL);
Arduino フレームワーク
void setup() {
    Serial.begin(115200);
}

void loop() {
    if (Serial.available()) {
        String cmd = Serial.readStringUntil('\n');
        cmd.trim();

        Serial.printf("Command: %s\n", cmd.c_str());

        if (cmd == "PRESS") {
            button_callback();
        } else if (cmd.startsWith("SCREEN:")) {
            int screen = cmd.substring(7).toInt();
            go_to_screen(screen);
        } else if (cmd == "STATUS") {
            Serial.println("OK");
        }
    }
}

ホスト側 - コマンドの送信

# Find serial port
PORT=$(ls /dev/cu.usbmodem* /dev/ttyUSB* /dev/ttyACM* 2>/dev/null | head -1)

# Send a command
echo "PRESS" > "$PORT"

よく使うコマンドパターン

# Simple command
echo "PRESS" > "$PORT"

# Command with parameter
echo "PRESS:3" > "$PORT"      # Press 3 times
echo "SCREEN:2" > "$PORT"     # Go to screen 2
echo "MODE:debug" > "$PORT"   # Set debug mode

自動テスト

ストレステスト
PORT=$(ls /dev/cu.usbmodem* /dev/ttyUSB* 2>/dev/null | head -1)
for i in {1..100}; do
  echo "PRESS" > "$PORT"
  echo "Sent press $i"
  sleep 2
done
長時間安定性テスト
PORT=$(ls /dev/cu.usbmodem* /dev/ttyUSB* 2>/dev/null | head -1)
END=$(($(date +%s) + 3600))  # 1 hour
count=0

while [ $(date +%s) -lt $END ]; do
  count=$((count + 1))
  echo "PRESS" > "$PORT"
  echo "[$(date +%H:%M:%S)] Press $count"
  sleep 30
done

echo "Total: $count presses"
ログ監視によるテスト

ターミナル 1 - ログの監視:

tail -f /tmp/device.log

ターミナル 2 - コマンドの送信:

PORT=$(ls /dev/cu.usbmodem* /dev/ttyUSB* 2>/dev/null | head -1)
echo "PRESS" > "$PORT"

ヒント

  • タイミング:デバイスが処理できるよう、コマンドの間に遅延を入れます
  • フィードバック:コマンドが受信されたことを確認するため、シリアルログを確認します
  • エラー処理:デバイスからステータス(OK/ERROR)がエコーバックされるようにします
  • ロギングとの併用:テスト中は常にログを監視します

コメント