【发布时间】:2014-11-17 20:46:28
【问题描述】:
我正在尝试使用 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
我觉得一定有某种方法可以与乐器完全同步采样,但我想不通。任何帮助、建议或想法将不胜感激!谢谢!
【问题讨论】:
-
我知道这是旧的,但我早就想通了,想对可能有类似问题的人发表评论。问题肯定是 licor800 仪器以不完全在 2hz 的间隔输出数据。我展示的代码也很垃圾。我现在有更好的代码,功能和简单得多。想要的话私信我。
标签: matlab logging serial-port instrumentation