【问题标题】:Serial communication in Matlab is really slow. Is there a way to speed it up?Matlab 中的串行通信真的很慢。有没有办法加快速度?
【发布时间】:2011-04-09 13:45:43
【问题描述】:

我在 Matlab 中为一些串行通信 (RS232) 编写了一个程序,该程序应该与微处理器通信。从它接收数据可以正常工作,但是在发送数据时,2 个字节的数据需要 0.2-0.5 秒。有没有一种已知的方法可以加快 Matlab 中的串行通信速度,或者我必须忍受这个?

这是我用来编写的代码:

% confa serieporten
com_port = '/dev/tty.FireFly-16CB-SPP';
ser = serial(com_port, 'BaudRate', 115200);
ser.BytesAvailableFcnCount = 1;
ser.BytesAvailableFcnMode = 'byte';
ser.Timeout = 5;


i = 1;
while i <=length(buffer)
fwrite(ser, buffer(i));
i = i + 1;
end

【问题讨论】:

  • 您可以尝试在 MATLAB JVM 中使用 Java。

标签: matlab serial-port


【解决方案1】:

首先,在进行任何优化之前,您应该进行分析。

菜单 -> 桌面 -> 分析器

打开 Matlab 分析器,运行您的程序并发现瓶颈所在。

【讨论】:

    【解决方案2】:

    我很确定 SERIAL 对象正在使用 Java API(至少,它曾经使用过;自从我使用它以来,实现可能已经改变)。与在 MATLAB 中“直接”与 Java 对象对话相比,使用 MATLAB 对象系统的开销是微不足道的。因此,我不会费心尝试跳过 SERIAL 对象并“直接使用 Java”。

    我的问题是,“您必须尝试立即发送每个字节吗?”如果您为BytesAvailableFcnCount 使用更大的值,通信应该会更有效。

    除非您的硬件有非常特殊的限制,否则我建议您选择更大的缓冲区大小。 (这可能要求您在数据流结束时强制刷新,因为您不能指望自动写入非常字节。但大概,您已经在适当的时间关闭和删除对象,因此同时额外刷新缓冲区应该不难)。

    如果您不指定值,MATLAB 将使用 48 字节的默认值。我不记得那个确切的值是如何选择的,但是一次写入多个值比写入缓冲区并一次刷新一个字节要高效得多。

    编辑:另一个想法;我现在没有 MATLAB 来测试它,但是如果您for 循环中写入数据会发生什么 - 而是将 BytesAvailableFcnCount 设置为 1,并一次性写入整个缓冲区?

    我阅读documentationBytesAvailableFcnCount 的方式仅指定缓冲区在刷新之前可以达到多大的“触发器”,而不是缓冲区可以有多大。因此,将BytesAvailableFcnCount 设为 1 并一次性写入大小为 128 的缓冲区可能只刷新一次设备,而不是现有代码执行的 128 次。 p>

    【讨论】:

      猜你喜欢
      • 2011-06-18
      • 1970-01-01
      • 2012-03-21
      • 2015-10-08
      • 1970-01-01
      • 2020-04-01
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多