获取AT命令响应

时间:2016-04-27 08:37:10

标签: arduino sms at-command

我正在使用带有sim900 gps / gprs模块的Arduino Uno并且我正在使用命令,如何获得命令的响应(即OK,ERROR)以便我可以执行某些操作Informaticaif response == "OK"

4 个答案:

答案 0 :(得分:3)

如果你还没有阅读V.250 specification中第5章的所有内容,请立即停止阅读,这是其余答案的重要依据,我会等到你回来的时候。一些对字母表的引用(简短版本:忽略这个/将其视为ASCII)和S寄存器可能看起来很神秘,但不要放弃,它会很快在你身上发展。

处理调制解调器输出的唯一正确方法是将输出分成完整的行并在此时迭代一整行。这是通用的,适用于绝对所有AT命令(只有一个例外,我可以想到 1 )。

让我强调一下:您应该只在严格的行尾边界("\r\n")上拆分调制解调器响应文本,并在一次操作中处理生成的行字符串。所以你真的应该去实现我在previous answer中建议的read_line_from_modem函数。

这意味着每当您想要检查OK结果代码时,您应该只使用strcmp(line, "OK\r\n")而不是strstr或类似代码,因为您知道您正在处理一个完整的整行,该行应该从一开始的最终结果代码,后面跟着"\r\n" 2

现在有比OKERROR更多的最终结果代码,而不是自己弄清楚所有内容 3 我建议查看this answer中列出的is_final_result_code或isFinalResponseSuccess。

摘要

  1. 始终逐行读取调制解调器输出,并使用单独的函数执行读取,返回/修改字符串/缓冲区以包含该行。
  2. 读完一行后你要做的第一件事是检查它是否是最终结果代码。编写一个单独的函数,将该行作为参数并检查它是否为。
  3. 如果该行不是最终结果代码,请执行适合正在执行的AT命令的任何内容。
  4. 阅读下一行并返回2.
  5. 1 "\r\n> "的{​​{1}}前缀是您执行某些不同操作的唯一位置,即在严格的行边界以外的其他位置开始处理调制解调器响应。

    2 除非您错误配置AT+CMGSS3,否则您永远不应该这样做。

    3 V.250中的列表不完整,在27.005和27.007中存在更多定义。

答案 1 :(得分:0)

您可以在发出AT命令后立即使用以下代码读取SIM900 GSM模块的响应。

char response[200];
for(int i = 0 ; Serial.available() > 0 && i<200 ; i++) {
   response[i++] = Serial.read();
}

阅读回复后,您可以使用strstr()功能检查是否“确定”或“错误”,如下所示:

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*/
}

答案 2 :(得分:0)

您需要从与模块通信的串行连接中读取响应,例如:

String getResponse() {
    String response = "";
    while(mySerial.available()!=0){
        response += mySerial.read();
    }
    return response;
}

mySerial指的是您与模块一起使用的串口,如果您只是使用引脚0和1上的普通串口,则应将其替换为Serial

您可能希望使用response.trim()从开头和结尾修剪任何空格字符,然后再检查它是否等于您要查找的其中一个响应。

答案 3 :(得分:0)

我只想补充一点,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然后在将该char存储在响应索引i中时再次递增i。