我的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
。
答案 0 :(得分:0)
在赋值A(I)= B中,B和I中的元素数必须为 同样的。
错误在锡上做了什么。 x(i)
,能够容纳一个号码,不多也不少。因此,fscanf(ard, '%*s %d');
返回为空,或者返回多个数字。
最可能的原因是您没有做任何事情来阅读/放弃设置字符串,因此fscanf
正在尝试将其中一个读取为%d
并返回空。要进行调试,请尝试使用fgetl
,然后打印出每个接收到的行。如果它只是标题行,请在循环开始之前读取它们。
您还可以在循环中进行一些错误检查 - 而不是直接将fscanf
的输出分配给x
,首先将其放入临时变量中。如果输出为空,您可以继续直到获得一个好的值,或者将NaN
之类的内容放入x
以指示读取失败。