2016-07-08 17 views
0

enumを使用してデバイスの状態を変更したいので、arduinoの問題に直面していますが、動作しないと思われるので、私のコードは以下のようになります。私はそれが間違っていることを完全にはわかっていない、私はまた、settingTotoP2Pの間の比較が間違っていると思いますか?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;} 
    } 
} 

私のクラスには、それが最終的に問題を引き起こすだろうと、あなたは、Stringクラスを避ける必要があり、enumは、一般的には

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

コンパイラは警告を発しますか? – purplepsycho

+0

'settingTo'に含まれるデータを印刷できますか? – purplepsycho

+0

@purplepsychoそうではありません – ndarkness

答えて

0

として定義されています。しかし、LoRa_TxStringメンバーを持っているように見えることを考えると、ここではそれらの二つのモードを監視するための1つの方法は次のとおりです。

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()関数は、最初の文字(0から始まるインデックス)またはStringへのポインタを返し、[ indx ]はモード番号の最初の文字を返します。最後に、&は、最初のモード番号文字へのポインタです。

次に標準ライブラリ関数strncmp_P(文書番号here)を使用して、これらのモード番号文字を探しているモードと比較し、最大6文字のみを比較します。 "503250"の後にデリミタがあるかどうかは言わないので、 "50325076"が可能かどうかわからないので拒否する必要があります。

strncmp_Pは、const char *だけでなく、2番目の引数としてPROGMEM文字列を取得することを想定しているため、PSTRマクロの機能は同じです。これにより、PSTRが格納され、FLASHメモリ(別名PROGMEM)と比較されるため、RAMが節約されます。 Serial.printステートメントは同じ理由でF()マクロを使用する必要があります。