Nano Hash - криптовалюты, майнинг, программирование

Проблемы сравнения строк Arduino

У меня проблема со сравнением строк в моей программе. Я получаю последовательные данные и сохраняю их в строку:

void serialEvent() {
    if(!stringComplete){
         while (Serial.available()) {
              // get the new byte:
              char inChar = (char)Serial.read();
              // add it to the inputString:
              inputString += inChar;
              // if the incoming character is a newline, set a flag
              // so the main loop can do something about it:
              if (inChar == '\n') {
              stringComplete = true;
              Serial.println("COMPLETE");

 }

Затем я сравниваю строку, которая была сохранена из функции serialEvent:

void setCMD(String a){
         if(a == "01*00"){
             busACTIVE=0;
             // clear the string:
             inputString = "";
             stringComplete = false;
             }
         else if(a.equals("01*01")){
              busACTIVE=1;
             // clear the string:
             inputString = "";
             stringComplete = false;

} У меня есть несколько операторов else if и оператор else в конце:

else{
    Serial.println("Command not Found");
    Serial.println(a);
   // clear the string:
    inputString = "";
    stringComplete = false;
    }

Я пробовал оба оператора == и equals(), и ни один из них не будет правильно сравниваться. ниже приведен последовательный вывод: последовательный вывод

Как видите, один из моих операторов сравнения ищет 01*01, и это также то, что вы видите в окне последовательного вывода, но оператор if не соответствует истине. Может ли кто-нибудь помочь понять, почему это не работает. Спасибо


  • Забыл добавить, что String a в функции setCMD вызывается в основном цикле как setCMD(inputString); 04.11.2015
  • Вы добавляете '\n' к inputString, поэтому тест не проходит 04.11.2015

Ответы:


1

Попробуйте отредактировать это:

inputString += inChar;
// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
if (inChar == '\n') {
    stringComplete = true;
    Serial.println("COMPLETE");
}

в это:

// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
if (inChar == '\n') {
    stringComplete = true;
    Serial.println("COMPLETE");
}
else
    inputString += inChar;

Причина в том, что если вы сравниваете "01*00" с "01*00\n" и, конечно же, сравнение не удается.

В любом случае я бы избегал использования буферов переменного размера. Я определенно предпочитаю использовать буферы фиксированного размера из соображений производительности. А еще потому, что микроконтроллеры... микро! Не тратьте их скудные ресурсы на mallocs и frees...

04.11.2015
  • Я пытался вас отредактировать, но это не сработало. Я добавил \n в строку сравнения, и это сработало. Также спасибо за ваши предложения. Я не новичок в программировании, поэтому я ценю советы, которые вы добавили. 05.11.2015
  • Вы также удалили строку inputString += inChar;, как я? Потому что это единственная возможная ошибка ;) 05.11.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..