Библиотека CMDmessenger
Я пытаюсь использовать библиотеку CMDmessanger на моем Arduino Uno и столкнулся с проблемой.
Моя проблема начинается прямо с примера ArduinoController.ino.
Когда я отправляю команду частоты
3,1;
Светодиод начинает мигать правильно, один раз в секунду.
Но когда я отправляю неправильную команду (по сути, команду без аргумента)
3;
Светодиод просто перестает мигать. Состояние светодиода зависит от того, в каком состоянии он был, когда я отправил команду.
Я понял, что когда я отправляю неправильно отформатированную команду, она принимает частоту за 0.
Есть ли какой-либо метод, с помощью которого я могу убедиться, что команда получена в правильном формате, прежде чем она будет выполнена? В идеале я был бы рад, если бы был метод узнать, сколько аргументов было получено, и я мог бы вызвать readBoolArg или другие эквивалентные функции для получения данных аргумента.
Я планирую использовать эту библиотеку для нескольких проектов и не хочу оказаться в ситуации, когда что-то пойдет не так из-за отсутствия проверки форматирования.
Заранее спасибо.
@Nitro, 👍0
1 ответ
Лучший ответ:
В примере кода используется 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);
}
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Глобальные переменные занимают много места в динамической памяти.
- Статус выхода 1 ожидаемое первичное выражение перед ']' Arduino
- Невозможно использовать библиотеку клавиатуры с Arduino UNO даже после смены прошивки.
- Ошибка: "'lcd' does not name a type" при использовании библиотеки LiquidCrystal.
- Могу ли я запретить библиотеке Stepper удерживать двигатель?
- Датчик освещенности BH1750 всегда дает выходной сигнал 54612 лк
- Arduino IRremote перестает работать