我正在尝试使用 matlab 通过 licor820 仪器进行数据采集。仪器以2赫兹输出数据。
我尝试了许多不同的方法,使用无限循环、异步采样 (readasync) 和定时读数,但我无法获取 2 赫兹数据。我得到的读数在 0.51 秒范围内。这是我的方法的三个例子。任何有关我可能做错了什么或如何以最高频率正确采样的建议将不胜感激!
示例1:使用readasync
tinit=tic; %initialization timer
s=serial('COM4') %,'InputBufferSize',40);
fopen(s)
while toc(tinit)<2 %allow time to initialize
end
while 1<2 %infinite loop for continuous sampling
readasync(s)
data=fscanf(s)
toc %allows me to see time between data acquisitions
tic
end
示例 2:使用可用字节。 我的想法是在拥有所需的最小字节量时获取数据。尽管我不确定如何确定我的仪器需要多少字节,除了通过目视查看数据并将其缩小到 40 字节左右:
while 1<2 %infinite loop for continuous sampling
if s.BytesAvailable >35
scandata=fscanf(s);
toc
tic
end
end
示例 3:时间强制。 由于我需要 2 赫兹数据,因此我的想法是每隔 0.49 秒强制读取一次缓冲区。我在这里看到的奇怪的事情是,它最初每 0.49 秒提供一次样本,但是当我监视端口上的可用字节时,我发现它从 512 稳步下降,直到达到 0,然后我停止获取 0.49 秒的样本。我想我不太明白如何有效地使用串行。
while 1<2 %infinite loop
if toc(t2)>=.49 %only sample after .49 seconds have passed
t2=tic; %reinitiate the tic for this forced time loop
bytes=s.BytesAvailable %to monitor how many bytes there are at the port
scandata=fscanf(s);
if ~isempty(scandata) && length(scandata)== 3 %checks for successful read
toc
tic
end
end
end
我觉得必须有某种方法可以与乐器完全同步采样,但我无法弄清楚。任何帮助、建议或想法将不胜感激!谢谢!
最佳答案
不要依赖tic
和toc
。这些函数使用操作系统调用提供的时间。 Mathworks 声称使用高分辨率计时器,但不要依赖于此!如果您不使用实时操作系统,这些测量值可能会出现未知的变化。
采样应由具有实时功能的硬件执行。就你而言,我怀疑你的采样率实际上是由你的仪器控制的。仪器的输出由串行接口(interface)缓冲。因此,在我看来,Matlab 根本不影响采样率。 (只要缓冲区不溢出)
尝试采集大约 2000 个或更多样本,看看需要多长时间。然后将总时间除以样本数 (-1),并将其与预期 0.5 秒进行比较。如果有差异,请尝试调整仪器的配置。
关于matlab - 使用 Matlab 串口实现 2 赫兹数据记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26963797/