Как остановить цикл в последовательном мониторе?

Я хочу создать последовательную программу с вводом данных из последовательного монитора и показать каждый символ с его двоичным кодом и кодом ASCII.

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

Вот моя программа:

String dataST;

void setup() {
  Serial.begin(9600);
  Serial.println("Message sent by serial monitor : ");
}

void loop() {
  for (int i = 0; i < 400 ; i++) {
    if (Serial.available()) {
      char dataOK = Serial.read();
      dataST += dataOK;
      Serial.print(dataOK);
      Serial.print(" = ");
      delay(200);
      for (int i = 7; i >= 0; i--) {
        byte bytes = bitRead(dataOK, i);
        Serial.print(bytes, BIN);
      }
      Serial.print(" = ");
      int dataAS = dataOK;
      Serial.print(dataAS);
      Serial.println(" ");
      Serial.println(" ");
    }
  }
  Serial.println("Message : ");
  Serial.print(dataST);
  dataST = "";
}

Результат приведенной выше программы:

Message sent by serial monitor :
Message :
Message :
Message :

И результат, который мне нужен:

Message sent by serial monitor:
H = 01001000 = 72 

e = 01100101 = 101 

y = 01111001 = 121 

Message :
Hey

Пожалуйста, помогите мне.

, 👍0


2 ответа


1

Пожалуйста, ознакомьтесь с документацией по SerialEvent.

Возможно, это именно то, что вы ищете (после нескольких небольших изменений)

Код из примера:

/*
Пример последовательного события

Когда поступают новые последовательные данные, этот скетч добавляет их в строку.
Когда получена новая строка, цикл печатает строку и очищает ее.

Хорошим тестом для этого является использование GPS-приемника, который отправляет
Предложения NMEA 0183.

ПРИМЕЧАНИЕ. Функция serialEvent() недоступна на устройствах Leonardo, Micro и
другие платы на базе ATmega32U4.

создано 9 мая 2011 г.
Том Айгоу

Этот пример кода находится в общественном достоянии.

http://www.arduino.cc/en/Tutorial/SerialEvent
*/

String inputString = "";         // строка для хранения входящих данных
bool stringComplete = false;  // завершена ли строка

void setup() {
  // инициализируем сериал:
  Serial.begin(9600);
  // резервируем 200 байт для inputString:
  inputString.reserve(200);
}

void loop() {
  // вывести строку при появлении новой строки:
  if (stringComplete) {
    Serial.println(inputString);
    // очистить строку:
    inputString = "";
    stringComplete = false;
  }
}

/*
  SerialEvent occurs whenever a new data comes in the hardware serial RX. This
  routine is run between each time loop() runs, so using delay inside loop can
  delay response. Multiple bytes of data may be available.
*/
void serialEvent() {
  while (Serial.available()) {
    // получаем новый байт:
    char inChar = (char)Serial.read();
    // добавляем его в inputString:
    inputString += inChar;
    // если входящий символ является новой строкой, установите флаг, чтобы основной цикл мог
    // сделать что-нибудь с этим:
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}
,

0

Встроенная система никогда не должна останавливаться. Если/когда ваша функция loop() завершится (возвратится), она будет немедленно вызвана снова.

Если вам нужен процесс, который доходит до некоторого состояния завершения, а затем останавливается, вам лучше оставить loop() пустым и написать собственную функцию, которая делает то, что вам нужно. и вызовите его в конце setup().

Вы можете поместить бесконечный цикл в конец своей функции:

for(;;);

это один из способов сделать это, или просто дайте ему вернуться к setup(). Затем setup() завершится, будет вызвана ваша пустая функция loop() (бесконечно), которая выполняет то же самое.

,

Или [спать](https://www.arduino.cc/reference/en/libraries/arduino-low-power/lowpower.sleep/) (большую часть времени)?, @Peter Mortensen