Главная · Скиллы · esp32-serial-commands

esp32-serial-commandsсерийные команды ESP32 агент

h1d/agent-skills-esp32

Серийные команды для ESP32.

Установка

npx -y skills add h1d/agent-skills-esp32 --skill esp32-serial-commands --agent claude-code

ESP32 Serial Command Emulation

Отправка команд напрямую на последовательный порт для эмуляции нажатий кнопок и действий пользователя. Работает через USB serial. Подходит для автоматизированного тестирования, стресс-тестирования и отладки без физического взаимодействия.

Настройка ESP32 (на устройстве)

ESP-IDF Framework

#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;
        }
    }
}

// В app_main():
// xTaskCreate(serial_command_task, "serial_cmd", 2048, NULL, 5, NULL);

Arduino Framework

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");
        }
    }
}

Хост — отправка команд

# Найти последовательный порт
PORT=$(ls /dev/cu.usbmodem* /dev/ttyUSB* /dev/ttyACM* 2>/dev/null | head -1)

# Отправить команду
echo "PRESS" > "$PORT"

Типичные паттерны команд

# Простая команда
echo "PRESS" > "$PORT"

# Команда с параметром
echo "PRESS:3" > "$PORT"      # Нажать 3 раза
echo "SCREEN:2" > "$PORT"     # Перейти на экран 2
echo "MODE:debug" > "$PORT"   # Установить debug режим

Автоматизированное тестирование

Стресс-тест

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 час
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"

Советы

  • Тайминг: добавляйте задержки между командами, чтобы устройство успевало обработать
  • Обратная связь: проверяйте логи serial для подтверждения получения команды
  • Обработка ошибок: устройство должно отвечать статусом (OK/ERROR)
  • Комбинируйте с логированием: всегда мониторьте логи во время тестирования