从MATLAB向Arduino发送浮点数数组

时间:2017-02-09 17:48:38

标签: arrays matlab arduino serial-port

我想从MATLAB向Arduino发送一个包含三个浮点数的数组。我试图通过将这些值从Arduino发送回MATLAB来检查Arduino是否收到了这些值。似乎Arduino只能正确读取数组中的第一个元素。

我的数组,'参数'是:

measurement_interval = 5.0;
ec_ref_thickness = 2.0;
e_ref_thickness = 3.0;
parameters = [measurement_interval ec_ref_thickness e_ref_thickness];

我与Arduino建立了沟通:

arduino = serial('COM4');
set(arduino,'DataBits',8);
set(arduino,'StopBits',1);
set(arduino,'BaudRate',9600);
set(arduino,'Parity','none');
fopen(arduino);

我使用以下方式将其发送给Arduino:

fprintf(arduino, '%f', parameters);
fprintf(arduino, '\n');

在Arduino,我有:

float parameters[3]
void setup()
 {
    Serial.begin(9600);
    while (Serial.available() == 0)
    {
    }
    if (Serial.available() > 0)
    {
      for (int i=0; i < 3 ; i++)
      {
          parameters[i] = Serial.parseFloat();
      }
      Serial.flush();
    }

我通过串口从Arduino发回:

void loop()
{
  Serial.print(parameters[0])
  Serial.print("  ");
  Serial.print(parameters[1]);
  Serial.print("  ");
  Serial.print(parameters[2]);
}

在MATLAB中读作:

output = fscanf(arduino);

'output'应为[5.0 2.0 1.0]。但是,我得到的是[5.00 0.00 0.00]

因此只能正确返回第一个元素'5.0'。如何调整它以读取数组中的所有数字?

3 个答案:

答案 0 :(得分:3)

首先,如果您尝试将参数作为浮点数传递,则应该使用'%f'作为MATLAB代码中的格式说明符。

接下来,在尝试解析浮点数之前,您将要等待串行数据可用。

float parameters[3];

void setup(){
  Serial.begin(9600);
  while(!Serial || Serial.available() <= 0);
  for (int i=0; i<3; i++){
    parameters[i] = Serial.parseFloat();
  }
}
void loop(){
  for(size_t i=0; i<3; ++i){
    Serial.print(parameters[i]);
    Serial.print(i<2 ? '\t' : '\n');
  }
}

如果由于某种原因仍然无效,您可以尝试检查您的串行数据是否正确到达arduino:

void setup(){
  Serial.begin(9600);
  while(!Serial || Serial.available() <= 0);
  while(Serial.available() > 0){
    Serial.print(Serial.read());
  }
}
void loop(){}

如果由于某些奇怪的原因仍然无效,您可以尝试以另一种方式将数据解析为浮点数。这是一个简单的例子:

float parameters[3];

void setup(){
  Serial.begin(9600);
  while(!Serial);

  while(Serial.available() <= 0);
  for(int i=0; i<3; ++i){
    String param_string = "";
    int c;
    while( (c = Serial.read()) >= 0 ){
      if((char)c == '\n') break;
      param_string += (char)c;
    }
    parameters[i] = param_string.toFloat();
  }
}

void loop(){
  for(size_t i=0; i<3; ++i){
    Serial.print(parameters[i]);
    Serial.print(i<2 ? '\t' : '\n');
  }
}

答案 1 :(得分:1)

@JeffreyCash 的答案非常好,我认为 Arduino 方面的代码需要 100%。但是,既然你还有问题,我想发布这个来涵盖 Matlab 方面。

我在您的问题中读到您使用

Matlab 发送值
fprintf(arduino, '%d', parameters);

然而:

  • 您应使用%f打印float
  • 据我所知,使用此说明您只发送一个值,这就是为什么当您运行 JeffreyCash的代码时,您成功打印只有一个float

也许你应该写

fprintf(arduino, '%f\n', parameters(1));
fprintf(arduino, '%f\n', parameters(2));
fprintf(arduino, '%f\n', parameters(3));

fprintf(arduino, '%f\n%f\n%f\n', parameters(1),
        parameters(2), parameters(3));

答案 2 :(得分:1)

首先尝试在matlab中的fopenf(arduino)之后放置一些延迟约3秒 即

fopen(arduino);
pause(3);

其次,一次发送一个参数数组,即

for i = 1:4
   fprintf(arduino, '%5.3f\n', parameters (i)); 
   pause(0.5);       
end

这应该可以正常工作,最后在arduino方面,你的设置看起来很好,但你尝试将数组发送回matlab的循环尝试

 void loop()
{ for (int i = 0; i < 3; i++){
  Serial.println(parameters[0]);  //sends data back in every new line 
  delay (20);

}

并且尝试在matlab端创建一个零数组来存储从arduino接收的值,即

receiveData = zeros (1, 4);
  for i = 1:4
  output = fscanf(arduino, '%f');
  receiveData =output;
 end

这应该对你有用 干杯