我在一个简单的Arduino - Matlab(2014年和2016年)串行通信中遇到了一些问题。 我有一个简单的Arduino草图,它从传感器收集值并通过串行发送它们。 Arduino等待一个字符'r'开始阅读/发送程序
void loop()
{
if(Serial.available())
{
cmd = Serial.read();
if(cmd == 'r')
{
while(1)
{
accelgyro.read();
//acc
raw_values[0] = accelgyro.a.x;
raw_values[1] = accelgyro.a.y;
raw_values[2] = accelgyro.a.z;
//gyro
raw_values[3] = accelgyro.g.x;
raw_values[4] = accelgyro.g.y;
raw_values[5] = accelgyro.g.z;
for (j=0; j<6; j++)
{
Serial.write (highByte(raw_values[j]));
Serial.write (lowByte(raw_values[j]));
}
delay(2);
}
}
}
}
通讯员Matlab代码:
Arduino = serial('COM6','BaudRate',115200);
fopen(Arduino);
flushinput(Arduino)
acqSize = 1000;
pause(2)
'start'
fwrite(Arduino,'r');
tStart = tic;
while( i <=acqSize)
if(Arduino.BytesAvailable>packetSize-1)
lastData = fread(Arduino,packetSize) ;
raw_matrix(:,i) = byteToInt(lastData);
raw_matrix(7,i) = toc(tStart);
tStart = tic;
i=i+1
end
pause(0.001);
end
其中,包大小是从Arduino每个周期发送的字节数,即12
问题是速度真的很低,我检查了两次读数之间的时间,我得到的是在下面的图片中描述的
除了周期性发生的尖峰外,我的速度很快。在这些情况下,两个读数之间的间隔大于0.1秒。
答案 0 :(得分:0)
Matlab中的计时与Arduino上的计时不一样。诸如用于Arduino的嵌入式硬件和小型OS(操作系统)是实时的,并且可以非常精确地保持时序。但是,Matlab需要在Windows,Linux等操作系统上运行。这些不是实时操作系统,并且时间安排不准确且不可预测。因此,如果OS忙于执行其他操作,则定时抖动可能会增加。另外,即使对于非常强大的CPU,也无法实现“ pause(0.001)”。如果对您来说CPU消耗不是问题,则可以删除“暂停”,也可以使用占用CPU并返回更快的代码,如下所示:
function delay(seconds)
% function pause the program
% seconds = delay time in seconds
tic;
while toc < seconds
end
end
更多讨论可以在这里找到: Pause function in matlab for 1 millisecond