【暑假题目】20230712 帧处理

发布时间 2023-07-16 23:52:42作者: 山远尽成云

帧处理

题目

在物联网应用中需要经常处理数据帧,请你写一段处理数据帧的代码将收到的数据进行解析输出
提示:
1、数据帧的长度不定,但是帧头帧尾是固定的
2、数据帧的参数数量不定,请注意
3、每次收到的数据可能不是完整的一帧,但是不能把不完整的数据帧丢弃,应该等待到下一完整帧接收到后才丢弃
4、一次可能接受到不止一个数据帧,可能是多个,需要针对不同数据帧进行分割
搜索关键词:数据帧粘包 数据帧拆包 帧处理

题目分析

(1)根据题目,我们得知帧头帧尾是固定的,处理接收数据时,只有接收到完整的帧才能丢弃,由于接收的不固定,所以需要对帧切割。

(2)根据关键词,我们搜索得到了粘包与拆包出现的情况:

 思路及其代码

思路一

1.使用容器存储我们所接收到的帧的数据。

2.用三种数据模拟我们接收到的三种帧:完整帧,不完整帧(拆包),包含多个数据帧的完整帧。

3.再使用一个缓冲变量存储还未处理的帧。

4.将接收到的数据放入到缓存变量中。

5.通过遍历不同的帧寻找固定不变的帧头与帧尾。

6.如果寻找的帧不是帧头与帧尾,则对该帧进行提取与处理后继续寻找帧头帧尾。

7.完成以上步骤后,输出处理后的帧。 

代码一

#include<iostream>
#include<string>
#include<vector>
using namespace std;

void ProcessDataFrame(const string& dataFrame)
{
    // 解析数据帧并输出
    // 这里只是简单地将数据帧输出到控制台
    cout << "Received DataFrame: " << dataFrame << endl;
}

int main()
{
    //模拟接收到的数据
    vector<string> receivedData;  // 存储接收到的数据

    // 模拟接收到的数据,包含完整和不完整的数据帧
    receivedData.push_back("LZ0041");  
    receivedData.push_back("19");
    receivedData.push_back("c10001");
    receivedData.push_back("1c0a87b0");
    receivedData.push_back("107");
    receivedData.push_back("fbC");

    // 数据缓冲变量,用于存储未处理的数据
    string buffer;

    for (const auto& data : receivedData)//进行遍历接收的数据
    {
        buffer += data;  // 将新接收的数据添加到缓冲中

        size_t start = buffer.find("LZ");  // 查找帧头的位置
        size_t end = buffer.find("C");  // 查找帧尾的位置

        while (start != string::npos && end != string::npos) //非帧头与帧尾的数据
        {
            if (end > start && end - start >= 2)
            {
                string dataFrame = buffer.substr(start, end - start + 1); // 提取数据帧
                ProcessDataFrame(dataFrame);  // 处理数据帧
            }

            buffer = buffer.substr(end - 1); // 删除已处理的数据帧

            start = buffer.find("LZ");  // 再次查找帧头的位置
            end = buffer.find("C");  // 再次查找帧尾的位置
        }
    }
}

 结果1: