Arduino Matlab串口通讯速度快

时间:2017-03-04 11:50:58

标签: matlab arduino serial-port serial-communication

我在一个简单的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

问题是速度真的很低,我检查了两次读数之间的时间,我得到的是在下面的图片中描述的 enter image description here

除了周期性发生的尖峰外,我的速度很快。在这些情况下,两个读数之间的间隔大于0.1秒。

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