我目前正在开发一个基于GUI的应用程序,它记录来自嵌入式系统的串行数据,该系统以50Hz的频率传输。问题是MATLAB似乎无法可靠地记录这些数据,并丢弃样本。传输数据的格式如下:
4918 22279 29342 3161 0 24953 29814 5319 1 0
4919 22279 29348 2997 1 24953 29838 5037 0 0
4920 22279 29357 2682 0 24953 29853 4544 0 0
每行由CR / LF终止。我已经编写了一个测试函数来试图弄清楚发生了什么 - 下面是代码。
function stack_stream(time)
column_count = 10;
serial_object = create_serial_object;
fopen(serial_object);
date_vector = clock;
file_name = datestr(date_vector,30);
file_name = [file_name '.txt'];
file_identifier = fopen(file_name,'w');
tic;
while (toc < time)
if (serial_object.UserData.is_new_data == true)
raw_chunk = serial_object.UserData.data;
serial_object.UserData.is_new_data = false;
data_chunk = sscanf(raw_chunk,'%d');
data_chunk_length = length(data_chunk);
if (mod(data_chunk_length,column_count) == 0)
data_column_count = data_chunk_length/column_count;
data = reshape(data_chunk,column_count,data_column_count);
fprintf(file_identifier,...
'%6d %6d %6d %6d %6d %6d %6d %6d %6d %6d\r\n',data);
end
end
end
fclose(file_identifier);
fclose(serial_object);
delete(serial_object);
end
function serial_object_callback(object,event)
new_data = fscanf(object,'%c',object.BytesAvailable);
if (object.UserData.is_new_data == false)
object.UserData.data = new_data;
object.UserData.is_new_data = true;
else
object.UserData.data = [object.UserData.data new_data];
end
end
function serial_object = create_serial_object()
serial_object = serial('COM2');
serial_object.BaudRate = 57600;
serial_object.DataBits = 8;
serial_object.FlowControl = 'none';
serial_object.StopBits = 1;
serial_object.Terminator = 'CR/LF';
serial_object.InputBufferSize = 2^18;
serial_object.BytesAvailableFcnMode = 'terminator';
serial_object.BytesAvailableFcn = {@serial_object_callback};
serial_object.UserData.data = [];
serial_object.UserData.is_new_data = false;
serial_object.UserData.response = [];
serial_object.UserData.is_new_response = false;
end
本质上,此函数将time
秒的数据写入文件,使用回调在串行对象缓冲区和用户缓冲区之间传输数据。使用stack_stream
我发现每收到3000个,我就会错过大约10行数据 - 即每分钟大约10行。
轶事证据会让我相信MATLAB能够处理kHz范围内的串行数据,所以我有点不知道为什么我无法让它在微小的50Hz下正常工作。有什么办法可以提高性能而不必诉诸于Windows等的实时目标吗?