matlab 编写AD7606的上位机程序,串口采集数据画图

前面已经撰写了 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);

运行结果:
在这里插入图片描述
程序目录下会生成保存的数据
在这里插入图片描述
打开看看:
在这里插入图片描述
一切正常 ;如果有帮助,请点赞收藏

  • 9
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值