gpt4 book ai didi

c++ - 如何编辑SIM800l库保证通话建立

转载 作者:行者123 更新时间:2023-11-30 05:22:28 24 4
gpt4 key购买 nike

我使用 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;在软件串口通信上的返回是:

如果号码错了 错误

如果没有信用

 `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 ?

最佳答案

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

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

  • 好的
  • 错误
  • 没有承运人
  • 没有回答

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

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

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

以下是我的 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% 正确。

关于c++ - 如何编辑SIM800l库保证通话建立,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39659117/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com