4

我最近正在为自定义串行通信协议编写代码。我所做的是,我使用了接收数据的一部分(8/16 位)来表示帧大小有多大。基于这些数据,我预计没有数据可以遵循。我使用 Crc 来接受或拒绝一个框架。但是我不能在 Crc 中包含帧长度数据,因为在接收端我应该知道在处理帧之前需要多少数据。

我面临的问题是,有时这个帧长度数据会被破坏,它会欺骗接收器接收那么多字节,而接收数组的大小要小得多。这会破坏连续内存位置中存在的许多关键系统变量。

如何防止发生缓冲区溢出?我对此的想法 1)如果帧长度数据超过某个值,则拒绝它。2)使用限制最大数量的数据类型。就像使用 short 将数组索引的范围限制为 256 个内存位置,并创建一个 280 字节的缓冲区。3)在单独的位置分配内存,这样它就不会影响关键的系统变量。

我用来防止卡在接收循环中的一件事是使用超时。但我忽略了这个问题。如果有时间确认和重现该问题,我会觉得很多,因为代码是更大系统代码的一部分,我不是这里的专家。

一般如何安全地处理这类问题?

另外:使用数组时要遵循的一般注意事项或标准做法是什么,以防止它溢出?

4

2 回答 2

1

首先,检查成帧错误,检查奇偶校验错误

其次,检查数据大小的大小。如果太大或太小,则拒绝整个数据块

于 2016-04-10T18:03:11.887 回答
1

有很多东西可以用来最小化这个问题,但是一般来说,没有一个尺寸适合这个问题的解决方案。您必须做出决定并了解如果出现问题会发生什么,并让您的系统能够处理它。

您必须弄清楚什么最适合您的系统。例如,如果您从不期望消息大于 256,那么将缓冲区的大小声明为 0xFF 并将缓冲区的索引声明为 uint8_t 您将永远无法超过它一次插入一个字节,因为索引将永远不会达到 256 并溢出回 0。当然,如果确实发生这种情况,您会覆盖收到的一些数据,但在大多数情况下,crc 检查应该会显示错误。

您可以做的另一件事是将数据长度与缓冲区最大值进行比较,如果消息超出缓冲区,则不存储消息。因此,您将彻底拒绝任何数据长度过大且已收到的消息,但不会存储遇到的数据。显然,如果数据长度经常损坏,那么您将遇到很多问题。

老实说,最好的方法是重新考虑您的自定义串行通信协议。这听起来不像你遇到的错误很好。您可以在消息的开头和结尾设置同步字节,以确保您实际上收到了良好的数据,并对整个消息进行 CRC 校验,并定义将通过线路的最大数据包大小并指示要发送多少个数据包被接收。如果通信协议不是很好,那么您必须自下而上重新考虑。

于 2016-04-09T19:55:15.427 回答