【发布时间】:2021-12-27 23:21:22
【问题描述】:
我想从 AT 命令的输出中解析实际的负载。
例如:在下面的示例中,我只想阅读 "2021/11/16,11:12:14-32,0"
AT+QLTS=1 // command
+QLTS: "2021/11/16,11:12:14-32,0" // response
OK
在以下情况下,我只需要阅读12345678。
AT+CIMI // command
12345678 // example response
所以重点是:并非所有命令的输出格式都相同。我们可以假设响应存储在一个字符串数组中。
我已经实现了GetAtCmdRsp(),它将响应存储在一个字符数组中。
void GetPayload()
{
char rsp[100] = {0};
GetAtCmdRsp("AT+QLTS=1", rsp);
// rsp now contains +QLTS: "2021/11/16,11:12:14-32,0"
// now, I need to parse "2021/11/16,11:12:14-32,0" out of the response
memset(rsp, 0, sizeof(rsp));
GetAtCmdRsp("AT+CIMI", rsp);
// rsp now contains 12345678
// no need to do additional parsing since the output already contains the value I need
}
我正在考虑使用char *start = strstr(rsp, ":") + 1; 来启动有效负载,但某些响应可能只包含有效负载,因为AT+CIMI 就是这种情况
也许正则表达式是确定字符串中+<COMMAND>: 模式的好主意?
【问题讨论】:
-
我会建议进一步抽象
GetAtCmdRsp以特定于命令。或者至少传入一个抽象的枚举/定义而不是一个固定的字符串,让实现生成字符串和每个命令特定的正确响应解析。 -
如果您不想在您的实现中添加命令意识,那么另一种选择是使用启发式 - 例如如果响应包含
:,则相应地解析,否则返回整个字符串。但这可能不太健壮,最终不得不处理许多不同的情况。 -
摆弄标准库来做,通常很复杂,状态机是一件令人头疼的事,(我明白吗?)使用re2c,'@'解析器。
-
@kaylum 我不能仅根据
:进行解析,尽管如上所述。有效载荷还可以包含: -
是的,这就是为什么我说“最终不得不处理许多不同的情况”。启发式需要处理所有不同的情况。这只是作为第二种选择提供的——我的第一个建议是恕我直言。
标签: c string at-command string-parsing