首页 > 解决方案 > 使用来自 arduino 串行打印的数据更新 matlab 中的线图,为什么会出现“数组形状错误”错误?

问题描述

我有一个有效的代码版本,我每次都将每个值单独分配给一个新变量。有人告诉我应该将其保留为矩阵并使用索引来访问各个值以使代码更好(当我进行一些请求的更改时,我意识到如果我可以让它以这种方式工作会更简单)。我正在从 arduino 串行打印中读取 10 个温度值并将它们绘制在图表上。使用当前代码,我收到此错误:

警告:创建或更新以下一个或多个属性值中的行错误:XData YData 数组的形状或大小错误

我不完全理解这段代码的 tic/toc 部分是如何工作的,我认为这可能是我出错的地方。谢谢您的帮助!(下面的代码)

clear all;
clc;
delete(instrfindall); %pre-emptively close all ports
a = serial('COM6', 'BaudRate', 9600);
flushinput(a);

fopen(a); %initiate arduino connection


Tmax = 180; %(total data collection time (s))
Ts = 1; %(sampling interval (s))
SensorNum = 10; %(Number of PT100s connected to board)



%create live data figure window
figure,
grid on,
grid minor,
xlabel ('Time (s)'), ylabel('Temperature (K)'),

%read and plot data from arduino
ii = 0;
dataa = 0;
t = 0;

tic % Start timer

while toc <= Tmax
    ii = ii + 1;
    dataa = fscanf(a);
    y = strsplit (dataa, ',');
    if(length(str2double(y))<SensorNum)
        disp("Output length mismatch");
        y = NaN(10,1);
    end
    flushinput(a);
    t(ii) = toc;
    if ii > 1
        T = toc - t(ii-1);
        while T < Ts
            T = toc - t(ii-1);
        end
    end
    t(ii) = toc;


    %% Plot live data
    if ii > 1
        x = t(ii);
        for i = 1:SensorNum
            line(x, (y{i}))
        end
        drawnow
    end

end
fclose(a);

标签: matlabarduino

解决方案


替换line(x, (y{i}))line(x, str2double(y{i}))

您收到一条警告消息,因为y{i}它是一个字符数组,而不是一个标量值。

y = strsplit (dataa, ',');返回像{'11.1'} {'22.2'} {'33.3'}...一样的单元格数组,其中每个单元格都是一个字符数组(“字符串”)。

Executing line(x, (y{i})), 相当于正在执行line(1, '11.1'), 会产生警告信息。

备注:我的回答仅适用于警告消息 - 我没有检查您代码中的其他问题。


推荐阅读