小端模式:内存的低地址存数据的低位,内存的高地址存数据的高位。低低高高。 2,大端模式:内存的低位存数据的高位,内存的高地址存数据的低位。 低高高低
使用matlab实现了小端模式的数据处理,并且将处理后的数据写入到excel表格中,大端处理方式类似。
处理前 处理后
读取设备的值,按小段模式存储,需要分析其数据进行滤波处理
读取通道1 通道2 通道3的数据
将两个字节的数据 小端模式转化为十进制
% 1,小端模式:内存的低地址存数据的低位,内存的高地址存数据的高位。低低高高。 2,大端模式:内存的低位存数据的高位,内存的高地址存数据的低位。 低高高低
% 最高位为符号位,正数为0 负数为1
% 小端模式:先传过来小的,再传大的, E5 FD,低字节为E5 高字节为FD
% 原始数据,数据格式是: 0xAA + 通道1(2byte 小端)+ 通道2(2byte 小端)+ 通道3(2byte 小端)+ checksum(2byte)
% 处理后将数据写入到.xlsx表格中
function Main()
global runall
runall = 1; % 0 只读取其中一个文件 1:读取文件夹下所有的文件
[filename, pathname] = uigetfile('*.*', '选择数据文件','MultiSelect', 'on'); %选择文件
if isequal(filename,0) ; return;end
if runall == 1
list = dir([pathname,'*.txt']);
list_len = length(list);
for i = 1:list_len
filename = list(i).name;
ReadData(pathname, filename);
end
else
ReadData(pathname, filename);
end
end
%读取通道1 通道2 通道3的数据
function ReadData(pathname, filename)
fileName = fullfile(pathname, filename);
data_struct = importdata(fileName);
if isequal(class(data_struct), 'struct')
data = data_struct.textdata;
else
data = data_struct;
end
k = 1; % k为处理数的index
for i =1:length(data)
j=1;
while j < length(data{i}) - 1
%AA E5 FD E3 FF 0A 00 D2 FD
if isequal(data{i}(j:j+1), 'AA') % 处理以AA开头的后面的数字
if 1
second_data = hex2dec(data{i}(j+6:j+7)); % 将高位字节的两位数转为10进制
% 处理第一个通道的数字,先将低字节和高字节拼接
low_bit = data{i}(j+3:j+4);
high_bit = data{i}(j+6:j+7);
raw_data(k, 1) = Hex2Dec(second_data,low_bit, high_bit);
% 处理第二个通道的数字,先将低字节和高字节拼接
symbol=hex2dec(data{i}(j+12:j+13));
low_bit = data{i}(j+9:j+10);
high_bit = data{i}(j+12:j+13);
raw_data(k, 2) = Hex2Dec(symbol,low_bit, high_bit);
% 处理第三个通道的数字,先将低字节和高字节拼接
symbol=hex2dec(data{i}(j+18:j+19));
low_bit = data{i}(j+15:j+16);
high_bit = data{i}(j+18:j+19);
raw_data(k, 3) = Hex2Dec(symbol,low_bit, high_bit);
else % 分别处理
second_data = hex2dec(data{i}(j+6:j+7)); % 将高位字节的两位数转为10进制
% 处理第一个通道的数字,先将低字节和高字节拼接
low_bit = data{i}(j+3:j+4);
high_bit = data{i}(j+6:j+7);
data_high_low = strcat(high_bit, low_bit);
if(second_data > 127) % 最高位为1, 负数
raw_data(k, 1) = -(hex2dec('FFFF') - hex2dec(data_high_low));
else % 正数不需要处理
raw_data(k, 1) = hex2dec(data_high_low);
end
% 处理第二个通道的数字,先将低字节和高字节拼接
symbol=hex2dec(data{i}(j+12:j+13));
low_bit = data{i}(j+9:j+10);
high_bit = data{i}(j+12:j+13);
data_high_low = strcat(high_bit, low_bit);
if(symbol > 127) % 最高位为1, 负数
raw_data(k, 2) = -(hex2dec('FFFF') - hex2dec(data_high_low));
else % 正数不需要处理
raw_data(k, 2) = hex2dec(data_high_low);
end
% 处理第三个通道的数字,先将低字节和高字节拼接
symbol=hex2dec(data{i}(j+18:j+19));
low_bit = data{i}(j+15:j+16);
high_bit = data{i}(j+18:j+19);
data_high_low = strcat(high_bit, low_bit);
if(symbol > 127) % 最高位为1, 负数
raw_data(k, 3) = -(hex2dec('FFFF') - hex2dec(data_high_low));
else % 正数不需要处理
raw_data(k, 3) = hex2dec(data_high_low);
end
end
k = k+1;
j = j+ 25;
else
j=j+1;
end
end
end
% 将处理后的数字写入到对应的文件中
name = strsplit(filename,'.');
wfile = strcat(name(1),'.xlsx');
xlswrite(wfile{1},raw_data);
end
%将两个字节的数据 小端模式转化为十进制
%symbol 符号位:提取高字节,判断最高位是0-正数,1-负数
%low_bit 低字节的数据
%high bit 高字节的数据
%eg:FD E5--> -538 data 返回转为10进制的数据
function data = Hex2Dec(symbol,low_bit, high_bit)
data_high_low = strcat(high_bit, low_bit);
if(symbol > 127) % 最高位为1, 负数
data = -(hex2dec('FFFF') - hex2dec(data_high_low));
else % 正数不需要处理
data = hex2dec(data_high_low);
end
end
....