首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在arduino中比较枚举?

如何在arduino中比较枚举?
EN

Stack Overflow用户
提问于 2016-07-08 19:12:04
回答 1查看 633关注 0票数 0

我正面临着一个arduino的问题,因为我想使用enum来改变我设备的状态,但是它看起来不起作用,我的代码如下所示。我不能完全确定哪里出了问题,我也认为settingTotoP2P之间的比较可能是错误的?

提前感谢!

代码语言:javascript
复制
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定义为

代码语言:javascript
复制
typedef enum modeRxTx{LoRaMod, LoRaWan, Idle} ;
modeRxTx current_modeRxTx = Idle;
EN

回答 1

Stack Overflow用户

发布于 2016-07-08 22:58:38

通常,您应该避免使用String类,因为它最终会导致问题。但是,鉴于LoRa_Tx似乎有一个String成员,下面是一种监视这两种模式的方法:

代码语言:javascript
复制
  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将被存储并与闪存(也称为PROGMEM)进行比较。出于同样的原因,Serial.print语句也应该使用F()宏。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38265258

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档