如何从字节流中提取数据包?

时间:2013-01-26 21:47:14

标签: c++ boost serial-port buffer boost-asio

我想编写一个从串口读取数据包的应用程序。 I've poked around at different questions on Stack Overflow and it looks like using boost::asio is the way to go

但是,我以前从未真正使用过串口或boost :: asio,我正在寻找一些关于如何在字节流中“查找”数据包的高级指导。

来自串口的每个数据包由13个字节组成。不幸的是,数据包不包含任何类型的标头标志,但最后一个字节包含前12个字节的校验和。

我假设如果我开始读取串口,我得到的第一个字节不一定是数据包的第一个字节。实际上,我读取的第一个字节可能位于数据包的中间位置。

  • 我打算让主线程定期从串口读取一堆数据包并将它们存储到缓冲区中。

  • 第二个线程定期扫描缓冲区并查找有效的校验和。假设它找到一个有效的校验和,这意味着校验和字节加上之前的12个字节形成一个有效的数据包。

这是一种有效的方法吗?

有没有更好的方法来解决这个问题?

1 个答案:

答案 0 :(得分:3)

现实世界的串行协议通过使用导入序列来解决这个问题,以允许同步 - 明确识别边界的字节或字节序列。你必须阅读,直到你看到一个,丢弃之前的东西。我想,只要找到有效校验和的12 + 1就行了。