如何检查AT指令执行成功还是失败

How to check if an AT command executed successfully or failed

如果 AT 命令执行成功或失败,我如何以编程方式进行检查。

我已进行以下检查:

boolean success = response.endsWith("OK");
boolean failed = response.endsWith("ERROR");

我只是想确定这个检查是否可以通用,或者至少在 AT+CUSD 命令上。我无法放置包含检查,因为 ussd 响应本身可以包含 'ok' 或 'error' 字符串。

代表您调查如何正确做事而不是仅仅停留在 "well, this seems to work by trial and error" 上的出色步骤。

是的,OKERROR 是通用的,但 ERROR 可能会被其他东西替代,并且也存在其他响应。 V.250 specification defines most of the Final Result Codes but additionally 27.007 defines +CME ERROR: and 27.005 定义 +CMS ERROR:.

你可以看一下代码atinout for an example for a combined is_final_result function, although the two split isFinalResponseError and isFinalResponseSuccess functions in ST-Ericsson's U300 RIL 似乎更接近你的用法。但请注意,CONNECT 不是最终结果代码,它是中间结果代码,因此名称 isFinalResponseSuccess 并非 100% 正确,您很可能不想包含它。

关于 contains 和 endsWith 没关系;最终结果代码总是单独出现在一行中 1,因此您应该始终检查它。换句话说,您应该始终只读取和缓冲来自调制解调器的响应数据,直到您收到终止的 \r\n 字节对,然后首先开始解析接收到的行(绝对唯一的例外是等待 4 字节响应时从 AT+CMGS 发送有效载荷之前)。

所以你的结构应该类似于

Write(port, "AT+SOMECMD\r");
do {
         input = ReadLine(port, responseTimeout);
} while (!isFinalResultCode(input));

如果您想在最终结果代码出现之前使用任何中间信息文本响应,您需要稍微更改循环(例如,在继续处理中间响应之前先检查最终结果代码)。


1前提是行尾配置没有搞乱,例如你应该总是让 S3S4 成为 \r\n 以及使用 ATV1.