缓冲不完整的高速读取

时间:2012-02-17 16:08:04

标签: c++ serial-port buffer

我正在从串口读取100hz的数据~100字节。我的缓冲区是1024字节,因此我的缓冲区通常不会被完全使用。但有时候,我会从串口发出打嗝声,缓冲区就会被填满。

我的数据被组织为[标题]数据[校验和]。当我的缓冲区被填满时,有时会从串行端口的两次读取中分割消息/数据。

这是一个简单的问题,我确信有很多不同的方法。我提前了,所以我想研究不同的方法。你们可以说出一些范例,这些范例包括可能需要从两次读取放在一起的高速数据缓冲吗?注意,我在这个问题中看到的主要区别是说我已经完成的其他缓冲(图像采集,tcp / ip),我们可以保证完整的数据包/消息。这里的“数据包”可以在读取之间进行分割,一旦我们开始解析数据,我们才会知道。

哦,是的,请注意,必须解析从读取缓冲的数据,因此为了简单起见,数据在到达解析时应该是连续的。 (另外我认为这不是解析器的责任)

我有一些想法:

  1. 将未使用的字节传送到原始缓冲区,然后在上一次读取的剩余字节之后用读取填充它。 (例如,我们读取1024个字节,最后留下24个字节,它们是部分消息,memcpy到read_buffer_的开头,传递开始+24到1024和24读取和读取)
  2. 创建我自己的类,只获取数据块。它有两个指针,读/写和大块内存(1024 * 4)。传入数据时,类会正确更新写入指针,当它到达结尾时将其环绕到缓冲区的开头。我想像环形缓冲区一样?
  3. 我在考虑使用std::vector<unsigned char>。动态内存分配,保证连续。
  4. 感谢信息人员!

2 个答案:

答案 0 :(得分:1)

定义一些'APU'应用程序协议单元类,它将代表您的'[header] data [checksum]'。给它一些'add'函数,它接受一个char参数并返回一个'valid'bool。在串行读取线程中,创建一个APU并将一些数据读入1024字节的缓冲区。迭代缓冲区中的数据,将其推入APU add(),直到APU add()函数返回true或迭代完成。如果add()返回true,则您有一个完整的APU - 将其排队等待处理,创建另一个并启动add() - 将剩余的缓冲区字节添加到它。如果迭代完成,则循环返回以读取更多串行数据。

add()方法将使用状态机或其他机制来构建和检查传入的字节,仅在具有正确校验和的完整健全性检查数据集的情况下返回“true”。如果检查的某些部分失败,APU将“重置”并等待检测有效的标头。

APU可以解析数据本身,在add()数据输入期间逐字节解析,就在add()返回'true'之前,或者可能作为单独的'parse()'方法稍后调用,也许是由其他一些APU处理线程。

答案 1 :(得分:0)

从串口快速读取时,通常需要某种握手机制来控制数据流。这可以是硬件(例如RTS / CTS),软件(Xon / Xoff),或由更高级协议控制。如果您在没有握手的情况下快速读取大量数据,则UART或串行控制器需要能够以该速度读取和缓冲所有可用数据,以确保不会丢失数据。在Windows PC上看到的16550兼容UART上,此缓冲区仅为14个字节,因此需要握手或实时操作系统。