如何正确解析从GSM模块接收到的响应数据?

4

我需要一些指导来正确解析从GSM模块接收到的响应数据。我使用的是uBlox SARA-G350。文档说明:

Information responses:
<CR><LF><text><CR><LF>

Result codes:
<CR><LF><verbose code><CR><LF>

If the command line is successfully performed, the string "OK" (<CR><LF>OK<CR><LF>)
is sent, otherwise "ERROR".

看起来一切都很简单。我们应该从<CR><LF><CR><LF>读取每个句子,但是...

  • 数据可能会被分成块
  • 响应可能包含重复的<CR><LF>OK<CR><LF>(见下面的示例)

示例-发送短信消息到GSM模块:

"Hi. Is IT
OK
"

在CMGL模块响应后(这是返回数据序列的结尾),可能看起来像这样:

Hi. Is IT<CR><LF>
OK<CR><LF>
<CR><LF>
OK<CR><LF>

正如您所看到的,我们已经将 <CR><LF>OK<CR><LF> 值翻倍。

我如何知道我已经拥有完整的句子,并应停止从模块读取数据并解析接收到的数据?

在这种情况下,AT解析器应该如何表现?

我在哪里可以找到一些指南,以正确地解析来自gsm模块的传入响应数据?


代码总是位于响应的末尾吗?您可以使用正则表达式来解析响应。 - Markus
是的,它已经固定了,我知道要使用哪种技术,但问题在于接收整个数据。我不知道句子的结尾在哪里,以及何时停止阅读并进行接收到的数据解析。(我编辑标签-.net微型,没有正则表达式) - dariol
它是同步还是异步的?你是否会收到未经请求的响应? - user1725145
是的,我会收到未经请求的响应。我正在使用SerialPort c#类进行读取(因此是异步的),但在良好的实践中,在每次发送AT命令后等待OK/ERROR响应,这样它将更加同步。是否可以完全异步完成? - dariol
2个回答

4
我找到了答案。我的错误假设是短信消息可以包含CrLf字符,但这是不正确的(至少对于uBlox SARA-G350来说)。模块接收到的文本中所有的CrLf都被替换为Lf。
感谢这一点,我可以知道以下任何一个组合到达时,句子的结尾就会出现:
- OK - ERROR - > 最后一个是短信发送命令的提示符号。

1

你的问题很有趣,因为大多数标准都避免说明如果返回的文本包含类似于最终结果代码的内容应该发生什么。V.250仅在5.7.3测试命令的信息文本格式中指定DCE不应产生错误的响应文本行,但并未明确禁止生成错误的响应... 另请参见此答案,其中讨论了来自AT+CMGL的响应。

因此,回答你的问题,你必须假设这是实现定义的行为。


谢谢。建议的回答非常有帮助。我早些时候找到了它,这让我想再次检查。然后我找到了我的答案。 :) - dariol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接