仅从arduino上的混合字符串中解析数字

时间:2016-07-26 03:30:59

标签: string parsing arduino indexof digit

我正在使用带有Sim900 GSM板的Arduino Uno。在我的代码中,我使用命令AT + CGSN从芯片中检索IMEI。这是(在我的情况下)返回的15位数字序列: AT + CGSN

013949150670600

收到:

void GetID(){
 GPRS.print("");   
  GPRS.println("AT+CGSN");    
  delay(200);    
 {    
  while(!GPRS.available());    
  if(GPRS.available()){    
    while(GPRS.available()){    
      imei_character = GPRS.read();    
      imei_content.concat(imei_character);    
//      delay(20);    
//      imei_content.trim();    
//      delay(20);      
    }
  }
  delay(1500);

} 

}

我已经使用.length()来确定响应中至少有10个空格,这将第一个数字放在第11位。我知道要解析我可以使用的数字:

 String getGSMid(){  
return imei_content.substring(11, 25);
}

或者我可以关闭命令echo以删除“AT + CSGN”然后使用“imei_content.trim();”删除前导空格并从那里使用  return imei_content.substring(0,15);代替。

我更喜欢的是查看响应而不管它是什么,并找到数字序列并根据它是一个数字来提取它,效果如下:

    String getGSMid(){         
  return imei_content.substring(imei_content.indexOf('0>='),         imei_content.lastIndexOf('0>='));        
}

我是一名新手编码器,所以虽然我看过isdigit(),Regex,Sscanf之类的东西,但我不确定是否有适合我的应用程序。理想情况下,我希望避免添加库并使代码尽可能简单。如果我可以调整我所拥有的一段强大的代码,无论返回格式如何都能可靠地解析15位数字(我意识到如果有任何返回的杂散数字,这不是ID的一部分,这可能会抛出东西出来,这是可以接受的)。可能是禁用回声和修剪是最简单的前进方式和“足够可靠” - 希望有人可以引导我朝着正确的方向前进。谢谢。

2 个答案:

答案 0 :(得分:0)

您可以遍历imei_content字符串中的字符,查找一组数字的开头和结尾,如下所示:

// Find the index of the first digit
int startPos = 0;
do
{
    if (isdigit(imei_content.charAt(startPos))
        break;
}
while (++startPos < imei_content.length());

// Then find the index of the last digit    
int endPos = startPos;
do
{
    if (!isdigit(imei_content.charAt(endPos))
        break;
}
while (++endPos < imei_content.length());

// Now startPos is the index of the first digit and endPos is
// the index of the last digit (actually 1 character past the last digit).
// Just take that substring and that is your IMEI number.    
String imei_num = imei_content.substring(startPos, endPos - 1);  

当然这假设字符串中没有其他数字(在您的示例中没有)。如果有的话,你必须让你的循环更聪明,并寻找一个15位数的字符串(或你期望的任何长度)。

答案 1 :(得分:0)

我同时实施的代码:

def fill_iter(it, size, fill_value=None):
    return islice(chain(it, repeat(fill_value)), size)

它有效,但我有点担心收集流浪数字,我不认为有任何理由在对AT命令的回应中会有任何其他数字,但只是想知道我是否应该制作它不漏水吗?

我想要解决的一个例子看起来像(或类似的变体),其中&#34; WS&#34;是空白:

AT + CGSN

WS WS WS 23 WS WS 123456789012345 WS WS WS 行

我需要进行多次测试,测试字符串是否为15位是很容易的,如果最终为17位数,那么确定哪些包含15位数就更难了。使用空格作为标记似乎是关键,就像serialpeek = whitespace&amp;&amp; stringlength()&lt; 14(有时imei是14但通常是15)然后丢弃并继续???

会试着理解它。

这就是我现在所拥有的。似乎工作 - 欢迎任何建议!

char imei_character;
String imei_content = "";
String scale_id;

void IsNumeric(String imei_content) {
    for(char i = 0; i < imei_content.length(); i++) {
        if (isDigit(imei_content.charAt(i))) {
//             Serial.print(imei_content.charAt(i));                       
             scale_id.concat(imei_content.charAt(i));                    
        }
    }
}