【问题标题】:How to edit SIM800l library to ensure that a call is established如何编辑 SIM800l 库以确保建立呼叫
【发布时间】:2016-09-23 10:59:25
【问题描述】:

我使用 SIM800l 通过AT commands 与 arduino UNO 进行通话。通过使用这个library,我使用gprsTest.callUp(number) 函数进行调用。问题是它返回true,即使数字错误或没有信用。

GPRS_Shield_Arduino.cpp library 的这部分代码很清楚为什么会发生这种情况。它不检查ATDnumberhere; 的返回

bool GPRS::callUp(char *number)
{
    //char cmd[24];
    if(!sim900_check_with_cmd("AT+COLP=1\r\n","OK\r\n",CMD)) {
        return false;
    }
    delay(1000);
    //HACERR quitar SPRINTF para ahorar memoria ???
    //sprintf(cmd,"ATD%s;\r\n", number);
    //sim900_send_cmd(cmd);
    sim900_send_cmd("ATD");
    sim900_send_cmd(number);
    sim900_send_cmd(";\r\n");
    return true;
}

ATDnumberhere;对软件串口通信的返回是:

如果数字错误 ERROR

如果没有信用

 `MO CONNECTED  //instant response

  +COLP: "003069XXXXXXXX",129,"",0,"" // after 3 sec

  OK`

如果是来电却无人接听

MO RING //instant response, it is ringing

NO ANSWER // after some sec

如果是来电就挂断

MO RING //instant response

NO CARRIER // after some sec

如果接收方没有载波

ATD6985952400;

NO CARRIER

如果是来电,接听并挂断

MO RING

MO CONNECTED

+COLP: "69XXXXXXXX",129,"",0,""

OK

NO CARRIER

问题是如何通过此函数gprsTest.callUp(number) 为每种情况使用不同的返回值,或者至少在响铃时如何返回true?

【问题讨论】:

    标签: c++ arduino at-command


    【解决方案1】:

    这个库代码乍一看似乎比我见过的最糟糕的代码要好,但它仍然存在一些问题。最严重的是它的最终结果代码处理。

    sim900_check_with_cmd 函数在概念上几乎就在那里,但是仅检查 OK 是绝对不能接受的。它应该检查调制解调器可能发送的每一个可能的最终结果代码。 从您的输出示例中,您有以下最终结果代码

    • 好的
    • 错误
    • 无运营商
    • 没有答案

    但还有更多。您可以查看atinout 的代码以获取is_final_result_code 函数的示例(您还可以与ST-Ericsson's U300 RIL 中的isFinalResponseErrorisFinalResponseSuccess1 进行比较)。

    GPRS::callUp 末尾的无条件return true; 是一个错误,但可能是故意的,因为缺乏实现更好的 API 的想法,以便调用客户端可以检查中间结果代码。但这是一种错误的做法。 该库确实应该毫无例外地进行所有有状态的命令行调用和最终结果代码解析。只在库中完成其中的一部分并将其中的一部分留给客户端是糟糕的设计。

    当客户想要检查或处理命令行和最终结果代码之间的中间结果代码或信息文本时,正确的做法是让库“解构”它从调制解调器接收的所有内容单独的完整行,并且对于所有不是最终结果的代码,通过回调函数将其提供给客户端。

    以下内容来自我的 atinout 程序的未完成更新:

    bool send_commandline(
            const char *cmdline,
            const char *prefix,
            void (*handler)(const char *response_line, void *ptr),
            void *ptr,
            FILE *modem)
    {
            int res;
            char response_line[1024];
    
            DEBUG(DEBUG_MODEM_WRITE, ">%s\n", cmdline);
            res = fputs(cmdline, modem);
            if (res < 0) {
                    error(ERR "failed to send '%s' to modem (res = %d)", cmdline, res);
                    return false;
            }
    
            /*
             * Adding a tiny delay here to avoid losing input data which
             * sometimes happens when immediately jumping into reading
             * responses from the modem.
             */
            sleep_milliseconds(200);
    
            do {
                    const char *line;
                    line = fgets(response_line, (int)sizeof(response_line), modem);
                    if (line == NULL) {
                            error(ERR "EOF from modem");
                            return false;
                    }
                    DEBUG(DEBUG_MODEM_READ, "<%s\n", line);
                    if (prefix[0] == '\0') {
                            handler(response_line, ptr);
                    } else if (STARTS_WITH(response_line, prefix)) {
                            handler(response_line + strlen(prefix) + strlen(" "), ptr);
                    }
            } while (! is_final_result(response_line));
    
            return strcmp(response_line, "OK\r\n") == 0;
    }
    

    您可以将其用作实施正确处理的基础。如果你想 从函数中获取错误响应,添加一个额外的回调参数并更改为

            success = strcmp(response_line, "OK\r\n") == 0;
            if (!success) {
                    error_handler(response_line, ptr);
            }
            return success;
    

    提示:阅读V.250 规范中的所有第 5 章,它将教您几乎所有您需要了解的有关命令行、结果代码和响应处理的知识。例如,命令行也应该以 \r only 终止,而不是 \r\n-


    1注意CONNECT不是最终结果码,它是一个中间结果码,所以名字isFinalResponseSuccess严格来说不是100%正确。

    【讨论】:

      猜你喜欢
      • 2018-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-28
      • 2018-02-24
      • 1970-01-01
      相关资源
      最近更新 更多