我正在使用Kitronyx Snowboard(它有一个Arduino Leonardo)和Matrix Sensor 1610.我想将我的数据从串口直接读入Matlab并进行可视化。
我认为有两个问题与我有关: 首先,我可以阅读矩阵,但有延迟。我等待的时间越长,延迟时间越长。
过了一会儿,我总会得到:
使用serial / fprintf时出错(第144行)
意外错误:写入操作期间发生超时..
InputBufferSize越大,我绘制数据的时间越长(由于问题1,这并不重要)
我如何知道方便的缓冲区大小?有谁知道为什么延迟以及如何摆脱它?
非常感谢你提前
麦克
close all %close all figures
clear all %clear all workspace variables
fclose('all') %close all Files
delete(instrfindall) %Reset Com Port
delete(timerfindall) %Delete Timers
% setup serial
serialPort = serial('COM3');
command = 'A';
nrow = 16;
ncol = 10;
row_index = [9,10,11,12,13,14,15,16,8,7,6,5,4,3,2,1];
col_index = [1,2,3,4,5,6,7,8,9,10];
% 10x16 = 160 bytes
lendata = 160;
BaudRate = 11520;
InputBufferSize = 115200;
Timeout = 5;
set(serialPort , 'BaudRate', BaudRate);
set(serialPort , 'InputBufferSize', InputBufferSize);
set(serialPort , 'Timeout', Timeout);
fopen(serialPort);
while 1
% Request data
fprintf(serialPort, command);
% Get data
%Data is read as string (CSV)
data_string = fgets(serialPort);
data_string_array = strsplit(data_string, ',');
data = str2double(data_string_array);
% Reshape data (1D -> 2D array)
data2d = zeros(nrow, ncol);
k = 1;
for i = 1:nrow
for j = 1:ncol
data2d(row_index(i), col_index(j)) = data(k);
k = k + 1;
end
end
%resize 16x10 image to 160x100 image
data2d_resized = imresize(data2d,50);
imshow(data2d_resized,[0 100]);
end
答案 0 :(得分:1)
我认为我们没有足够的信息给出明确的答案,但有一些考虑因素。
1)输入缓冲区只是用于保存在串行端口接收的数据的存储器。数据填充缓冲区,直到您使用read语句(fgets(), fread()
等)删除它。只要缓冲区大小大于您在读取周期之间接收的数据量(见下文),并且它相对于可用RAM的数量很小,就不会有问题。
2)命令fgets()
返回带有字符串的行终止符。你不需要这些角色;请考虑使用fegtl()
或fscanf()
。
3)您描述的症状听起来像是Arduino每次迭代发送更多数据,或者发送数据的速度比Matlab程序可以处理的速度快。您的代码编写方式如果有更多数据到达,您将不会注意到这一点,直到输入缓冲区已满并且事情开始崩溃。
尝试打印输入缓冲区(disp(serialPort.BytesAvailable)
)中的数据大小以及每次迭代中返回的字符串长度。
如果这是问题所在,您可能必须实现一些流量控制 - 让Matlab程序在准备好更多数据时将字符发送回Arduino。或者在每个读取周期中读取输入缓冲区中的所有数据,而不仅仅是一行。
4)如果matlab执行速度是一个问题,请考虑更换"重塑"使用reshape
命令循环。 For循环总是比内置函数慢。