2015-03-02 53 views
1

我遇到了一个部分与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没有数据应该用于同步(即在该空白时段之前和之后的数据应该属于不同的流)。

有没有人有任何建议呢?

非常感谢!

回答

0

为了完整,我想发布当前的实现我已经解决了这个问题,这可能不是一个合适的解决方案,但可能在某些情况下是有用的。

我采取的方法是转入双向通信协议,其中Matlab通过发送非常短的命令作为触发器(例如单个非打印字符)来启动流式传输。鉴于高波特率,它不会因微控制器侧的处理而增加显着的延迟。微控制器在接收到这个触发信号后,只发送一个完整的数据包(而不是以5Hz的速率连续流式传输数据包)。通过在发布触发器后立即强制Matlab获取已知长度的串行包,它确保只收到一个包并且没有同步问题。

然后它就成了一个将Matlab脚本封装在一个例程中的问题,该例程中定时器给出了一个5Hz的记号,其中序列被重复(发送触发器,检索包,做任何处理和重复)。这

优点:

  • 它解决了同步问题

缺点是:

  • 有一个计时器滴答运行并不能保证完美的周期性MATLAB,因此触发器可能并不总是以5Hz的频率发送。如果触发器在微控制器的“不方便”时间发送,可能需要跳过程序包,以避免程序包仍在传输时在内存中更新(因为传输占用了200ms时隙的很大一部分)
  • 从经验来看,取决于运行Matlab的PC在做什么,性能可能会有很大差异。例如,当PC自己单独进行采集时它工作正常,但如果使用另一个程序(例如Chrome),Matlab开始滞后并导致触发器传输延迟。

如上所述,这不是一个完整的答案,但它是一种在某些情况下可能足够的方法。如果有人有更高效的选择,请免费分享!