前面已经撰写了 AD7606的驱动程序,现在编写一个matlab程序进行串口采集数据并且画图,画出八个通道的电压图。
此代码中判断16进制通道号的0x88等写法,flush(s)函数好像只适用于19版本及以上的matlab。
1.如果用于低版本16版本,0x88可以用hex2dec(‘88’)等代替;
2.至于清空串口缓存flush(s) 在低版本中我暂时没想好怎么代替,可以注释该语句吧,只是无法清空缓存。
3.低版本中s = serialport(“COM27”,115200);代替为 s = serial(‘COM8’);s.BaudRate=115200;
代码如下:
close all;
clc;
clear;
% fclose(instrfind);%根据需要可以把它注释掉,占用串口的时候用它可以清空,不占用可以注释掉
s = serialport("COM27",115200);%根据自己串口端号修改
fopen(s); % 打开串口
fid=fopen('serial_data.txt','wt');
i=0;
% 开始读取数据
while true % 循环读取
init = 1;
% 判断开头通道号88
while(init~=0x88)
init = fread(s,1,'uint8');
end
out = fread(s,2,'uint8');
% 再次判断下一通道号89
init= fread(s,1,'uint8');
while(init~=0x89)
init = fread(s,1,'uint8');
end
out = fread(s,2,'uint8');
% 判断开头通道号8a
while(init~=0x8A)
init = fread(s,1,'uint8');
end
out = fread(s,2,'uint8');
% 再次判断下一通道号8b
init= fread(s,1,'uint8');
while(init~=0x8B)
init = fread(s,1,'uint8');
end
out = fread(s,2,'uint8');
% 判断开头通道号8c
while(init~=0x8C)
init = fread(s,1,'uint8');
end
out = fread(s,2,'uint8');
% 再次判断下一通道号8d
init= fread(s,1,'uint8');
while(init~=0x8D)
init = fread(s,1,'uint8');
end
out = fread(s,2,'uint8');
% 判断开头通道号8e
while(init~=0x8E)
init = fread(s,1,'uint8');
end
out = fread(s,2,'uint8');
% 再次判断下一通道号8f
init= fread(s,1,'uint8');
while(init~=0x8F)
init = fread(s,1,'uint8');
end
out = fread(s,2,'uint8');
init = fread(s,24,'uint8'); % 读取24个字节。88 XX XX .....8F XX XX
i=i+1;
if(init(1)==0x88)
num1 = init(2)*256+init(3);%转化10进制
num1=num1*10/32768;%公式计算电压
CH1(i)=num1;% 纵坐标电压存储在数组CH1
i1(i)=i;% 横坐标点数存储在i1
fprintf(fid,'CH1,%g,%02x %02x\n',num1,init(2),init(3));% 写入CH1电压数据
figure(1);
subplot(4,1,1);
ylabel('CH1电压','rotation',0,'FontSize',10)
str=sprintf('CH1电压(V):%g',num1);
title(str,'FontSize',10);
hold on
grid on
plot(CH1,'-*r');
% pause(0.002);% 暂停执行 0.002 秒
else fprintf(fid,'CH1,error\n');
CH1(i)=num1;% 纵坐标电压存储在数组CH1 接着以以前值画图代入该点
end
if(init(4)==0x89 )
num2 = init(5)*256+init(6);
num2=num2*10/32768;
CH2(i)=num2;% 纵坐标电压存储在数组CH2
i2(i)=i;% 横坐标点数存储在i1
fprintf(fid,'CH2,%g,%02x %02x\n',num2,init(5),init(6));
figure(1);
subplot(4,1,2);
ylabel('CH2电压','rotation',0,'FontSize',10)
str=sprintf('CH2电压(V):%g',num2);
title(str,'FontSize',10);
hold on
grid on
plot(CH2,'-*b');
% pause(0.002);% 暂停执行 0.002 秒
else fprintf(fid,'CH2,error\n');
CH2(i)=num2;% 纵坐标电压存储在数组CH2 接着以以前值画图代入该点
end
if(init(7)==0x8A )
num3 = init(8)*256+init(9);
num3=num3*10/32768;
CH3(i)=num3;% 纵坐标电压存储在数组CH3
i3(i)=i;% 横坐标点数存储在i1
fprintf(fid,'CH3,%g,%02x %02x\n',num3,init(8),init(9));
figure(1);
subplot(4,1,3);
ylabel('CH3电压','rotation',0,'FontSize',10)
str=sprintf('CH3电压(V):%g',num3);
title(str,'FontSize',10);
hold on
grid on
plot(CH3,'-*g');
% pause(0.002);% 暂停执行 0.002 秒
else fprintf(fid,'CH3,error\n');
end
if(init(10)==0x8B )
num4 = init(11)*256+init(12);
num4=num4*10/32768;
CH4(i)=num4;% 纵坐标电压存储在数组CH4
i4(i)=i;% 横坐标点数存储在i1
fprintf(fid,'CH4,%g,%02x %02x\n',num4,init(11),init(12));
figure(1);
subplot(4,1,4);
ylabel('CH4电压','rotation',0,'FontSize',10)
str=sprintf('CH4电压(V):%g',num4);
title(str,'FontSize',10);
hold on
grid on
plot(CH4,'-*y');
% pause(0.002);% 暂停执行 0.002 秒
else fprintf(fid,'CH4,error\n');
CH3(i)=num3;% 纵坐标电压存储在数组CH3 接着以以前值画图代入该点
end
if(init(13)==0x8C )
num5 = init(14)*256+init(15);
num5=num5*10/32768;
CH5(i)=num5;% 纵坐标电压存储在数组CH5
i5(i)=i;% 横坐标点数存储在i1
fprintf(fid,'CH5,%g,%02x %02x\n',num5,init(14),init(15));
figure(2);
subplot(4,1,1);
ylabel('CH5电压','rotation',0,'FontSize',10)
str=sprintf('CH5电压(V):%g',num5);
title(str,'FontSize',10);
hold on
grid on
plot(CH5,'-*r');
% pause(0.002);% 暂停执行 0.002 秒
else fprintf(fid,'CH5,error\n');
CH5(i)=num5;% 纵坐标电压存储在数组CH5 接着以以前值画图代入该点
end
if(init(16)==0x8D )
num6 = init(17)*256+init(18);
num6=num6*10/32768;
CH6(i)=num6;% 纵坐标电压存储在数组CH1
i6(i)=i;% 横坐标点数存储在i1
fprintf(fid,'CH6,%g,%02x %02x\n',num6,init(17),init(18));
figure(2);
subplot(4,1,2);
ylabel('CH6电压','rotation',0,'FontSize',10)
str=sprintf('CH6电压(V):%g',num6);
title(str,'FontSize',10);
hold on
grid on
plot(CH6,'-*b');
% pause(0.002);% 暂停执行 0.002 秒
else fprintf(fid,'CH6,error\n');
CH6(i)=num6;% 纵坐标电压存储在数组CH6 接着以以前值画图代入该点
end
if(init(19)==0x8E )
num7 = init(20)*256+init(21);
num7=num7*10/32768;
CH7(i)=num7;% 纵坐标电压存储在数组CH7
i7(i)=i;% 横坐标点数存储在i1
fprintf(fid,'CH7,%g,%02x %02x\n',num7,init(20),init(21));
figure(2);
subplot(4,1,3);
ylabel('CH7电压','rotation',0,'FontSize',10)
str=sprintf('CH7电压(V):%g',num7);
title(str,'FontSize',10);
hold on
grid on
plot(CH7,'-*g');
% pause(0.002);% 暂停执行 0.002 秒
else fprintf(fid,'CH7,error\n');
CH7(i)=num7;% 纵坐标电压存储在数组CH7 接着以以前值画图代入该点
end
if(init(22)==0x8F )
num8 = init(23)*256+init(24);
num8=num8*10/32768;
CH8(i)=num8;% 纵坐标电压存储在数组CH8
i8(i)=i;% 横坐标点数存储在i1
fprintf(fid,'CH8,%g,%02x %02x\n',num8,init(23),init(24));
figure(2);
subplot(4,1,4);
ylabel('CH8电压','rotation',0,'FontSize',10)
str=sprintf('CH8电压(V):%g',num8);
title(str,'FontSize',10);
hold on
grid on
plot(CH8,'-*y');
% pause(0.002);% 暂停执行 0.002 秒
else fprintf(fid,'CH8,error\n');
CH8(i)=num8;% 纵坐标电压存储在数组CH8 接着以以前值画图代入该点
end
flush(s);% 清空缓存
end
fclose(s);
fclose(fid);
运行结果:
程序目录下会生成保存的数据
打开看看:
一切正常 ;如果有帮助,请点赞收藏