获取 AT 命令响应
Get AT command response
我正在使用带有 sim900 gps/gprs 模块的 Arduino Uno 并且我正在使用 at 命令,我怎样才能得到 at 命令的响应(即 OK,ERROR)以便我可以做一些事情if response == "OK"
或 response == "ERROR"
您可以使用以下代码在发出 AT 命令后立即从 SIM900 GSM 模块读取响应。
char response[200];
for(int i = 0 ; Serial.available() > 0 && i<200 ; i++) {
response[i++] = Serial.read();
}
阅读响应后你可以使用strstr()
函数来检查它是'OK'还是'ERROR',如下所示:
if(strstr(responce, "OK"){
/*Do your code to handle OK response*/
}
else if(strstr(responce, "ERROR"){
/*Do your code to handle ERROR response*/
}
else {
/* You got some other response*/
}
您需要读取与模块通信的串行连接的响应,例如:
String getResponse() {
String response = "";
while(mySerial.available()!=0){
response += mySerial.read();
}
return response;
}
(mySerial
指的是你在模块上使用的串口,如果你只是在引脚0和1上使用普通串口,那么你应该将其替换为Serial
)
您可能希望使用 response.trim()
从开头和结尾 trim 任何空白字符,然后再检查它是否等于您要查找的响应之一。
如果你还没有读完V.250 specification中的第5章,请停止阅读并立即阅读,它是本答案其余部分的重要基础,我会等你来背部。一些对字母表的引用(简短版本:忽略 this/treat 它作为 ASCII)和 S 寄存器可能看起来很神秘,但不要放弃,它会很快在你身上成长。
处理调制解调器输出的唯一正确方法是将输出分成完整的行并一次迭代一整行。这是通用的,绝对适用于所有 AT 命令(我能想到的只有一个例外1)。
我要强调的是:您应该只在严格的行尾边界 ("\r\n"
) 上拆分调制解调器响应文本,并在一次操作中处理生成的行字符串。所以你真的应该去实现我在 .
中建议的 read_line_from_modem
函数
这意味着无论何时你想检查 OK
结果代码,你都应该只使用 strcmp(line, "OK\r\n")
而不是 strstr 或类似的,因为你知道你正在处理一个完整的完整行,它应该开始最终结果代码在最开始,它后面总是跟着 "\r\n"
2.
现在除了 OK
和 ERROR
之外还有更多的最终结果代码,而不是试图自己弄清楚所有事情3
我建议查看 is_final_result_code 或 .
中列出的 isFinalResponseSuccess
总结
- 始终逐行读取调制解调器输出,并使用单独的函数进行读取,returning/modifying string/buffer 包含该行。
- 读完一行后要做的第一件事就是检查它是否是最终结果代码。编写一个单独的函数,将行作为参数并检查它是否是。
- 如果该行不是最终结果代码,则执行适合正在执行的 AT 命令的任何操作。
- 阅读下一行并返回 2。
1
AT+CMGS
的 "\r\n> "
前缀是您唯一做一些不同的事情的地方,即开始处理调制解调器响应而不是严格的线路边界。
2
除非你错误地配置了 S3
和 S4
,这是你永远不应该做的。
3
V.250 中的列表不完整,在 27.005 和 27.007 中还定义了一些。
我只是想补充一点 K.H.A.J.A.S 答案对我有帮助,但我必须在它像这样工作之前对其进行修改:
char response[200];
for(int i = 0 ; Serial.available() > 0 && i<200 ; i++) {
response[i] = Serial.read();
}
而他的答案是 [i++],所以它在 for 循环中递增 i,然后在响应索引 i 中存储该字符时再次递增 i。
我正在使用带有 sim900 gps/gprs 模块的 Arduino Uno 并且我正在使用 at 命令,我怎样才能得到 at 命令的响应(即 OK,ERROR)以便我可以做一些事情if response == "OK"
或 response == "ERROR"
您可以使用以下代码在发出 AT 命令后立即从 SIM900 GSM 模块读取响应。
char response[200];
for(int i = 0 ; Serial.available() > 0 && i<200 ; i++) {
response[i++] = Serial.read();
}
阅读响应后你可以使用strstr()
函数来检查它是'OK'还是'ERROR',如下所示:
if(strstr(responce, "OK"){
/*Do your code to handle OK response*/
}
else if(strstr(responce, "ERROR"){
/*Do your code to handle ERROR response*/
}
else {
/* You got some other response*/
}
您需要读取与模块通信的串行连接的响应,例如:
String getResponse() {
String response = "";
while(mySerial.available()!=0){
response += mySerial.read();
}
return response;
}
(mySerial
指的是你在模块上使用的串口,如果你只是在引脚0和1上使用普通串口,那么你应该将其替换为Serial
)
您可能希望使用 response.trim()
从开头和结尾 trim 任何空白字符,然后再检查它是否等于您要查找的响应之一。
如果你还没有读完V.250 specification中的第5章,请停止阅读并立即阅读,它是本答案其余部分的重要基础,我会等你来背部。一些对字母表的引用(简短版本:忽略 this/treat 它作为 ASCII)和 S 寄存器可能看起来很神秘,但不要放弃,它会很快在你身上成长。
处理调制解调器输出的唯一正确方法是将输出分成完整的行并一次迭代一整行。这是通用的,绝对适用于所有 AT 命令(我能想到的只有一个例外1)。
我要强调的是:您应该只在严格的行尾边界 ("\r\n"
) 上拆分调制解调器响应文本,并在一次操作中处理生成的行字符串。所以你真的应该去实现我在
read_line_from_modem
函数
这意味着无论何时你想检查 OK
结果代码,你都应该只使用 strcmp(line, "OK\r\n")
而不是 strstr 或类似的,因为你知道你正在处理一个完整的完整行,它应该开始最终结果代码在最开始,它后面总是跟着 "\r\n"
2.
现在除了 OK
和 ERROR
之外还有更多的最终结果代码,而不是试图自己弄清楚所有事情3
我建议查看 is_final_result_code 或
总结
- 始终逐行读取调制解调器输出,并使用单独的函数进行读取,returning/modifying string/buffer 包含该行。
- 读完一行后要做的第一件事就是检查它是否是最终结果代码。编写一个单独的函数,将行作为参数并检查它是否是。
- 如果该行不是最终结果代码,则执行适合正在执行的 AT 命令的任何操作。
- 阅读下一行并返回 2。
1
AT+CMGS
的 "\r\n> "
前缀是您唯一做一些不同的事情的地方,即开始处理调制解调器响应而不是严格的线路边界。
2
除非你错误地配置了 S3
和 S4
,这是你永远不应该做的。
3 V.250 中的列表不完整,在 27.005 和 27.007 中还定义了一些。
我只是想补充一点 K.H.A.J.A.S 答案对我有帮助,但我必须在它像这样工作之前对其进行修改:
char response[200];
for(int i = 0 ; Serial.available() > 0 && i<200 ; i++) {
response[i] = Serial.read();
}
而他的答案是 [i++],所以它在 for 循环中递增 i,然后在响应索引 i 中存储该字符时再次递增 i。