2016-07-08 13 views
0

У меня возникла проблема с arduino, так как я хочу изменить состояние своего устройства, используя enum, но он не работает, мой код выглядит ниже. Я не совсем уверен, где это происходит, я думаю, что сравнение между settingTo и toP2P может быть неправильным?Как сравнить enum в arduino?

Заранее благодарен!

String toP2P = "503250" 
String toABP = "414250"; 
String settingTo = LoRa_Tx.dataRX.substring(indx); 

if(settingTo == toP2P) { 
    //switching to P2P 
    Serial.println("current mode 1 "+(String) LoRa_Tx.current_modeRxTx); 
    if(LoRa_Tx.current_modeRxTx != LoRa_Tx.LoRaMod){ 
     LoRa_Tx.current_modeRxTx = LoRa_Tx.LoRaMod; 
    }  
} else if(settingTo == toABP){ 
    //switching to ABP 
    if(LoRa_Tx.current_modeRxTx != LoRa_Tx.LoRaWan){ 
     LoRa_Tx.current_modeRxTx = LoRa_Tx.LoRaWan;} 
    } 
} 

Мой класс имеет enum определяется как

typedef enum modeRxTx{LoRaMod, LoRaWan, Idle} ; 
modeRxTx current_modeRxTx = Idle; 
+0

Ваш компилятор излучает любое предупреждение? – purplepsycho

+0

Можете ли вы распечатать данные, содержащиеся в 'settingTo'? – purplepsycho

+0

@purplepsycho не это – ndarkness

ответ

0

В общем, вы должны избегать String класс, как это будет в конечном итоге вызвать проблемы. Однако, учитывая, что LoRa_Tx, кажется, есть String члена, вот один из способов, чтобы наблюдать за этими двумя режимами:

if ((indx > -1) && (LoRa_Tx.dataRx.length() >= indx+5)) { 
    const char *settingTo = &LoRa_Tx.dataRx.c_str()[ indx ]; 

    if (strncmp_P(settingTo, PSTR("503250"), 6) == 0) { 
     //switching to P2P 
     Serial.print(F("current mode 1 ")); // <-- saves RAM! 
     Serial.println(LoRa_Tx.current_modeRxTx); 
     if(LoRa_Tx.current_modeRxTx != LoRa_Tx.LoRaMod) { 
      LoRa_Tx.current_modeRxTx = LoRa_Tx.LoRaMod; 
     }  
    } else if (strncmp_P(settingTo, PSTR("414250"), 6) == 0) { 
     //switching to ABP 
     if(LoRa_Tx.current_modeRxTx != LoRa_Tx.LoRaWan) { 
      LoRa_Tx.current_modeRxTx = LoRa_Tx.LoRaWan; 
     } 
    } 
    } 

Вместо создания подстроку, он просто делает указатель на реальных персонажей data_Rx. Функция c_str() возвращает указатель на первый символ (индекс на основе нуля) или String, а [ indx ] является первым из символов номера режима. Наконец, & является указателем на символ первого номера режима.

Далее используется стандартная функция библиотеки, strncmp_P (задокументирована here), чтобы сравнить эти символы номера режима с режимами, которые вы ищете, и он сравнивает только до 6 символов. Вы не говорите, есть ли разделитель после «503250», поэтому я не знаю, возможно ли «50325076» и его следует отклонить.

strncmp_P рассчитывает получить строку PROGMEM в качестве второго аргумента, а не только const char *, так что это делает макрос PSTR. Это экономит ОЗУ, поскольку PSTR будет храниться и сравниваться с FLASH-памятью (иначе PROGMEM). Операторы Serial.print должны использовать макрос F() по той же причине.

Смежные вопросы