두번째 Bulk In

출처 : http://muosys.egloos.com/203067

오늘은 Bulk IN transfer를 실험해 보자.

이전 강의 “Bulk IN 실험”을 참조하시라.

우선 아래와 같은 회로를 꾸미자.
이전 강의(Bulk IN 실험)의 회로와 약간 다르니, 이전 강의의 회로도를 참조해서 실험하면서 왜 안되나요? 라고 물으면 대략 즐.

clip_image002

바로 전 실험을 하면서 이미 꾸며져 있는 회로에 Parallel Port와 인터페이스 할 배선만 추가하면 된다.
전체사진

clip_image003

세부사진1(Parallel Port 쪽)

clip_image004

세부사진2(LED 쪽)

clip_image005

세부사진3(버튼 쪽)

clip_image006

펌웨어는 v2.5에 v1.6을 추가하는 형식으로 수정하였다.
Unihigh Firmware v2.6

어플리케이션 소스
Unihigh App v2.6
실행파일

새로 추가된 (맴버) 함수는 다음과 같다.

OnButtonBulkIn()
BulkInThread(…)
ReadDataArrived( … )
UpdateListBoxScroll(…)

리소스에 새로 추가된 에디트 박스에 읽을 바이트 수를 써 넣고서, “Read” 버튼을 누르면 OnButtonBulkIn() 함수가 호출된다.

OnButtonBulkIn() 함수는 데이터를 기다리는 동안 메인 쓰레드를 홀딩시키지 않기 위해 BulkInThread(…)를 생성 한 후 리턴된다.

BulkInThread(…)에서는 ReadFile(…)을 이용해서 디바이스로부터 데이터를 읽어오는데, 여기서 이전 쓰레드(GetMsgThread)와 다른 점이 있다면
WaitForSingleObject( stOverlapped.hEvent, dwWaitTime );
이전에는 두번째 인자에 INFINITE를 주었었는데, 이번에는 dwWaitTime로 유한한 시간(1분)을 준다.
즉 “Read” 명령을 주고 나서 1분내에 그 ReadFile이 리턴되지 않으면 에러 메시지를 출력하도록 되어 있다.

성공적으로든 아니면 에러가 나든 BulkInThread(…)를 마치면 ReadDataArrived(…)가 호출되는데, 여기서 받아온 데이터를 ListBox에 출력한다.
그리고 데이터를 위한 버퍼를 해제한다.

UpdateListBoxScroll(…)은 리스트 박스의 스크롤을 갱신하기 위한 함수로서 USB 강좌에서 설명할 성질의 것은 아니므로 패쓰.

자. 이제 테스트를 해보자.
이전 강의(Bulk IN 실험)에 썼던 Parallel.exe를 다시 줏어오자.

펌웨어를 UniHigh 보드에 다운로드 시키고,

다음은 Parallel.exe를 실행시켜 놓고 나서, (물론 컴터에 패러렐 포트는 꽂혀 있어야 한다.) 다운로드 할 데이터 파일(data.bin)을 지정해 준다.

그리고 나서, Unihigh App v2.6를 실행시키고 “Read Byte” 에디트 박스에 Parallel.exe에 나타난 데이터의 크기(377, 즉, 우리가 읽어올 데이터의 크기)를 입력한다.
그리고, “Read” 버튼을 누른다.

이제 기다리면 되느냐?
아니다.
Parallel.exe의 “Transfer” 버튼을 눌러줘야 패러렐 포트를 통해 UniHigh 보드로 데이터가 날아가고, UniHigh 보드는 받은 데이터를 Bulk In USB 파이프를 통해 호스트로 전송한다.

clip_image007

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중

%d 블로거가 이것을 좋아합니다: