Отдельно от последовательного порта для digitalWrite()

Это мой текущий код (Arduino Mega 2560):

#define p1 2
#define p2 3

void setup() {
 pinMode(p1, OUTPUT);
 pinMode(p2, OUTPUT);
 Serial.println("ARDUINO : CONNECTED");
}

void loop() {
 if (Serial.available()) {
  String state = Serial.readString();
  
  if (state.startsWith("LED1ON")) {
    digitalWrite(p1, HIGH);
  }
  if (state.startsWith("LED1OFF")) {
    digitalWrite(p1, LOW);
  }
  if (state.startsWith("LED2ON")) {
    digitalWrite(p2, HIGH);
  }
  if (state.startsWith("LED2OFF")) {
    digitalWrite(p2, HIGH);
  }
  // ... и светодиод следующего состояния
 }
}

как я могу сделать, чтобы для нескольких последовательных входов использовался разделитель(";")? например: LED1ON;LED2OFF

ожидаемое: однократная команда (LED1ON;LED2OFF) множество условий (светодиод включается, светодиод 2 выключается)

пожалуйста, спасибо

, 👍1

Обсуждение

Это похоже на домашнее задание, а цель домашнего задания — научиться анализировать. Символом разграничения является точка с запятой. Это верно?, @st2000

да, братан, используя разделитель; для команды множественного условия. Помоги мне, @Ganang Wahyu W


3 ответа


0

Рассмотрите возможность рефакторинга вашего кода таким образом, чтобы вы читали строки, а затем выполняли поиск по символам строки, копируя каждый символ в новую строку, пока не найдете точку с запятой. В этом случае не копируйте точку с запятой. Вместо этого выполните существующий оператор "if" операторы включения/выключения светодиодов в зависимости от содержимого новой строки. Когда закончите, сотрите новую строку, вернитесь назад и продолжайте копировать символы в новую строку до следующей точки с запятой. Если данных для копирования больше нет, читайте дополнительные данные, пока данные не станут недоступны.

,

В C++ существует более быстрый способ анализа строки на основе заданного разграничивающего символа. Но это отвлекает вас от того, что происходит на самом деле. Вероятно, это то, что изложено в этом ответе., @st2000


2

Возможно, вам захочется посетить справку по библиотеке Arduino, чтобы узнать, что возможно и как ее использовать. .

В вашем случае вас интересует метод readStringUntil() .

Чтение, понимание, экспериментирование, отладка и завершение оставляются пользователю в качестве упражнения.

,

0

readString читает из Serial, пока не истечет время ожидания. Это означает, что он может не дойти или выйти за пределы как конца строки (если он есть), так и точки с запятой.

Я предлагаю читать в буфер char (скажем, длиной 30 байт) до тех пор, пока не будет достигнута новая строка или точка с запятой. Затем завершите буфер с помощью 0x00 (чтобы сделать его правильной строкой «C»), а затем выполните простое сравнение строк (strcmp).

,