我想从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'。如何调整它以读取数组中的所有数字?
答案 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
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
这应该对你有用 干杯