2011-11-30 2 views
0

나는 그것을 켤 때 두 개의 숫자를 빠른 속도로 뱉어내는 감지기를 가지고있다. 하이퍼 터미널을 사용하여 데이터를 캡쳐했습니다.이 장치는 장치를 따라 잡을 수 있습니다.MATLAB 직렬 포트 연결이 너무 느리다

저는 프로세스를 자동화하고 Matlab을 통해 장치를 완전히 제어하려고했지만 절반 이하의 데이터가 Matlab에 도달한다는 것을 발견했습니다. 이 영역에서 Matlab의 속도와 관련하여 알려진 문제가 있습니까? 여기

내가 데이터를 읽기 위해 사용하고있는 작업은 다음과 같습니다

s = serial('COM1', 'BaudRate', 115200, 'DataBits', 8, 'Terminator','CR/LF', 'InputBufferSize', 1024); 
T1 = 1;  % Initial T1, T2 values 
T2 = 10000; 
timer = 300; 

% Inputs to serial device: T1, T2, runtime (seconds)  
fprintf(s, sprintf('%d %d %d\r', T1, T2, timer)); 
tdata = zeros(1e5,2,'uint16'); 
data = fopen(sprintf('%s.txt',date_and_trial),'w'); 
tic; 
while toc <= timer 
% Read data into an array, and write to file. 
    if s.BytesAvailable >= 13 
      line = fgets(s); 
      if length(line) == 13 
       a = sscanf(line, '%u %u'); 
       if length(a) == 2 
        tdata(i,1) = a(1); 
        tdata(i,2) = a(2); 
        fprintf(data, sprintf('%d %d\r', tdata(i,1), tdata(i,2))); 
        i++; 
       end 
      end 
     else 
      pause(0.01); 
     end  
    end 
    disp(toc); 
    fclose(s); 
    fclose(data); 
    fprintf('Finished!\r'); 

i를 조건문이 둔화 될 수 있지만, 그들은 또한 '%에서 일을 계속해야 할 것 같다 것을 생각해 봤는데 i % i \ n '형식이 필요합니다. 어쩌면 모든 데이터를 읽고 완료 한 후 처리하는 방법이 있을까요? 직렬 포트 공모에 'Terminator', 'CR/LF'을 통과하기 때문에

답변

2

, 당신은 line = fscanf(s);

if s.BytesAvailable >= 13 
     line = fgets(s); 
     if length(line) == 13 

을 대체 할 수 있습니다. fscanf은 종결자를 기다리고 전체 줄을 반환합니다 (줄에 오류가 없다고 가정). else pause 부분을 삭제할 수도 있습니다. 이러한 변경으로 인해 루프가 직렬 데이터를 따라 잡을 수있을만큼 빠르게 실행되어야합니다. 나는 s.BytesAvailablepause이 실제로 기대했던 시간보다 훨씬 더 오래 걸릴 것이라고 추측 할 것입니다. 이전은 OS와 후자에게 전화하기 때문에 일시 중지는 시간 지정에 따라 지정하는 것보다 훨씬 오래 갈 수 있기 때문입니다.

fscanf은 종료자를 기다리는 것을 차단합니다. 즉, toc >= timer 조건이 참이되기 전에 전송이 중지되면 프로그램이 중지됩니다. 따라서 serial 호출에서 현명한 타임 아웃을 설정해야합니다.

루프 본문에 두 가지 빠른 속도 향상을 만들 수 있습니다. tdata(i,:) = a';은 한 번에 행을 채우며 fprintf(data, '%s\r', line);printf을 건너 뜁니다. 그래서 모두 함께 넣어 :

s = serial('COM1', 'BaudRate', 115200, 'DataBits', 8, 'Terminator','CR/LF', 'InputBufferSize', 1024, 'Timeout', 3); 
T1 = 1;  % Initial T1, T2 values 
T2 = 10000; 
timer = 300; 

% Inputs to serial device: T1, T2, runtime (seconds)  
fprintf(s, sprintf('%d %d %d\r', T1, T2, timer)); 
tdata = zeros(1e5,2,'uint16'); 
data = fopen(sprintf('%s.txt',date_and_trial),'wt'); 
tic; 
while toc <= timer 
% Read data into an array, and write to file. 
    line = fscanf(s); %# waits for CR/LF terminator 
    a = sscanf(line, '%u %u'); 
    if length(a) == 2 
     tdata(i,:) = a'; %# ' assumes sscanf returned a column vector 
     fprintf(data, '%s\r', line); 
     i++; 
    end 
end 
disp(toc); 
fclose(data); 
fclose(s); 
fprintf('Finished!\r'); 
+0

그것은 절대적으로 그것을 고쳤다. 대단히 감사합니다. – parabol2112

+0

@ parabol2112 -이 답변으로 문제가 해결되면 옆에있는 체크 표시를 눌러 공식적으로 수락하십시오. –