2014-09-23 2 views
0

내 Arduino 스케치에 여러 개의 Serial.println 문이 있습니다. 그것들 모두는 정수형을 제외한 문자열입니다. 정수는 MatLab의 fscanf을 사용하여 실시간으로 플롯하려는 유일한 변수입니다.MatLab - Arduino와 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 개가 있기 때문에 setup 함수에서 1 개만 인쇄됩니다.

tline = 

Card Failed or Ready 


EDU>> tline = fgetl(ard) 

tline = 

BPM: 100 

아두 이노 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

감사합니다. 게시물 작성 후 추가 정보를 제공하기 위해 내 게시물을 편집했습니다. 무언가가 비어 있는지 확인하기 위해'if' 문에서 isempty()를 사용합니까? – user1574598

+0

예 - 실제로 역순으로 사용합니다 :'if ~ isempty (temp)'('temp'는'fscanf'의 출력을 할당하는 변수이고,'x'에만 할당/카운터/다시 그리기 그래프를 증가시킵니다 실제로 '임시'에 데이터가있는 경우 – nkjt