Разбор входящей строки (команда из двух параметров), парсинг Serial

Тема в разделе "Микроконтроллеры AVR", создана пользователем Tomasina, 27 авг 2017.

Метки:
  1. Tomasina

    Tomasina Иномирянин

    Добавляю возможность изменять параметры программы из консоли Serial, путем ввода двух команд, по примеру: набрали "FAN 48" - вентилятор сменил обороты, набрали "BAUD 9600" - скорость обмена по RS-485 изменилась на 9600 и т.п.
    Код (C++):
    void serialEvent()  // функция с таким именем системная, вызывается автоматически как только в Serial приходят данные, т.е. в loop() ее прописывать не нужно. Не работает в Esplora, Leonardo, Micro
    {
    #define DELIMITER " ,.-"              // символы, возможные в качестве разделителя
      const byte bufLen = 32;             // ограничение длины входящего сообщения
      char buffer[bufLen];
      byte i = 0;                         // длина введенной строки
      delay(32);                          // ожидаем приема всей строки
      if (Serial.available() < 5) return; // отсеивает короткие сообщения
      while (Serial.available() && i < bufLen - 1) buffer[i++] = Serial.read();  //загоняем прочитанное в буфер
      buffer[i] = '\0';                                                          //закрываем массив
    // разбиваем строку на подстроки по разделителю
        char *p = buffer;
        char *cmd = strtok_r(p, DELIMITER, &p);           // первая подстрока - команда
        unsigned long value = strtok_r(p, DELIMITER, &p); // первая подстрока - значение
    // Входящая строка корректно разделяется на команду и значение, для проверки:
        Serial.printf("cmd: |%s|\n", cmd);
        Serial.printf("value: %s\n", value);
        if (*cmd == "FAN") // <-- это не работает
        {
     
    Почему не выполняется сравнение if (cmd == "FAN")?
     
  2. rkit

    rkit Гуру

    Потому что вы сравниваете указатели, а не символы. Есть функция strcmp для этого.
     
  3. sslobodyan

    sslobodyan Гик

    Делал подобные "консоли". Здорово помогает в отладке сложных систем. Главное - получать одно слово из потока. Затем передавать это слово в обработчик. А методы обработчика уже сами тянут следующее слово как параметр (кому надо). Таким образом, команды могли быть одно- двух-, трех- и более словными. Доходил до того, что записывал все команды на бумажке - не мог все запомнить :)
     
    Tomasina нравится это.
  4. Tomasina

    Tomasina Иномирянин

    Я вместо бумажки добавил ещё одну команду "-help" ;)