matlab解析单片机发送数据的一种简单方法
经常使用单片机的同学,应该会经常面对这样一种情况,那就是对单片机采回的某些数据绘图、再处理等应用。大家经常用的两款软件,比如匿名的地面站,它通过固定的数据通讯协议,将数据从下位机传入上位机,上位机根据协议格式对数据解析,反之也一样。另外一种便是以UchartLv2为代表的文本分析类。在单片机内通过printf将数据转换为文本打印出,根据文本数据的前缀,例如“A123”这样的格式,以“A”索引数据,去掉A,将数字部分由文本转换为数据类型。很难说二者谁更加优秀,如果是电脑与单片机间存在频繁的数据交换,那么匿名的方式更加的稳定高效,因为其数据协议在单片机中更容易解析。而只需要单片机单方面上传数据给电脑时UchartLv2是更简单,更高效,更加轻量的。
所以本文章也主要讲述单片机大方面大量数据上传给电脑时,如何使用matlab对其进行解析。
首先在单片机中,按照pritnf(“A%d\r\n”,x)这样的格式将你希望发送的数据通过串口发送到电脑,通过串口助手查看,并将文本保存至一个.txt文档中(有的串口助手能直接保存为文档,有的需要你在接收文本框中将其复制粘贴进.txt中)。而后代码如下
// An highlighted block
clear;
clf;
[init]=textread('Chaser_data.txt',' %s ',100000);%读取.txt文件,将文本转换为cell
a=1;
b=1;
c=1;
d=1;
e=1;
%将文本转化为double型
for x=1:size(init)
init_data=init{x,1};%从cell中提取出一个,该数据类型为char数组,对其进行解析
if init_data(1,1)=='A'%查看首字母是否为需要的
if ~isnan(str2double(init_data(1,2:length(init_data))))%对除首字母之外的char字符进行转换为double类型,若转化出NAN,即源数据有误,那么便舍弃。
A_ADC(1,a)=str2double(init_data(1,2:length(init_data)));%若无误,则将其复制到某个你规定的矩阵中。
a=a+1;
end
end
if init_data(1,1)=='B'
if ~isnan(str2double(init_data(1,2:length(init_data))))
B_ADC(1,b)=str2double(init_data(1,2:length(init_data)));
b=b+1;
end
end
if init_data(1,1)=='C'
if ~isnan(str2double(init_data(1,2:length(init_data))))
C_ADC(1,c)=str2double(init_data(1,2:length(init_data)));
c=c+1;
end
end
if init_data(1,1)=='E'
if ~isnan(str2double(init_data(1,2:length(init_data))))
FMR_ADC(1,e)=str2double(init_data(1,2:length(init_data)));
e=e+1;
end
end
end
以上列举了多个数据的共同解析,当然你也可以用诸如“ABCD”这样更长的字符串作为前缀,只是需要改一些地方即可
for x=1:size(init)%讲文本转化为double型
init_data=init{x,1};
if length(init_data)>4%确定该char数组的长度超过你前缀的长度,否则在进行后续的计算时可能会报超出数组索引的错误
if init_data(1,1:4)=="ABCD"
if ~isnan(str2double(init_data(1,5:length(init_data))))
A(1,a)=str2double(init_data(1,5:length(init_data)));
a=a+1;
end
end
end
end
以上便是一个简单的文本数据进行解析转换的简单示例,你可以用解析出的数据,做任何你想做的事。