我在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
答案 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分析器,运行程序并发现瓶颈所在。