C ++字符串解析:如何检测消息的结束?

时间:2015-05-07 14:55:57

标签: c++ string serial-port communication string-parsing

在嵌入式系统上,我想解析通过串行接口(RS232)到达的数据。数据一次到达一行(行以\r字符分隔,并且一段时间内)来自专有来源。请参阅下面的示例数据。

我想要做的是解析整个消息(由多行组成)。我怎么能这样做?由于我可以挂钩每个收到的字符(它们是通过ISR接收的),我想我可以将收到的数据写入std::stringstream并在收到完整的消息后解析它。但是如何才能检测到这种消息的结束?

示例数据:

...
X20\r
R46 P20 A231 \r
R45 P20 A287 \r
R44 P20 A347 \r
X21\r
R46 P21 A284 \r
R45 P21 A341 \r
R44 P21 A436 \r
X22\r
R46 P22 A319 \r
R45 P22 A386 \r
R44 P22 A455 \r
...

,其中

X22\r
R46 P22 A319 \r
R45 P22 A386 \r
R44 P22 A455 \r

一条消息的示例。我关心

e.g。 X = 22,R46 = 319,R45 = 386,R44 = 455

如何以优雅的方式区分邮件?

1 个答案:

答案 0 :(得分:0)

由于它是一个嵌入式系统,取决于你有什么样的限制,以及对收到的数据有什么保证(似乎缺少消息的终止符号),可能是更好的解决方案,但我的两个建议是:

1 /如果格式保证与示例中的格式一致,则可以将所有内容存储在缓冲区中,等待读取一定数量的字符然后解析。

2 /一次读取一个字符,将它们存储在缓冲区中。当你读到' X' (这似乎是发出新消息开头的字符)只是解析缓冲区,清空它,存储' X'然后继续前进。