【问题标题】:Howto properly parse response data received from GSM module?如何正确解析从 GSM 模块接收到的响应数据?
【发布时间】:2013-11-20 09:58:01
【问题描述】:

我正在寻找一些指导方针,如何正确解析从 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".

看起来一切都很简单。我们应该阅读从&lt;CR&gt;&lt;LF&gt;&lt;CR&gt;&lt;LF&gt; 的每个句子,但是...

  • 数据可能会分块
  • 回复可能包含双倍的&lt;CR&gt;&lt;LF&gt;OK&lt;CR&gt;&lt;LF&gt;(参见下面的示例)

示例 - 发送到 gsm 模块的短信:

"Hi. Is IT
OK
"

CMGL 模块响应后(这可能是返回数据序列结束的样子):

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

如您所见,&lt;CR&gt;&lt;LF&gt;OK&lt;CR&gt;&lt;LF&gt; 增加了一倍。

我怎么知道我有完整的句子,应该停止从模块读取数据并解析接收到的数据?

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

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

【问题讨论】:

  • 代码始终位于响应的末尾是否已修复?您可以使用正则表达式来解析响应。
  • 是的,它已修复,我知道使用哪种技术,但问题在于接收整个数据。我不知道句子的结尾在哪里,什么时候应该停止阅读并进行接收到的数据解析。 (我编辑标签 - .net micro,没有正则表达式)
  • 是同步的还是异步的?您是否收到不请自来的回复?
  • 是的,我收到了不请自来的回复。我正在使用带有事件的 SerialPort c# 类进行读取(因此异步),但在良好的实践中是在每个 AT 命令发送后等待 OK/ERROR 响应,因此它将相当同步。它可以完全异步完成吗?

标签: c# parsing gsm at-command .net-micro-framework


【解决方案1】:

我找到了。我的错误假设是 sms 消息中可以包含 CrLf。这不是真的(至少对于 uBlox SARA-G350)。从模块接收到的某些文本中的所有 CrLf 都被替换为 Lf。

多亏了这一点,我可以知道句子的结尾将是下一个组合到达时:

  • &lt;CR&gt;&lt;LF&gt;OK&lt;CR&gt;&lt;LF&gt;
  • &lt;CR&gt;&lt;LF&gt;ERROR&lt;CR&gt;&lt;LF&gt;
  • &lt;CR&gt;&lt;LF&gt; &gt;

最后一个是短信发送命令的提示符。

【讨论】:

    【解决方案2】:

    您的问题很有趣,因为大部分标准都避免说明如果返回的文本应该包含类似于最终结果代码的内容会发生什么。 V.2505.7.3 Information text formats for test commands 中仅指定 DCE 在分解长响应文本时不应产生误报,但并未明确禁止产生误报...另请参阅 this answer 以了解有关来自 @ 的响应的相关讨论987654324@.

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

    【讨论】:

    • 谢谢。建议的答案非常有帮助。我发现它更早,这让我有想法再次检查。然后我找到了我的答案。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多