2014-09-23 2 views
0

У меня есть несколько операторов Serial.println в моем эскизе Arduino. Все они являются строками, кроме одного, которое является целым числом. Целое число является единственной переменной, которую я хочу построить в режиме реального времени, используя MatLab's fscanf.MatLab - fscanf Проблемы с Arduino

У меня есть 3 Serial.println инструкций, которые печатают строки. 2 из них находятся в пределах setup, а третий находится в loop. Целое число является четвертым, которое появляется сразу после последней строки.

После прочтения документации я обнаружил, что вы можете выбирать то, что вы хотите, но теперь я получаю эту ошибку:

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 

EDIT:

Спасибо - Я только что напечатал первую и вторую строчку, и у меня все серийные отпечатки. Я сказал 3 strings и 1 int, но 1 из strings находится в инструкции if, поэтому только 1 будет печатать в функции setup. Здесь все строки из 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); 
} 

Переменная Я заинтересован только является intBPM.

ответ

0

In an assignment A(I) = B, the number of elements in B and I must be the same.

Ошибка делает то, что говорит на жестяной банке. x(i), способен удерживать один номер, не более и не менее. Таким образом, либо fscanf(ard, '%*s %d'); возвращается пустым, либо возвращает более одного номера.

Наиболее вероятная причина в том, что вы ничего не делаете, чтобы читать/отбрасывать установочные строки, поэтому fscanf пытается прочитать один из них как %d и возвращается пустым. Для отладки попробуйте вместо этого использовать fgetl и просто распечатайте каждую полученную строку. Если это только строки заголовка, прочитайте их перед запуском цикла.

Вы можете также ввести некоторую проверку ошибок в цикле - вместо того, чтобы просто назначать вывод fscanf непосредственно на x, сначала переведите его во временную переменную. Если выход пуст, вы можете либо продолжить, пока не получите хорошее значение, либо поместите что-то вроде NaN в x, чтобы указать неудачное чтение.

+0

Спасибо - я отредактировал свое сообщение, чтобы предоставить дополнительную информацию после вашего сообщения. Чтобы убедиться, что что-то пустое, я бы использовал 'isempty()' в выражении 'if'? – user1574598

+0

Да - я бы использовал обратное: 'if ~ isempty (temp)' ('temp' - это переменная, которую вы назначаете выводом' fscanf', а затем присваиваете 'x'/увеличиваете свой график счетчика/перерисовки если есть фактические данные в 'temp'. – nkjt

Смежные вопросы