题目:matlab解析HEX386文本格式并自动绘图
目录
参考链接: https://blog.csdn.net/linzhe_deep/article/details/105510170?spm=1001.2014.3001.5501
参考链接: https://blog.csdn.net/linzhe_deep/article/details/105510170?spm=1001.2014.3001.5501
一、目的:
电流环带宽测试中,需要发波数据和回波数据进行绘图对比幅值和相位衰减,采用传统的ultra-edit+excel绘图太麻烦,数据量庞大
因此采用matlab直接将大数组的数据调出来进行绘图节约时间且界面友好。
二、结果展示
500Hz电流环发波和回波数据绘图对比
三、基本概念
HEX386文本格式注解
HEX386文本格式也被称为Intel文本格式,详情参考 https://developer.arm.com/documentation/ka003292/latest,现在将其关键信息摘录如下:
:llaaaatt[dd...]cc
||||||||||| CC->Checksum 代表校验
|||||||||DD->Data 代表数据
|||||||TT->Record Type = 00 =代表数据
|||AAAA->Address 代表地址
|LL->Record Length 数据dd长度
四、代码实现步骤
第1步 Top层
close all;
clear;
file1 = 'C:\Users\huang\Desktop\six\getKeilMem\receive_10h.txt';% 'g:\s10m.txt';%调出文本
file2 = 'C:\Users\huang\Desktop\six\getKeilMem\send_10h.txt';% 'g:\s10m.txt';%调出文本
strArray1 = readDataFromTxt(file1);%strArray得到文本数据
strArray2 = readDataFromTxt(file2);%strArray得到文本数据
[a1,d1] = hex386Decode(strArray1);%a:地址 d:数据
[a2,d2] = hex386Decode(strArray2);%a:地址 d:数据
data1 = byte2word(d1,32,1);%
data2 = byte2word(d2,32,1);%
x1 = 1:1:length(data1);
y1 = data1;
x2 = 1:1:length(data2);
y2 = data2;
figure;
[AX,H1,H2] = plotyy(x1,y1,x2,y2,'plot');
set(get(AX(1),'Ylabel'),'String','回波幅值');
set(get(AX(2),'Ylabel'),'String','发波幅值');
%plot(x1,y1);
title('电流环带宽测试');
xlabel('采样点');
grid on;
%set(H1,'LineStyle','--');
%set(H2,'LineStyle',':');
%xlim([20 200]);
第2步 读取文本文件到字符串数组
function strArray = readDataFromTxt(filename)
%将文本txt文件的数据读出来保存到strArray数组中
%function语句引导函数文件,strArray 输出 filename输入
f = fopen(filename,'r');%r代表读出 -1代表打开不成功 正整数打开成功
%f = fopen(filename);
%f是通过fopen函数打开文件后得到的一个整型的文件标识,对文件的读写操作都是通过这个值来进行的
line_num = 1;
s2 = -1;
strArray = cell(19,1);
%strArray = strings(10,10);
while 1
tmp = fgetl(f);%fgetl返回由文件标识符fid指示的文件的下一行
%tmp = string(fid);
%fgetl函数 :从文件中读取一行数据,并去掉行末的换行符 遇到文件末尾的结束标志(EOF)则函数返回-1
%string函数:将这行数据转化为字符串
if (tmp == -1)%(strcmp(tmp,s2))
break;
else
strArray(line_num) = cellstr(tmp);%获取第几行数据 将char转cell
line_num = line_num + 1;
end
end
fclose(f);
%当不需要对文件f进行操作之后,就可以使用fclose函数对这个文件进行关闭
第3步 解析hex格式——输入为字符串数组的序号对应导出文本的行,输出为每行一个字节的数据
function [address,data] = hex386Decode(strArray)
%hex386Decode函数返回文本的数据和地址
%data = cell(641,2);
%address = cell(1,641);
dataIndex = 1;
len = length(strArray);
for rowIndex = 1 : len%逐行扫描 %length:获取数组中行列较大值
charTmp = char(strArray(rowIndex));%charTmp:单行数据字符型
%byteNum = length(charTmp);%length--byteNum:一行数据多少列
state = 1;
byteIndex = 1;
while 1 %逐字节扫描
switch(state)
case(1)%:
if(charTmp(byteIndex) == ':')%第一个字节
state = 2;
byteIndex = byteIndex + 1;
end
case(2)%ll
dataByteNum = hex2dec(charTmp(byteIndex:byteIndex+1));
state = 3;
byteIndex = byteIndex + 2;
case(3)%aaaa
addr = hex2dec(charTmp(byteIndex:byteIndex+3));
state = 4;
byteIndex = byteIndex + 4;
case(4)%tt
dataType = hex2dec(charTmp(byteIndex:byteIndex+1));
if(dataType == 0)
state = 5;
byteIndex = byteIndex + 2;
else
break;
end
case(5)%[dddddd]
for dataByteCnt = 1 : dataByteNum
address(dataIndex) = addr + dataByteCnt - 1;%取得数据首地址
data(dataIndex,1:2) = charTmp(byteIndex:byteIndex+1);%给data的第dataIndex行1,2 赋值charTmp[1,2]
byteIndex = byteIndex + 2;
dataIndex = dataIndex + 1;
end
break;
end
end
end
第4步 转换为真实数据——输入每行一个字节的数据,输出小端格式的真实数据
function data = byte2word(hexByte,bits,isSigned)
data = 'ff';
switch(bits)
case(8)
data = hexByte;
case(16)
len = length(hexByte);
cutNum = mod(len,4);%取模(mod)
hexByte = hexByte(1:len - cutNum,:);
byte1 = 1 : 2 : length(hexByte);
byte2 = 2 : 2 : length(hexByte);
data = [hexByte(byte2,:),hexByte(byte1,:)];
case(32)
len = length(hexByte);
cutNum = mod(len,4);
hexByte = hexByte(1:len - cutNum,:);
byte1 = 1 : 4 : length(hexByte);
byte2 = 2 : 4 : length(hexByte);
byte3 = 3 : 4 : length(hexByte);
byte4 = 4 : 4 : length(hexByte);
data = [hexByte(byte4,:),hexByte(byte3,:),hexByte(byte2,:),hexByte(byte1,:)];
case(64)
len = length(hexByte);
cutNum = mod(len,4);
hexByte = hexByte(1:len - cutNum,:);
byte1 = 1 : 8 : length(hexByte);
byte2 = 2 : 8 : length(hexByte);
byte3 = 3 : 8 : length(hexByte);
byte4 = 4 : 8 : length(hexByte);
byte5 = 5 : 8 : length(hexByte);
byte6 = 6 : 8 : length(hexByte);
byte7 = 7 : 8 : length(hexByte);
byte8 = 8 : 8 : length(hexByte);
data = [hexByte(byte8,:),hexByte(byte7,:),hexByte(byte6,:),hexByte(byte5,:),hexByte(byte4,:),hexByte(byte3,:),hexByte(byte2,:),hexByte(byte1,:)];
otherwise
err = '不支持的输入'
end
data = hex2dec(data);
if(isSigned > 0)
switch(bits)
case(8)
data(data >= 2^7)= -2^8 + data(data >= 2^7);
case(16)
data(data >= 2^15)= -2^16 + data(data >= 2^15);
case(32)
data(data >= 2^31)= -2^32 + data(data >= 2^31);
case(64)
data(data >= 2^63)= -2^64 + data(data >= 2^63);
end
end