matlab解析HEX386文本格式并自动绘图

 

题目:matlab解析HEX386文本格式并自动绘图

目录

题目: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

 


 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值