我正在从串口读取100hz的数据~100字节。我的缓冲区是1024字节,因此我的缓冲区通常不会被完全使用。但有时候,我会从串口发出打嗝声,缓冲区就会被填满。
我的数据被组织为[标题]数据[校验和]。当我的缓冲区被填满时,有时会从串行端口的两次读取中分割消息/数据。
这是一个简单的问题,我确信有很多不同的方法。我提前了,所以我想研究不同的方法。你们可以说出一些范例,这些范例包括可能需要从两次读取放在一起的高速数据缓冲吗?注意,我在这个问题中看到的主要区别是说我已经完成的其他缓冲(图像采集,tcp / ip),我们可以保证完整的数据包/消息。这里的“数据包”可以在读取之间进行分割,一旦我们开始解析数据,我们才会知道。
哦,是的,请注意,必须解析从读取缓冲的数据,因此为了简单起见,数据在到达解析时应该是连续的。 (另外我认为这不是解析器的责任)
我有一些想法:
std::vector<unsigned char>
。动态内存分配,保证连续。感谢信息人员!
答案 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个字节,因此需要握手或实时操作系统。