从 Arduino 到 Matlab 的实时数据导入。什么缓冲区大小?为什么延迟?

Real Time Data Import from Arduino to Matlab. What BufferSize? Why delay?

我正在使用带有矩阵传感器 1610 的 Kitronyx 滑雪板(它有一个 Arduino Leonardo)。我想将我的数据从串行端口直接读取到 Matlab 中并将其可视化。

我有两个我认为相关的问题: 首先,我可以阅读 Matrix,但有延迟。我等的时间越长延迟的时间越长。

其次我总会得到:

使用 serial/fprintf 时出错(第 144 行)

意外错误:写入操作期间发生超时..

InputBufferSize 越大,我绘制数据的时间就越长(这并不重要,因为问题一)

我怎么知道合适的缓冲区大小是多少?有谁知道延迟的原因以及如何摆脱延迟?

非常感谢您

麦克

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

我认为我们没有足够的信息来给出明确的答案,但有一些注意事项。

1) 输入缓冲区只是预留的内存,用于保存在串行端口接收到的数据。数据会填满缓冲区,直到您使用读取语句(fgets(), fread() 等)将其删除。只要缓冲区大小大于您将在读取周期之间接收的数据量(见下文),并且相对于可用 RAM 而言是一个较小的数字,就不会成为问题。

2) 命令fgets() returns 行结束字符与字符串。您不需要这些字符;考虑改用 fegtl()fscanf()

3) 你描述的症状听起来像是 Arduino 在每次迭代中发送更多的数据,或者它发送数据的速度比你的 Matlab 程序可以处理它的速度快。您的代码是以这样一种方式编写的:如果到达的数据多于您的预期,您将不会注意到这一点,直到输入缓冲区已满并且事情开始崩溃。 尝试打印输入缓冲区中的数据大小 (disp(serialPort.BytesAvailable)) 和每次迭代返回的字符串的长度。

如果这是问题所在,您可能需要实施一些流程控制 - 让 Matlab 程序在准备好接收更多数据时将字符发送回 Arduino。或者在每个读取周期从输入缓冲区中读取所有数据,而不是只读取一行。

4) 如果 matlab 执行速度是一个问题,请考虑用 reshape 命令替换 "Reshape" 循环。 For 循环总是比内置函数慢。