Невозможно получить последовательный порт после запуска скетча
Этот скетч должен прослушивать один символ, отправленный в последовательный порт, в качестве средства запуска и остановки сбора данных (что в этом примере имитируется путем печати некоторых значений регистров). Он реагирует на первый отправленный символ (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
@Bryan Hanson, 👍1
1 ответ
Лучший ответ:
В вашем цикле 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)
по-другому.
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Использовать все контакты как цифровые входы/выходы
- Float печатается только 2 десятичных знака после запятой
- Arduino как USB HID
- Serial1' was not declared in this scope
- Очень простая операция Arduino Uno Serial.readString()
- AT-команда не отвечает на последовательный монитор
Черт, я создал цикл внутри цикла без возможности выхода из внутреннего цикла, когда он заработал! Спасибо за вторую пару глаз! Просто почему-то этого не увидел., @Bryan Hanson
И спасибо за ссылку на нюансы блинка. На самом деле мне не нужна эта задержка, но мне нужно продолжать изучать блокировку Arduino, прерывания и т. д. Многие детали не сразу очевидны, когда вы уже изучаете много нового., @Bryan Hanson