我正在使用带有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的一部分,这可能会抛出东西出来,这是可以接受的)。可能是禁用回声和修剪是最简单的前进方式和“足够可靠” - 希望有人可以引导我朝着正确的方向前进。谢谢。
答案 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));
}
}
}