帧处理
题目
在物联网应用中需要经常处理数据帧,请你写一段处理数据帧的代码将收到的数据进行解析输出
提示:
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:
标签:题目,20230712,buffer,receivedData,start,暑假,end,接收,数据 From: https://www.cnblogs.com/hcrzhi/p/17547605.html