a=textread('d:/matlab10.txt','%s'); %以字符串形式读取数据文件到a矩阵
b=hex2dec(a); %将十六进制转换成十进制
if b(1)~=126 %若第一个数据包出错,不是以7E开头,那么将第一个数据包信息删除
bi=find(b==126);
b(1:bi(1))=[];
end
bi=find(b==126);
if bi(2)-bi(1)==1 %当存在两个7E开头的情况时,要把第一个7E删掉
b(bi(1))=[];
end
i=1;
while(1) %当开头的数据包正确后,剩下的问题就是判断中间段数据的正确性
bl=find(b==126);
n=size(bl,1);
if i==n %无限循环的跳出条件是把所有的7E都判断过一遍
break;
end
z=bl(i+1)-bl(i); %用z记录相邻两个7E的距离
m1=mod(i,2); %用m1记录当前7E的序数的奇偶性
if z==8||z==7 %如果出现数据位或者是序号位刚好是7E的情况,我们删除这组数据
b(bl(i):bl(i+2))=[];
continue
end
if ((m1==1)&&(z~=12)) %第一种错误情况是,当前7E是奇数序列时,与下一个7E位置差不是12
b(bl(i):bl(i+1))=[];
continue
else if ((m1==0)&&(z~=1)) %第二种错误情况是,当前7E是偶数序列时,与下一个7E位置差不是1
if (bl(i+2)-bl(i+1)==12)
b((bl(i)+1):(bl(i+1)-1))=[]; %在第二种情况下还包括两种错误,一种是在两个正常的数据包之间多了几个字节
i=i+1;
continue
else
b((bl(i)+1):bl(i+1))=[]; %另一种错误是,包的发送产生了漏发,丢失了正常情况下的7E和部分包头
i=i+1;
continue
end
end
end
i=i+1;
end
c=size(b,1); %统计新的数据文件的长度
m=mod(c,13); %对13取余,若余数不是0,则证明文件不是以7E结束要修改
if m==0
A=reshape(b,13,[]);
else
b((c-m+1):c)=[]; %将多余的数据删除
A=reshape(b,13,[]); %由于数据是按列整定,所以需要将数组b先整定成13行
end
A=A';%然后再转置得到13列的数据包矩阵
毕业设计是无线传感器温度的采集,运行到b就变成无穷大了,求大神伸出援手啊!!!!!
[本帖最后由 wery1987 于 2011-5-21 21:06 编辑]
2011-5-21 21:06 上传
点击文件名下载附件
1.87 KB, 下载次数: 14
数据包