我正在使用Arduino的模拟引脚来测量电压,并使用shift_jis
将其打印到串行端口。这是可行的,它以serial.print(string)
的形式输出一个值,该值具有不同的长度,这是我在串行查看器中检查的。要阅读它,我将 Matlab 与xxxx.yyyy
或fscanf()
一起使用。这显示了正确的内容fgetl()
,但有一种奇怪的延迟。当我改变电压时,读数会滞后5-10秒,但是当我在此aaaa.bbbb
内将电压从0增大到3至5时,就像3到5之间的3秒一样,读数也会发生变化。它与我更改电压的方式不同,但是它确实获得了这些值,就好像是2步输入一样,即使我不是很快地手动更改它们。
在阅读和研究时,我遇到了一个事实,即BaudRate可能太低,因此我将其更改为Arduino的最大值115200。我将 Matlab 代码中的值更改为好。我还尝试了带有timeframe
函数的Arduino硬件支持包,但是采样率太低。
串行端口的设置:
readVoltage()
阅读循环:
s = serial('com3');
set(s, 'BaudRate', 115200); % set BaudRate to 115200
set(s, 'Parity', 'none'); % set Parity Bit to None
set(s, 'DataBits', 8); % set DataBits to 8
set(s, 'StopBit', 1); % set StopBit to 1
set(s,'Terminator','LF') % set terminating character to LF/new line
fopen(s);
没有错误消息,使用其他串行端口,我没有明显的延迟。使用Matlab也应该可以做到这一点,因为使用此工具人们可以获得2-3kHz的刷新率。
答案 0 :(得分:0)
问题在于您在循环中使用plot
的方式。这是非常低效的。
根据您的Matlab版本和串行链接的开销,您也许可以加快循环开始时调用clf
的速度,以防止大量图相互叠加。 / p>
如果问题仍然存在,您可能需要在循环中尝试animated line
和addpoints
。
最后,您可能需要检查以下几件事:Matlab的Arduino connection(我自己从未尝试过,但我读过它提供了不错的性能),而您的latency timer串行端口(可能会以低波特率起作用)。