提高实时串行数据绘图代码效率的技巧

问题描述 投票:0回答:2

我正在寻找有关如何改进代码的建议,以便使它能够更实时地有效运行。我花了相当多的时间试图弄清楚如何向量化我的优点并减少循环,并更好地实时绘制数据(使用Matlab R2019a)

我希望提出建议

1)代码向量化

2)试图弄清楚如何将hold与子图一起使用。目前,在进入串行数据例程之前,我会初始化子图和绘图。但是,不是将每个数据点都添加到绘图中,而是使用set命令在每次迭代中重复绘制从开始到当前点的所有XData和YData,我认为这很浪费。

3)其他效率建议

4)f.stop是创建按钮的功能,让我可以启动和停止例程。如果有更好的方法来执行此操作,例如使用绘图句柄以使例程在我关闭绘图时停止,那么也将不胜感激

代码背景

该代码从arduino控制的定制电路板上串行读取和绘制多路复用电容数据。电路板正在轮询一个3x3的电容器单元阵列,其中每个单元具有4个差分电容信号-总共36个信号。这被绘制成一个3x3子图,每个图中有4个信号。数据只是数字流,我使用29069和29070作为标记,以便让我知道电路板何时开始并完成对所有激励通道的轮询。通过依次查看所有12个激励通道信号并将其分成4组,进入下一个电容通道,总共重复3次此过程(案例陈述),从而读取数据流。

%% Serial Data Acquisition from Arduino to Matlab
clc
clear all
close all
%Preallocate Arrays
c1 = zeros(4,1000);
c2 = zeros(4,1000);
c3 = zeros(4,1000);
c4 = zeros(4,1000);
c5 = zeros(4,1000);
c6 = zeros(4,1000);
c7 = zeros(4,1000);
c8 = zeros(4,1000);
c9 = zeros(4,1000);
c1_timer = zeros(5,1000);
incoming_data_1 = zeros(4,8)
incoming_data_2 = zeros(4,8)
incoming_data_3 = zeros(4,8)
arduino=serial('COM5','BaudRate',38400);
count = 1;
flag = 0;
f = stoploop
plot_count_1 = 1;
plot_count_2 = 1;
plot_count_3 = 1;
data_count = 1;
exc_ch_number = 1;
total_exc_ch_number = 13;
cin_ch_number = 1;
total_cin_ch_number = 3;
% Setup the Initial Plot
figure(1)
subplot(3,3,1)
plotGraph1 = plot(1:plot_count_1,c1(:,1:plot_count_1));
xtickangle(90)
legend('Top Left', 'Bot Left', 'Bot Right', 'Top Right', 'Location','southwest');
subplot(3,3,2)
plotGraph2 = plot(1:plot_count_1,c2(:,1:plot_count_1));
xtickangle(90)
legend('Top Left', 'Bot Left', 'Bot Right', 'Top Right', 'Location','southwest');
subplot(3,3,3)
plotGraph3 = plot(1:plot_count_2,c3(:,1:plot_count_1));
xtickangle(90)
legend('Top Left', 'Bot Left', 'Bot Right', 'Top Right', 'Location','southwest');
subplot(3,3,4)
plotGraph4 = plot(1:plot_count_2,c4(:,1:plot_count_2));
xtickangle(90)
legend('Top Left', 'Bot Left', 'Bot Right', 'Top Right', 'Location','southwest');
subplot(3,3,5)
plotGraph5 = plot(1:plot_count_2,c5(:,1:plot_count_2));
xtickangle(90)
legend('Top Left', 'Bot Left', 'Bot Right', 'Top Right', 'Location','southwest');
subplot(3,3,6)
plotGraph6 = plot(1:plot_count_2,c6(:,1:plot_count_2));
xtickangle(90)
legend('Top Left', 'Bot Left', 'Bot Right', 'Top Right', 'Location','southwest');
subplot(3,3,7)
plotGraph7 = plot(1:plot_count_3,c7(:,1:plot_count_3));
xtickangle(90)
legend('Top Left', 'Bot Left', 'Bot Right', 'Top Right', 'Location','southwest');
subplot(3,3,8)
plotGraph8 = plot(1:plot_count_3,c8(:,1:plot_count_3));
xtickangle(90)
legend('Top Left', 'Bot Left', 'Bot Right', 'Top Right', 'Location','southwest');
subplot(3,3,9)
plotGraph9 = plot(1:plot_count_3,c9(:,1:plot_count_3));
xtickangle(90)
legend('Top Left', 'Bot Left', 'Bot Right', 'Top Right', 'Location','southwest');
fopen(arduino)
timer_value = tic;
% Start the Serial Data read routine
while (~f.Stop())

    data = fscanf(arduino, '%d')


     if(data == 29069)
        flag = 1;
        continue

     elseif(data == 29070)
         flag = 0;
         data_count = 1;
         exc_ch_number =  exc_ch_number+1;


         if(exc_ch_number>total_exc_ch_number)
             exc_ch_number = 1

             switch cin_ch_number
             case 1
             c1(1:4,plot_count_1) = ((incoming_data_1(3,1:4)'./16777215).*8.192)-4.096;
             c1_timer(5,plot_count_1) = round(toc(timer_value));
             c2(1:4,plot_count_1) = ((incoming_data_1(3,[5 6 7 8])'./16777215).*8.192)-4.096;
             c3(1:4,plot_count_1) = ((incoming_data_1(3,9:12)'./16777215).*8.192)-4.096;

             set(plotGraph1,'XData',c1_timer(5,1:plot_count_1),{'YData'},num2cell(c1(:,1:plot_count_1),2));

             set(plotGraph2,'XData',c1_timer(5,1:plot_count_1),{'YData'},num2cell(c2(:,1:plot_count_1),2));

             set(plotGraph3,'XData',c1_timer(5,1:plot_count_1),{'YData'},num2cell(c3(:,1:plot_count_1),2));

             plot_count_1 = plot_count_1+1;

             case 2
             c4(1:4,plot_count_2) = ((incoming_data_2(3,1:4)'./16777215).*8.192)-4.096;
             c5(1:4,plot_count_2) = ((incoming_data_2(3,[5 6 7 8])'./16777215).*8.192)-4.096;
             c6(1:4,plot_count_2) = ((incoming_data_2(3,9:12)'./16777215).*8.192)-4.096;

             set(plotGraph4,'XData',c1_timer(5,1:plot_count_2),{'YData'},num2cell(c4(:,1:plot_count_2),2));

             set(plotGraph5,'XData',c1_timer(5,1:plot_count_2),{'YData'},num2cell(c5(:,1:plot_count_2),2));

             set(plotGraph6,'XData',c1_timer(5,1:plot_count_2),{'YData'},num2cell(c6(:,1:plot_count_2),2));

             plot_count_2 = plot_count_2+1;


             case 3
             c7(1:4,plot_count_3) = ((incoming_data_3(3,1:4)'./16777215).*8.192)-4.096;
             c8(1:4,plot_count_3) = ((incoming_data_3(3,[5 6 7 8])'./16777215).*8.192)-4.096;
             c9(1:4,plot_count_3) = ((incoming_data_3(3,9:12)'./16777215).*8.192)-4.096;

             set(plotGraph7,'XData',c1_timer(5,1:plot_count_3),{'YData'},num2cell(c7(:,1:plot_count_3),2));

             set(plotGraph8,'XData',c1_timer(5,1:plot_count_3),{'YData'},num2cell(c8(:,1:plot_count_3),2));

             set(plotGraph9,'XData',c1_timer(5,1:plot_count_3),{'YData'},num2cell(c9(:,1:plot_count_3),2));

             plot_count_3 = plot_count_3+1;

             end

             cin_ch_number = cin_ch_number+1;


             if(cin_ch_number>total_cin_ch_number)
                 cin_ch_number = 1;
             end
         end
     end


     if(flag==1)
         switch cin_ch_number
             case 1
                 incoming_data_1(data_count,exc_ch_number) = data;

             case 2
                 incoming_data_2(data_count,exc_ch_number) = data;

             case 3
                 incoming_data_3(data_count,exc_ch_number) = data;
         end

         data_count = data_count+1;
     end



end
delete(arduino)
clear arduino

我正在寻找有关如何改进代码的建议,以便使它能够更实时地有效运行。我花了很多时间试图弄清楚如何对我的商品进行矢量化,然后...

matlab plot serial-port real-time matlab-figure
2个回答
0
投票

我没有尝试运行您的代码,因为如果没有缺少的功能或arduino硬件,很难做到。您应该查看提供最小限度,可重现示例的文档:https://stackoverflow.com/help/minimal-reproducible-example但是,我绝对可以提供一些建议:


0
投票

您已将数据数组预先分配给1000个元素,但不能保证您不会使用更多。因此,您可能会扩展这些数组,这会花费时间。

© www.soinside.com 2019 - 2024. All rights reserved.