向Matlab中添加“野生”数据并简单分析(1)

来源:互联网 发布:多功能qq视频录像软件 编辑:程序博客网 时间:2024/05/16 09:28
功能:向Matlab中导入txt格式的数据,并对这些数据做简单分析
场景:在现场调试485串口总线,拿回来的数据是一大串十六进制原始数据。现场时间紧,准备工作也没做充分,所以没有分行的一整段原始数据,直接从串口调试助手里面复制到txt中。因此,要分析调试的结果,就要处理这些原始数据。
操作步骤:其实也不复杂。
原始数据形如“6 F7 34 01 03 04 1B 1E 26 C5 46 E2 01 03 04 1B 24 26 B7 E6 CA 01 03 04 1B ”。
1)根据485的通信协议,其数据帧由地址码、功能码、寄存器高位、寄存器低位、寄存器高位数据、寄存器低位数据、两位CRC效验组成。接收到的原始数据,其开头一段是相同的“01 03 04”,代表了这一帧数据的含义。
    将指代同一数据的原始数据文本拷贝到word中,利用word的文本替换功能将“01 03 04”替换为换行符“^p”。
2)word中分行后的数据为“1B 1E 26 C5 46 E2”,后两位为校验位,需要校验的可以拿着校验下,只用数据的话提取前四位就行。有两种操作方法:
        2.1)将word中数据复制保存到txt中,利用matlab读取其中字符,并转化为数字。读取时选择性地读取前四位。
        2.2)将word中数据的空格“ ”替换为Tab制表符“    ”,然后选中全部文本粘贴到xls中,在xls中删除后两列。
3)现在txt中待读取数据为分行存储的6位或4位寄存器数据,在位与位之间有空格或者制表符隔开。
    在Matlab中采用fopen与textscan函数读取数据:
                fid = fopen('somedata.txt');
                datacell=textscan(fid,'%s')';%以字符形式读取内容
    此时,读取到的内容保存名为datacell的<1x1 cell>中,假设一共有n行的6位数据,所有字符一个接一个的从txt中被读取后放置到datacell{1,1}中,形成了6n行1列<6nx1 cell>。
4)将datacell{1,1}中字符转化为数据。
    首先计算出数据的行数n,称为datanum:
                datasize=size(datacell{1,1},1);
                datanum=datasize/6;
    为转换后数据分配地址:
                dataoriginal=datacell{1,1};
                data=cell(datanum,2);   
    有选择的读取每一行的前四位,并用hex2dec函数将16进制转换为10进制:
                for i=0:datanum-1
                    data{i+1,1}=(hex2dec(dataoriginal{i*6+1,1})*256+hex2dec(dataoriginal{i*6+2,1})-10000)/100;
                    data{i+1,2}=(hex2dec(dataoriginal{i*6+3,1})*256+hex2dec(dataoriginal{i*6+4,1})-10000)/100;
                end      
    将数据从data{i,1}取出保存到数组datam(i,1)后,将datam数组保存为.mat文件,方便后续处理文件调用。
                save('datam.mat','datam');
5)调用datam采用load函数:
                load('datam.mat','datam');
这样就实现了从无序txt文本到有序Matlab数组的过程。
    假设txt文本中保持的就是要用到的十进制数据,形如“-18.1759    -4.33186    151.595”,那么textscan指定为数据格式‘%f’读取即可。
                datacell=textscan(fid,'%f')';