MatLab - 与Arduino的fscanf问题

时间:2014-09-23 19:48:04

标签: matlab serial-port arduino

我的Arduino草图中有几个Serial.println语句。所有这些都是字符串,除了一个整数。整数是我想要使用MatLab fscanf实时绘制的唯一变量。

我有3个Serial.println语句打印字符串。其中2个位于setup内,第3个位于loop。整数是紧跟在后一个字符串之后的第4个整数。

阅读完文档后,我发现你可以过滤你想要的东西,但我现在收到了这个错误:

Warning: Unsuccessful read: Matching failure in format. 
In an assignment  A(I) = B, the number of elements in B and I must be the same.

Error in serialHRM (line 12)
   x(i) = fscanf(ard, '%*s %d');

我的MatLab代码:

ard = serial('/dev/tty.usbserial-A601EQJ5', 'BaudRate', 9600);

fopen(ard);

i = 1;
N = 50;
x = zeros(0, N);

while i <= N

   x(i) = fscanf(ard, '%*s %d');
   plot(x)
   hold on
   axis([1, N, 0, 150])
   drawnow;
   i = i +1;

end

编辑:

谢谢 - 我刚刚打印了第一行和第二行,这是我所有的连续打印。我确实说过3 strings和1 int,但strings中有1个位于if语句中,因此setup函数中只会打印1个。以下是MatLab的所有内容:

tline =

Card Failed or Ready


EDU>> tline = fgetl(ard)

tline =

BPM: 100

Arduino Serial打印:

void setup() {

  Serial.begin(9600);
  Serial.println("Card Failed or Ready");
}

void loop() {

  Serial.print("BPM: "); Serial.println(BPM);
  delay(1000);
}

我感兴趣的变量是int BPM

1 个答案:

答案 0 :(得分:0)

  

在赋值A(I)= B中,B和I中的元素数必须为   同样的。

错误在锡上做了什么。 x(i),能够容纳一个号码,不多也不少。因此,fscanf(ard, '%*s %d');返回为空,或者返回多个数字。

最可能的原因是您没有做任何事情来阅读/放弃设置字符串,因此fscanf正在尝试将其中一个读取为%d并返回空。要进行调试,请尝试使用fgetl,然后打印出每个接收到的行。如果它只是标题行,请在循环开始之前读取它们。

您还可以在循环中进行一些错误检查 - 而不是直接将fscanf的输出分配给x,首先将其放入临时变量中。如果输出为空,您可以继续直到获得一个好的值,或者将NaN之类的内容放入x以指示读取失败。