我尝试使用Arduino使用TSS463C VAN数据链路控制器制作数据包嗅探器。我可以为接收的消息缓冲区分配一个内存位置,以及可以接收的最大数据长度。有多种消息类型,每种类型具有不同的长度,但最大长度为30个字节。不幸的是我不知道传入的消息长度,所以我创建了一个长度为30字节的数组作为我的缓冲区。
我的问题是,如果较长的消息跟随较长的消息,则控制器中的寄存器包含超过当前消息结尾的垃圾;具体而言,收到的先前数据的遗骸。
在控制器中重写这些寄存器需要时间,我想避免这种情况。
所以我的问题是如何剥离这个"垃圾"从阵列中以最快的方式?
示例:
5E 41 82 20 1F 95 6A 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
4D 41 83 8A 21 40 3D 54 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
5E 41 82 20 1F 95 6A 54 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
^^
第三条消息中的 54 是来自上一条消息的垃圾。最后2个字节是校验和(95 6A),因此如果消息的任何部分发生变化,那么这也会改变。
更新
正如我所提到的,它是一个数据包嗅探器应用程序,所以不幸的是我无法控制写入控制器寄存器的内容。我只是阅读他们的价值观(但如果我愿意,我可以写它)。有些消息是6个字节长,有些是12个,但是最大长度是30.消息格式也是固定的(我无法控制它),并从ID字节开始一些DATA字节和2个字节CHECKSUM,它是从ID计算的和DATA字节。我认为有25种类型的消息,每种消息都有一个固定的标题,不包含长度。
我在考虑以下事项: 在启动时,我将所有寄存器设置为零,并开始定期读取它们。我声明了两个数组(previousData和currentData)。如果它们不同,我会用currentData的值覆盖previousData(并通过串口将它们发送到我的PC)。我将从后面比较两个数组的元素。数组的值与当前读取的消息结束的位置不同的位置。 (如果ID或DATA发生变化,那么CHECKSUM也会发生变化。)
答案 0 :(得分:0)
您可以使用的标准选项包括:
固定大小的消息。而不是30字节的MAX大小,使每条消息都有一些固定的大小(可能是30),并计算你的校验和。这样,整个缓冲区就会被覆盖。
使用标题信息启动邮件报告大小。在某些实现中,您可以在标题中包含校验和,以允许您保存几位。
读取缓冲区时清除缓冲区。你说你不喜欢这样,因为它需要时间,但你必须以这种或那种方式缴纳税款。
使用零或某种类型的guard bytes填充传入的消息。 (与user3386109的评论相关,您必须跟踪已写入缓冲区的字节数,然后忽略其余字节。)
你所有人都必须与之合作。在不了解您的系统设计和限制的情况下,我不能推荐另一个。
答案 1 :(得分:0)
为了减少周期,我会采用这种方法:
数据进入缓冲区/寄存器后,开始读取循环。 测试字节是否为零 如果不是'读/移'数据字节,则将位置设置为零 继续通过缓冲区/寄存器 当byte为零时,断开循环。
这样,您只需测试缓冲区/寄存器内容一次,您不需要计算进入的字节数,并最小化“设置为零”步骤的数量。