matlab - 使用 Matlab 串口实现 2 赫兹数据记录

标签 matlab logging serial-port instrumentation

我正在尝试使用 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

我觉得必须有某种方法可以与乐器完全同步采样,但我无法弄清楚。任何帮助、建议或想法将不胜感激!谢谢!

最佳答案

不要依赖tictoc。这些函数使用操作系统调用提供的时间。 Mathworks 声称使用高分辨率计时器,但不要依赖于此!如果您不使用实时操作系统,这些测量值可能会出现未知的变化。

采样应由具有实时功能的硬件执行。就你而言,我怀疑你的采样率实际上是由你的仪器控制的。仪器的输出由串行接口(interface)缓冲。因此,在我看来,Matlab 根本不影响采样率。 (只要缓冲区不溢出)

尝试采集大约 2000 个或更多样本,看看需要多长时间。然后将总时间除以样本数 (-1),并将其与预期 0.5 秒进行比较。如果有差异,请尝试调整仪器的配置。

关于matlab - 使用 Matlab 串口实现 2 赫兹数据记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26963797/

相关文章:

matlab - 将 3d 坐标存储在点列表中 Matlab

svn - 我可以从本地副本中检索SVN日志吗?

c# - 为什么 'using'语句好像没有释放串口?

matlab - `GLIBCXX_3.4.11' 未找到,从链接到 glibc 的 MATLAB 运行系统调用不同于 matlab bin 路径中的内容

matlab - 绘制带有误差条的曲线拟合图

matlab - 有没有同时清除工作区和命令窗口的命令或方法?

Java Logger 在主目录中创建空日志文件

javascript - 处理数据流的日志记录

C读取并解析串口

c# - 创建虚拟 COM 端口