【暑假题目】20230712 帧处理
帧处理
题目
在物联网应用中需要经常处理数据帧,请你写一段处理数据帧的代码将收到的数据进行解析输出
提示:
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:


浙公网安备 33010602011771号