我正面临着一个arduino的问题,因为我想使用enum来改变我设备的状态,但是它看起来不起作用,我的代码如下所示。我不能完全确定哪里出了问题,我也认为settingTo和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定义为
typedef enum modeRxTx{LoRaMod, LoRaWan, Idle} ;
modeRxTx current_modeRxTx = Idle;发布于 2016-07-08 22:58:38
通常,您应该避免使用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将被存储并与闪存(也称为PROGMEM)进行比较。出于同样的原因,Serial.print语句也应该使用F()宏。
https://stackoverflow.com/questions/38265258
复制相似问题