使用来自 arduino 串行打印的数据更新 matlab 中的线图,为啥会出现“数组形状错误”错误?
Posted
技术标签:
【中文标题】使用来自 arduino 串行打印的数据更新 matlab 中的线图,为啥会出现“数组形状错误”错误?【英文标题】:updating a line plot in matlab using data from arduino serial print, why am I getting "array in wrong shape" error?使用来自 arduino 串行打印的数据更新 matlab 中的线图,为什么会出现“数组形状错误”错误? 【发布时间】:2020-01-14 12:03:29 【问题描述】:我有一个可以运行的代码版本,我每次都将每个值单独分配给一个新变量。有人告诉我应该将其保留为矩阵并使用索引来访问各个值以使代码更好(当我进行一些请求的更改时,我意识到如果我可以让它以这种方式工作会更简单)。我正在从 arduino 串行打印中读取 10 个温度值并将它们绘制在图表上。使用当前代码,我收到此错误:
警告:创建或更新 Line 时出错 以下一项或多项属性的值错误: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, (yi))
end
drawnow
end
end
fclose(a);
【问题讨论】:
【参考方案1】:将line(x, (yi))
替换为line(x, str2double(yi))
。
您收到一条警告消息,因为yi
是一个字符数组,而不是一个标量值。
y = strsplit (dataa, ',');
返回单元格数组,如 '11.1'
'22.2'
'33.3'
... 其中每个单元格都是一个字符数组(“字符串”)。
执行line(x, (yi))
,相当于执行line(1, '11.1')
,会产生警告信息。
备注:我的回答仅适用于警告消息 - 我没有检查您代码中的其他问题。
【讨论】:
以上是关于使用来自 arduino 串行打印的数据更新 matlab 中的线图,为啥会出现“数组形状错误”错误?的主要内容,如果未能解决你的问题,请参考以下文章
问题:关闭端口后,python 仍然读取来自 arduino 的串行数据。串口无法关闭
通过 QSerialPort 访问来自 Arduino 的串行数据时遇到问题
Python 没有接收到来自 Arduino Mega 2560 的第一行串行数据,而是接收到所有后续数据,为啥会发生这种情况?