如何比较arduino中的enum?

时间:2016-07-08 11:12:04

标签: enums arduino

我正面临着arduino的问题,因为我想使用letters.each { |letter| if permitted.include?(letter.downcase) accepted.push(letter) end } 更改设备的状态,但它看起来不起作用,我的代码如下所示。我不完全确定哪里出错了,我认为enumsettingTo之间的比较可能是错误的?

提前致谢!

toP2P

我的班级将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

1 个答案:

答案 0 :(得分: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宏的作用。这节省了RAM,因为PSTR将被存储并与FLASH存储器(又名PROGMEM)进行比较。由于同样的原因,Serial.print语句应该使用F()宏。