Случаи оператора Switch не выполняются
Обзор: Я пытаюсь использовать оператор switch для запуска разных тестов. Главное меню отображается на последовательном мониторе, а затем пользователю предоставляется возможность ввести свой выбор меню в последовательном мониторе. Выбор меню, введенный в последовательный монитор, должен впоследствии запускать соответствующий оператор case.
Проблемы: 1. Когда я ввожу выбор, оператор case для этого выбора не запускается. 2. Когда я ввожу выбор, мой последовательный монитор прокручивает мое меню 3 раза, отображая 49, затем 13, затем 10.
Вопросы:
- Почему операторы case не выполняются?
Почему серийный монитор прокручивается три раза, отображая эти случайные числа?
//////////////ДИРЕКТИВЫ ПРЕПРОЦЕССОРА///////// #include <Wire.h> /////////////ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ///////////////// int ADDRESS_SLAVE = 0x08; int ADDRESS_VERSION = 0x00; int ADDRESS_STATUS = 0x01; int ADDRESS_ENABLE = 0x02; int ADDRESS_CONFIG = 0x03; int ADDRESS_RESTART = 0x04; int ADDRESS_STARTUP_STATE = 0X05; int ADDRESS_COMPENDISREG1 = 0X07; int ADDRESS_COMPENDISREG2 = 0X08; int ADDRESS_COMPENDISREG3 = 0X09; int ADDRESS_COMPENDISREG4 = 0X0A; int ADDRESS_FAULT = 0X0B; int ADDRESS_FAULTMASK = 0X0C; int ADDRESS_TEST_MODE = 0X0D; ////////////УСЛОВИЯ НАСТРОЙКИ////////////////// void setup() { Wire.setClock(100000); Wire.beginTransmission(byte(ADDRESS_SLAVE)); Serial.begin(9600); } ////////////ОСНОВНАЯ ФУНКЦИЯ/////////////////// void loop() { int choice = 0; int const //Часы 100 CLOCK_FREQ_P = 101, CLOCK_FREQ_DIV4 = 102, CLOCK_FREQ_DIV8 = 103, CLOCK_FREQ_DIV16 = 104, CLOCK_FREQ_DIV32 = 105, CLOCK_INT_SUPPLY_IBIAS = 106, CLK_OK = 107, // Ширина запрещенной зоны 200 BG_2p5V = 200, BG_MAX_LOAD = 201, BG_VBE = 202, BG_VP = 203, BG_VGATE = 204, mainMenu(); choice = menuChoice(); switch(choice) { case CLOCK_FREQ_P : { Serial.println(F("CLOCK_FREQ_P Not yet built out")); while(Serial.available() > 0) { int choice = Serial.read(); } delay(10000); } break; case CLOCK_FREQ_DIV4: { Serial.println(F("CLOCK_FREQ_DIV4 Not yet built out")); } break; case CLOCK_FREQ_DIV8: { Serial.println(F("FREQ_DIV8 Not yet built out")); } break; case CLOCK_FREQ_DIV16: { Serial.println(F("CLOCK_FREQ_DIV16 Not yet built out")); } break; case CLOCK_FREQ_DIV32: { Serial.println(F("CLOCK_FREQ_DIV32 Not yet built out")); } break; case CLOCK_INT_SUPPLY_IBIAS: { Serial.println(F("CLOCK_INT_SUPPLY_IBIAS Not yet built out")); } break; case CLK_OK: { Serial.println(F("CLK_OK Not yet built out")); } break; case BG_2p5V: { Serial.println(F("BG_2p5V Not yet built out")); } break; case BG_MAX_LOAD: { Serial.println(F("BG_MAX_LOAD Not yet built out")); } break; case BG_VBE: { Serial.println(F("BG_VBE Not yet built out")); } break; case BG_VP: { Serial.println(F("BG_VP Not yet built out")); } break; case BG_VGATE: { Serial.println(F("BG_VGATE Not yet built out")); } break; delay(500); } ////////////////ФУНКЦИИ/////ФУНКЦИИ/////ФУНКЦИИ/////ФУНКЦИИ//////////////// //////////// //************************************************ //** Функция: отображение главного меню //** Проходит: ничего //** Возвращает: ничего //************************************************ void mainMenu() { //Выводит главное меню на серийный монитор Serial.println(); Serial.println(F("\t\t\t\t\t\t\t\t\t\t ******************************")); Serial.println(F("\t\t\t\t\t\t\t\t\t\t ******************************")); Serial.println(F("\t\t\t\t\t\t\t\t\t\t ** MAIN MENU **")); Serial.println(F("\t\t\t\t\t\t\t\t\t\t ******************************")); Serial.println(F("\t\t\t\t\t\t\t\t\t\t ******************************")); Serial.println(); Serial.println(F("\t\t\t\t\t\t ********************************************************************************************************************")); Serial.println(F("\t\t\t\t\t\t ** Please type in the number of the test you want to run in the command line window at the top of the screen. **")); Serial.println(F("\t\t\t\t\t\t ********************************************************************************************************************")); Serial.println(); Serial.println(); // ******************* // *** ВЕРХНЕЕ МЕНЮ *** // ******************* Serial.print(F("\t\t\t CLOCKGEN \t\t\t\t BANDGAP \t\t\t GPIO ")); Serial.println(); Serial.print(F("\t\t\t (1) CLK_FREQ_P \t\t\t (8) BG_2p5V \t\t\t (13) GPIO0_PD \t (21) GP1_N_Buff \t (29) GP2_Buff_Max \t ")); Serial.println(); Serial.print(F("\t\t\t (2) CLK_FREQ_Div_4 \t\t\t (9) BG_MAX_LOAD \t\t (14) GPIO0_PU \t (22) GP1_W_Buff \t (30) GP2_Buff_Min ")); Serial.println(); Serial.print(F("\t\t\t (3) CLK_FREQ_Div_8 \t\t\t (10) BG_VBE \t\t\t (15) GP0_N_Buff \t (23) GP1_Buff_Max \t (31) GPIO3_PD ") ); Serial.println(); Serial.print(F("\t\t\t (4) CLK_FREQ_Div_16 \t\t\t (11) BG_VP \t\t\t (16) GP0_W_Buff \t (24) GP1_Buff_Min \t (32) GPIO3_PU ")); Serial.println(); Serial.print(F("\t\t\t (5) CLK_FREQ_Div_32 \t\t\t (12) BG_VGATE \t\t (17) GP0_Buff_Max \t (25) GPIO2_PD \t\t (33) GP3_N_BUFF ")); Serial.println(); Serial.print(F("\t\t\t (6) CLK_INT_Supply_(IBias)\t\t\t\t\t\t (18) GP0_Buff_Min \t (26) GPIO2_PU \t\t (34) GPIO3_W_BUFF ")); Serial.println(); Serial.print(F("\t\t\t (7) CLK_OK \t\t\t\t\t\t\t\t (19) GPIO1_PD \t (27) GP2_N_Buff \t (35) GP3_BUFF_Max ")); Serial.println(); Serial.print(F("\t\t\t\t\t\t\t\t\t\t\t\t (20) GPIO1_PU \t (28) GP2_W_Buff \t (36) GP3_BUFF_Min ")); Serial.println(); Serial.println(); // ********************** // *** ЦЕНТРАЛЬНОЕ МЕНЮ *** // ********************** Serial.print(F("\t\t\t VBUS COMPARITOR \t\t\t\t\t\t\t VAC COMPARITOR \t\t ISNS COMPARITOR \t\t TSNS COMPARITOR")); Serial.println(); Serial.print(F("\t\t\t (37) CLK_FREQ_P \t(47) BG_2p5V \t(57) GPIO0_PD \t\t\t (61) GP1_N_Buff \t\t (68) GP2_Buff_Max \t\t (74) VB 2.715V Comparitor Test")); Serial.println(); Serial.print(F("\t\t\t (38) CLK_FREQ_P \t(48) BG_2p5V \t(58) GPIO0_PD \t\t\t (62) GP1_N_Buff \t\t (69) GP2_Buff_Max \t\t (75) VB 2.715V Comparitor Test")); Serial.println(); Serial.print(F("\t\t\t (39) CLK_FREQ_P \t(49) BG_2p5V \t(59) GPIO0_PD \t\t\t (63) GP1_N_Buff \t\t (70) GP2_Buff_Max \t\t (76) VB 2.715V Comparitor Test")); Serial.println(); Serial.print(F("\t\t\t (40) CLK_FREQ_P \t(50) BG_2p5V \t(60) GPIO0_PD \t\t\t (64) GP1_N_Buff \t\t (71) GP2_Buff_Max \t\t (77) VB 2.715V Comparitor Test")); Serial.println(); Serial.print(F("\t\t\t (41) CLK_FREQ_P \t(51) BG_2p5V \t\t\t\t\t (65) GPIO0_PD \t\t (72) GP1_N_Buff \t\t\t\t")); Serial.println(); Serial.print(F("\t\t\t (42) CLK_FREQ_P \t(52) BG_2p5V \t\t\t\t\t (66) GPIO0_PD \t\t (73) GP1_N_Buff \t\t\t\t")); Serial.println(); Serial.print(F("\t\t\t (43) CLK_FREQ_P \t(53) BG_2p5V \t\t\t\t\t (67) GPIO0_PD \t\t\t\t\t")); Serial.println(); Serial.print(F("\t\t\t (44) CLK_FREQ_P \t(54) BG_2p5V \t\t\t\t\t\t\t\t\t\t\t\t")); Serial.println(); Serial.print(F("\t\t\t (45) CLK_FREQ_P \t(55) BG_2p5V \t\t\t\t\t\t\t\t\t\t\t\t")); Serial.println(); Serial.print(F("\t\t\t (46) CLK_FREQ_P \t(56) BG_2p5V \t\t\t\t\t\t\t\t\t\t\t\t")); Serial.println(); Serial.println(); Serial.println(); // ********************** // *** НИЖНЕЕ МЕНЮ *** // ********************** Serial.print(F("\t\t\t QR COMPARITOR \t\t\t ADC \t\t\t MS Driver \t\t\t AC Driver \t\t\t Active Clamp FET \t\t V10")); Serial.println(); Serial.print(F("\t\t\t (78) CLK_FREQ_P \t\t (84) BG_2p5V \t\t (87) GPIO0_PD \t\t (96) GP1_N_Buff \t\t (100) AC_FET_LEAKAGE \t\t (1400) V10MIN_V10_OK_FAL")); Serial.println(); Serial.print(F("\t\t\t (79) CLK_FREQ_P \t\t (85) BG_2p5V \t\t (88) GPIO0_PD \t\t (97) GP1_N_Buff \t\t (101) AC_FET_LEAKAGE_SWEEP")); Serial.println(); Serial.print(F("\t\t\t (80) CLK_FREQ_P \t\t (86) BG_2p5V \t\t (89) GPIO0_PD \t\t (98) GP1_N_Buff \t\t (102) AC_FET_RDS_ON")); Serial.println(); Serial.print(F("\t\t\t (81) CLK_FREQ_P \t\t\t\t\t (90) BG_2p5V \t\t\t (99) GPIO0_PD")); Serial.println(); Serial.print(F("\t\t\t (82) CLK_FREQ_P \t\t\t\t\t (91) BG_2p5V")); Serial.println(); Serial.print(F("\t\t\t (83) CLK_FREQ_P \t\t\t\t\t (92) BG_2p5V")); Serial.println(); Serial.print(F("\t\t\t\t\t\t\t\t\t\t (93) CLK_FREQ_P")); Serial.println(); Serial.print(F("\t\t\t\t\t\t\t\t\t\t (94) CLK_FREQ_P")); Serial.println(); Serial.print(F("\t\t\t\t\t\t\t\t\t\t (95) CLK_FREQ_P")); Serial.println(); Serial.println(); Serial.println(); Serial.println(); Serial.println(); Serial.println(); } //************************************************ //** Функция: менюВыбор //** Проходит: ничего //** Возвращает: целое число для выбора меню //************************************************ int menuChoice() { int selection = 0; while (Serial.available() == 0); { selection = Serial.read(); Serial.print("You entered: "); (int)Serial.println(selection, DEC); } return selection; }
@fijismart, 👍1
Обсуждение1 ответ
Лучший ответ:
Я думаю, проблема связана с функцией menuChoice()
. Попробуйте заменить на это:
int menuChoice()
{
int selection = 0;
const byte bufferSize = 16;
char inputBuffer[bufferSize + 1];
if(Serial.available() > 0){
// На 50 байт больше в размере компиляции с использованием parseInt() vs
// буфер символов и atoi().
// выбор = Serial.parseInt();
Serial.readBytesUntil('\n', inputBuffer, bufferSize);
selection = atoi(inputBuffer);
memset(inputBuffer, 0, sizeof(inputBuffer));
Serial.print("You entered: ");
Serial.println(selection, DEC);
}
return selection;
}
Конечно, вы можете использовать parseInt()
вместо буфера char
и atoi()
, но размер компиляции составляет 50 байт. больше.
Спасибо VE7JRO! Функция parseInt() исправила большую часть этой проблемы. Кажется, он все еще поддерживает возврат каретки; Обычно я фиксирую возврат каретки с помощью cin.get() в C/C++, но я не знаю подобной функции, доступной для Arduino. Я пытался запустить код, который вы предоставили выше, но меню бесконечно зацикливается. В любом случае... еще раз спасибо, что привлекли мое внимание к parseInt()... это очень помогло!, @fijismart
- Arduino с 12-битным ЦАП (MCP4725) не работает
- Странное явление с avrdude: stk500v2_ReceiveMessage(): таймаут только с ATmega250 на windows 7x64
- Проанализировать большой ответ json с помощью ESP8266
- Сбой Arduino во время последовательной печати без очевидной причины
- Будет ли адаптер питания 12В постоянного тока, 1А подавать слишком большую мощность и повредит Arduino Mega 2560?
- Как запрограммировать Robotdyn Mega 2560 PRO MINI?
- Отключите автоматический сброс Mega 2560 на последовательном мониторе, открытом с помощью резистора 60 Ом.
- Использование модуля Bluetooth HC-08 с arduino
49, 13 и 10 — это ASCII-коды символов, которые вы отправляете из Serial Monitor., @Juraj
Привет, Юрай... Я понимаю, что это коды ASCII, но это не имеет смысла, если я введу 1, я получу 49 (1), 13 (возврат каретки), 10 вернется (новая строка). Есть ли идеи, как я могу это решить?, @fijismart
Почему вы говорите, что это не имеет смысла? Коды, которые вы получаете, — это именно те, которые вы набрали и отправили., @AnT
почему вы не печатаете значение «choice» сразу после «choice = menuChoice();»? .... это простой способ отладки программы, @jsotola