Библиотека CMDmessenger

Я пытаюсь использовать библиотеку CMDmessanger на моем Arduino Uno и столкнулся с проблемой.

Моя проблема начинается прямо с примера ArduinoController.ino.

Когда я отправляю команду частоты

3,1;

Светодиод начинает мигать правильно, один раз в секунду.

Но когда я отправляю неправильную команду (по сути, команду без аргумента)

3;

Светодиод просто перестает мигать. Состояние светодиода зависит от того, в каком состоянии он был, когда я отправил команду.

Я понял, что когда я отправляю неправильно отформатированную команду, она принимает частоту за 0.

Есть ли какой-либо метод, с помощью которого я могу убедиться, что команда получена в правильном формате, прежде чем она будет выполнена? В идеале я был бы рад, если бы был метод узнать, сколько аргументов было получено, и я мог бы вызвать readBoolArg или другие эквивалентные функции для получения данных аргумента.

Я планирую использовать эту библиотеку для нескольких проектов и не хочу оказаться в ситуации, когда что-то пойдет не так из-за отсутствия проверки форматирования.

Заранее спасибо.

, 👍0


1 ответ


Лучший ответ:

2

В примере кода используется cmdMessenger.readFloatArg(); (источник) для чтения аргумента.

void OnSetLedFrequency()
{
  // Считать аргумент состояния светодиода, интерпретировать строку как логическое значение
  ledFrequency = cmdMessenger.readFloatArg();
  // Убедитесь, что частота не равна нулю (чтобы предотвратить деление на ноль)
  if (ledFrequency < 0.001) { ledFrequency = 0.001; }
  // перевести частоту во время включения и выключения в миллисекундах
  intervalOn  = (500.0/ledFrequency);
  intervalOff = (1000.0/ledFrequency);
  cmdMessenger.sendCmd(kAcknowledge,ledFrequency);
}

Эта функция установит ArgOk в false, если следующего аргумента не было.

float CmdMessenger::readFloatArg()
{
    if (next()) {
        dumped = true;
        ArgOk = true;
        //return atof(current);
        return strtod(current, NULL);
    }
    ArgOk = false;
    return 0;
}

Таким образом, вам следует попытаться использовать публичную функцию

bool isArgOk();

/**
 * Возвращает, если последний аргумент правильно сформирован.
 */
bool CmdMessenger::isArgOk()
{
    return ArgOk;
}

объекта CmdMessenger (который вернет ArgOk) для проверки того, был ли аргумент чтения в порядке. Вы можете, например, изменить код следующим образом

void OnSetLedFrequency()
{
  // Считать аргумент состояния светодиода, интерпретировать строку как логическое значение
  ledFrequency = cmdMessenger.readFloatArg();

  //Мы просто прочитали ерунду, потому что аргумента не было?
  if(!cmdMessenger.isArgOk()) {
      //Использование Serial может быть плохой идеей, поскольку cmdMessanger работает с тем же потоком Serial... но вы поняли идею.
      Serial.println("You didn't supply a correct argument! Error.");
      return; //до свидания
  }

  // Убедитесь, что частота не равна нулю (чтобы предотвратить деление на ноль)
  if (ledFrequency < 0.001) { ledFrequency = 0.001; }
  // перевести частоту во время включения и выключения в миллисекундах
  intervalOn  = (500.0/ledFrequency);
  intervalOff = (1000.0/ledFrequency);
  cmdMessenger.sendCmd(kAcknowledge,ledFrequency);
}
,