2012년 6월 27일 수요일

랩뷰에서 연속읽기

NI_DAQmx API 는 circular 버퍼를 사용한다. 버퍼가 채워지는 동안 버퍼안의 데이터의 일부가 읽혀지는 것이다.
circular버퍼를 사용하면 NI-DAQmx가 취득된 데이터를 가져다 쓰는 동안, 장치가 연속적으로 데이터를 취득할 수 있게 할 수 있다.
버퍼의 끝에 도달하면, 버퍼의 처음으로 돌아가 다시 채워나간다. Application이 버퍼의 한 곳에서 데이터를 블록 단위로 가져다 쓰는 동안 다른 장소에는 데이터가 들어가고 있는 것이다. 이로써 새로운 데이터가 아직 읽지 않은 데이터에 덮어 쓰여지지 않게 된다.
circular 버퍼가 많은 application에서 잘 쓰이고 있지만, 두가지 가능한 문제가 발생가능하다.
첫번째는 데이터가 쌓이는 속도보다 빠른 속도로 데이터를 가져 나가는 경우와 두번째는 NI-DAQmx가 버퍼에 overwrite하기 전에 데이터를 꺼내가지 않는 경우이다. (첫번째는 데이터를 빨리 가져가는 경우, 두번째는 데이터를 늦게 가져가는 경우)
Application이 아직 수집되지 않은 버퍼로부터 데이터를 읽으려고 할 때, NI-DAQmx는 데이터가 취득되기를 기다렸다가 데이터를 return한다. application이 circular버퍼로부터 데이터를 충분히 빨리 읽지 않을 경우 에러가 발생한다. 에러 내용은 데이터의 일부가 overwrite되어 손실되었다는 것이다. 이런 식으로 데이터를 잃는 것이 중요하지 않다면 OverWrite Mode 세팅을 바꾸면 된다.

요약하면
1. 버퍼에 데이터를 채워 나간다. 버퍼는 유한하므로 버퍼의 끝까지 채우면 버퍼의 처음부터 데이터를 덮어쓴다.
2. Application은 버퍼에서 데이터를 일정크기로 끊어서가져다 쓴다.(예:먼저1~50까지 다음에는 51~100까지...)
3. 가져다 쓰는 속도가 빠르면 문제가 되지 않는다. 버퍼가 채워질때까지 기다리기 때문
4. 가져다 쓰는 속도가 느리면 데이터를 잃게 된다.

댓글 없음: