Matlab中的串行通信非常慢。有没有办法加快速度?

时间:2011-04-09 13:45:44

标签: matlab serial-port

我在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

2 个答案:

答案 0 :(得分:2)

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

我的问题是,“你 尝试立即发送每个字节 ?”如果对BytesAvailableFcnCount使用更大的值,则通信效率会更高。

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

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

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

我读取documentation的方式,BytesAvailableFcnCount仅指定缓冲区在刷新之前可以获得多大的“触发器”,缓冲区可以有多大是。因此,如果BytesAvailableFcnCount为1并且一次性写入大小的缓冲区(比如说)128,那么可能只刷新一次,而不是现有代码执行的128次。

答案 1 :(得分:2)

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

  

菜单 - &gt;桌面 - &gt;概述

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