clc
clear
fname = 'data_1121_pm_0.bin';
fd = fopen(fname,'r','b');
data = fread(fd,'uint8')';
% data = data(1:10000);
IDLE = 0;
FRAME = 1;
S_c_state = 0;
S_n_state = 0;
S_cnt = 0;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%解MAC帧
j = 1;
for i = 0:length(data)-12
if(data(i+12) == 5 && data(i+11) == 4 && data(i+10) == 3 && data(i+9) == 2 && data(i+8) == 1 && data(i+7) == 218 ...
&& data(i+6) == 37 && data(i+5) == 176 && data(i+4) == 56 && data(i+3) == 130 && data(i+2) == 82 && data(i+1) == 60)
S_c_state = FRAME;%识别到帧头,进入读帧状态
elseif(S_cnt == 96)%一帧数据结束(一帧共99个数据)
S_c_state = IDLE;
S_cnt = 0;
elseif(S_c_state == FRAME)
S_cnt = S_cnt + 1;%去除帧数据
frame_data(j) = data(i+14);
j = j+1;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%解{5a5a5a5a,32'hX,32'hY,32'hZ}
IDLE = 0;
XYZ = 1;
S_c_state = 0;
S_n_state = 0;
S_cnt = 0;
X_j = 1;
Y_j = 1;
Z_j = 1;
for i = 0:length(frame_data)-4
if(frame_data(i+4) == 90 && frame_data(i+3) == 90 && frame_data(i+2) == 90 && frame_data(i+1) == 90)
S_c_state = XYZ;%识别到帧头(5A5A5A5A),进入读帧状态
elseif((S_c_state == XYZ) && (S_cnt<4))%X
X(X_j) = frame_data(i+4);
X_j = X_j+1;
S_cnt = S_cnt + 1;
elseif((S_c_state == XYZ) && (S_cnt<8))%Y
Y(Y_j) = frame_data(i+4);
Y_j = Y_j+1;
S_cnt = S_cnt + 1;
elseif((S_c_state == XYZ) && (S_cnt<12))%Z
Z(Z_j) = frame_data(i+4);
Z_j = Z_j+1;
S_cnt = S_cnt + 1;
else
S_cnt = 0;
S_c_state = IDLE;
end
end
% X_SEE = dec2hex(X);
% Y_SEE = dec2hex(Y);
% Z_SEE = dec2hex(Z);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%将8位拼接成32位
%%%%处理X路
j = 1;
for i = 1:4:length(X)
X_data(j) = X(i)*2^24 + X(i+1)*2^16 + X(i+2)*2^8 + X(i+3);
if(X_data(j) > 2^31)%将FPGA中有符号数转换成Matlab十进制负数
X_data(j) = X_data(j) - 2^32;
end
j = j+1;
end
%去除两个定点
X_data = X_data/2^2;
%%%%处理Y路
j = 1;
for i = 1:4:length(Y)-mod(length(Y),4)
Y_data(j) = Y(i)*2^24 + Y(i+1)*2^16 + Y(i+2)*2^8 + Y(i+3);
if(Y_data(j) > 2^31)%将FPGA中有符号数转换成Matlab十进制负数
Y_data(j) = Y_data(j) - 2^32;
end
j = j+1;
end
%去除两个定点
Y_data = Y_data/2^2;
%%%%处理Z路
j = 1;
for i = 1:4:length(Z)-mod(length(Z),4)
Z_data(j) = Z(i)*2^24 + Z(i+1)*2^16 + Z(i+2)*2^8 + Z(i+3);
if(Z_data(j) > 2^31)%将FPGA中有符号数转换成Matlab十进制负数
Z_data(j) = Z_data(j) - 2^32;
end
j = j+1;
end
%去除两个定点
Z_data = Z_data/2^2;
%%%%%%X路存txt文件
filename = 'X_data.txt';
fileID = fopen(filename, 'w');
fprintf(fileID, '%d\n', X_data');
fclose(fileID);
%%%%%%Y路存txt文件
filename = 'Y_data.txt';
fileID = fopen(filename, 'w');
fprintf(fileID, '%d\n', Y_data');
fclose(fileID);
%%%%%%Z路存txt文件
filename = 'Z_data.txt';
fileID = fopen(filename, 'w');
fprintf(fileID, '%d\n', Z_data');
fclose(fileID);
RGMII_231024解帧Matlab
于 2023-11-25 16:17:46 首次发布