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

标签 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 个字节组成。不幸的是,数据包不包含任何类型的 header 标志,但最后一个字节包含前 12 个字节的校验和。

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

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

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

这是一种有效的方法吗?

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

最佳答案

现实世界的串行协议(protocol)通过使用引入序列来允许同步(明确标识边界的字节或字节序列)来解决这个问题。你必须读到看到一个为止,丢弃之前的内容。我想,只要寻找具有有效校验和的 12+1 就可以了。

关于c++ - 如何从字节流中提取数据包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14541908/

相关文章:

c++ - 为什么 push_back() 会导致 malloc() 处理的数据崩溃?

c++ - 如何在 OS X 10.6 上针对 OS X 10.4u SDK 构建 boost 库和其他库?

c++ - 在 cmake 中包含 cmake 头文件 boost.hpp

c++ - boost::iterator_range 的 rbegin()

c++ - 如何防止任何人窃取我的 shared_ptr?

c# - 串行端口上的十六进制转换错误

c++ - 从静态函数访问非静态结构

c++ - 在 C Linux 中使用三个线程使用信号量同步按顺序打印 3 4 5 50 次

c - 我想连续从COM端口接收数据,同时想写入文件

c# - 如何在C#中释放一个通信端口(RS-232 COM端口)