Невозможно получить последовательный порт после запуска скетча

Этот скетч должен прослушивать один символ, отправленный в последовательный порт, в качестве средства запуска и остановки сбора данных (что в этом примере имитируется путем печати некоторых значений регистров). Он реагирует на первый отправленный символ (g), и цикл while начинает выполняться. Но он не реагирует на следующий символ s, похоже, я не могу привлечь внимание Arduino.

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

// Прослушиваем последовательный порт для получения инструкций и печати значений регистров

volatile boolean start = false;  // флаг для начала проверки регистра; Глобальный

void setup() {
  Serial.begin(9600);
  if (Serial) {
    Serial.println("Arduino listening...");
    Serial.println("Enter g or s at any time");  // g = идти, s = стоп
  }
}

void loop() {
  unsigned char data;
  if (Serial.available()) {
    data = Serial.read();
    Serial.println(data); // только для устранения неполадок
    if (data == 'g') {
      start = true;
    }
    else  if (data == 's') {
      start = false;
    }
  }
  
  while (start) {
    // распечатываем значения некоторых регистров АЦП
    Serial.print("ADMUX  register: ");
    print_bin(ADMUX);
    Serial.print("ADCSRA register: ");
    print_bin(ADCSRA);
    Serial.println(" ");
    delay(1000);
  }
}


void print_bin(byte aByte) {
  for (int8_t aBit = 7; aBit >= 0; aBit--) {
    if (aBit == 3) {
      Serial.print(" ");
    }
    Serial.print(bitRead(aByte, aBit) ? '1' : '0');
  }
  Serial.println(" ");
}

Окружающая среда: Версия: 2.3.0 Дата: 2024-02-07T13:40:21.377Z Версия CLI: 0.35.2

, 👍1


1 ответ


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

2

В вашем цикле while (start) { нет ничего, что позволило бы start стать false.

  while (start) {
    // распечатываем значения некоторых регистров АЦП
    Serial.print("ADMUX  register: ");
    print_bin(ADMUX);
    Serial.print("ADCSRA register: ");
    print_bin(ADCSRA);
    Serial.println(" ");
    delay(1000);
  }

...и ваш цикл продолжается, пока данные накапливаются во входном буфере Serial.

loop() уже является функциональным циклом. Изменение while (start) { на if (start) { кажется тем, что вам нужно.

void loop() { // <-- существующий цикл
  unsigned char data;
  if (Serial.available()) {   
    // вещи, которые могут изменить начало
  }
  
  if (start) {
    // то, что происходит, если значение start истинно
  }
}

Возможно, вы захотите посмотреть пример мигания без задержки для обработки вашего delay(1000) по-другому.

,

Черт, я создал цикл внутри цикла без возможности выхода из внутреннего цикла, когда он заработал! Спасибо за вторую пару глаз! Просто почему-то этого не увидел., @Bryan Hanson

И спасибо за ссылку на нюансы блинка. На самом деле мне не нужна эта задержка, но мне нужно продолжать изучать блокировку Arduino, прерывания и т. д. Многие детали не сразу очевидны, когда вы уже изучаете много нового., @Bryan Hanson