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

C++ string parsing: how to detect the end of a message?

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

我想做的是解析整个消息(由多行组成)。我怎么能那样做?因为我可以 hook 每个接收到的字符(它们是通过 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

一条消息 的示例。我关心

例如X = 22, R46 = 319, R45 = 386, R44 = 455

如何以优雅的方式区分消息?

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

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

2/ 一次读取一个字符,将它们存储在缓冲区中。当您读取 'X'(这似乎是表示新消息开始的字符)时,只需解析缓冲区,将其清空,存储 'X',然后继续。