티스토리 뷰

Hardware

두번째 Bulk In

알 수 없는 사용자 2008. 4. 1. 01:32
출처 : http://muosys.egloos.com/203067

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

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

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

Array

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

Array

세부사진1(Parallel Port 쪽)

Array

세부사진2(LED 쪽)

Array

세부사진3(버튼 쪽)

Array

펌웨어는 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 파이프를 통해 호스트로 전송한다.

Array