【问题标题】:Send array of floating point numbers from MATLAB to Arduino将浮点数数组从 MATLAB 发送到 Arduino
【发布时间】:2017-06-27 20:46:46
【问题描述】:

我想从 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);

'输出'应该是[5.0 2.0 1.0]。但是,我得到的是 [5.00 0.00 0.00]

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

【问题讨论】:

  • Serial.read() 读取单个字节。我不熟悉 Matlab,但我假设 fprintf(arduino, '%d', parameters); 打印一个表示单个整数值的字符串。而char parameters[3] = { '0','0','0'}; 显然不是浮点数组。
  • 我已经阅读了Serial.parseFloat(),但我不明白如何为我的案例实施它。
  • char parameters[3] 是一个由 3 个 char 元素组成的数组。您是否尝试将三个floats 读入3 个chars?

标签: arrays matlab arduino serial-port


【解决方案1】:

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

接下来,您将要等待串行数据可用,然后再尝试解析浮点数。

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');
  }
}

【讨论】:

  • 第二种方法我试过了,但是只能成功返回数组中的第一个浮点数。
【解决方案2】:

@JeffreyCash 的回答非常好,我认为 100% 关心 Arduino 方面的代码。但是,由于您仍有问题,我想发布此内容以涵盖 Matlab 方面..


我在您的问题中读到您使用 Matlab 发送值

fprintf(arduino, '%d', parameters);

但是:

  • 你应该使用%f来打印float
  • 据我所知,使用此指令您只发送 一个值,这就是为什么当您运行 JeffreyCash 的代码时您只成功打印一个 @ 987654327@.

也许你应该写

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));

【讨论】:

  • fprintf(arduino, '%f\n', parameters(1)); fprintf(arduino, '%f\n', parameters(2)); fprintf(arduino, '%f\n', parameters(3)); 工作
  • 谢谢,已修复。
  • 我也对 MATLAB 一无所知,除了一些需要它的课程的压抑记忆,所以我懒惰地上网搜索并找到了this pdf, which states all of the values in the vector should have been printed。我想可能不是这样
  • @JeffreyCash 在 StackOverflow 上有 thisthis 问题尝试使用这种方法,只是使用了 sprintf() .. 也许你的讲座材料发现是错误的。但我承认,由于您的代码在 Arduino 方面是完美的,我什至没有检查来源就得出了唯一可行的结论。这是鲁莽的,但显然它适用于 OP。 (:
【解决方案3】:

首先尝试在 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

这应该适合你 干杯

【讨论】:

    猜你喜欢
    • 2012-09-21
    • 1970-01-01
    • 1970-01-01
    • 2017-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-04
    • 1970-01-01
    相关资源
    最近更新 更多