matlab - 使用来自 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);
解决方案
替换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')
, 会产生警告信息。
备注:我的回答仅适用于警告消息 - 我没有检查您代码中的其他问题。
推荐阅读
- php - 为什么 POST 值在数据库中保存为空,但 var_dumps / echos 很好?
- java - spring boot rest api上的异步-注释应仅在服务上或控制器上
- java - 为什么具有 void 返回类型方法的功能接口接受任何返回类型方法?
- azure - Azure Function App 使用 java 中的 startCopy 将 blob 从一个容器复制到另一个容器
- python - Matplotlib 颜色栏不缩小
- c++ - 在 c++ 中正确使用 .find() 方法
- python - python无法使用HTTP请求从异步函数获取返回值
- python-3.x - 从熊猫列表中删除重复项
- bash - 使用/解析远程变量时如何正确转义单引号?
- android - 迁移到 AndroidX 异常