我正面临着arduino的问题,因为我想使用letters.each { |letter|
if permitted.include?(letter.downcase)
accepted.push(letter)
end
}
更改设备的状态,但它看起来不起作用,我的代码如下所示。我不完全确定哪里出错了,我认为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
答案 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()
宏。