我遇到了一个部分与Matlab和部分一般编程有关的问题,我希望有人能帮助我为解决方案进行头脑风暴。如何在Matlab的串口上同步读取二进制流的数据流
我有一个外部微控制器,每400ms产生一个大量的二进制数据流(〜40kb),并通过UART发送到运行Matlab脚本的PC。数据不是以十六进制或十进制字符编码,而是真正的二进制(因此,没有定义终结符,因为所有256个值都是可能的,有效的数据组合)。波特率被设定为1024000总之,它需要大约375ms用于数据的整个流被在
在Matlab中,串行端口配置是否正确(也1024000,8倍的位流之间发送的,与死区时间为25ms ,1个停止位,无奇偶校验,无硬件流量控制等)。我能够正确读出我通过微控制器发送的数据(即没有数据损坏),但我无法在Matlab上同步串行读数。我的脚本如下:
function data_show = GetDATA
if ~isempty(instrfind)
fclose(instrfind);
end
DATA_TOTAL_SIZE = 38400;
DATA_buffer = uint8(zeros(DATA_TOTAL_SIZE,1));
DATA_show = reshape(DATA_buffer(1:2:end)',[160,120])';
f_data_in = false;
f_data_out = true;
serialport = serial('COM11','BaudRate',1024000,'DataBits',8,'FlowControl','none','Parity','none','StopBits',1,...
'BytesAvailableFcnCount',DATA_TOTAL_SIZE,'BytesAvailableFcnMode','byte','InputBufferSize',DATA_TOTAL_SIZE * 2,...
'BytesAvailableFcn',@GetPortData);
fopen(serialport);
while (get(serialport,'BytesAvailable') ~= 0) % Skip first packet which might be incomplete
fread(serialport,DATA_TOTAL_SIZE,'uint8');
end
f_data_out = true;
while (1)
if (f_data_in)
DATA_buffer = fread(serialport,DATA_TOTAL_SIZE,'uint8');
DATA_show = reshape(DATA_buffer(1:2:end)',[160,120])'; %Reshape array as matrix
DATAsc(DATA_show);
disp('DATA');
end
pause(0.01);
end
fclose(serialport);
delete(serialport);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function GetPortData (obj,~)
if f_data_out
f_data_in = true;
end
end
end
我看到的问题是,我最终读数始终是正确的大小,而是属于多个流,因为我还没有找到一种方法来告诉MATLAB这些为25ms没有数据应该用于同步(即在该空白时段之前和之后的数据应该属于不同的流)。
有没有人有任何建议呢?
非常感谢!