C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[50450] Re:ComPort에 대한 질문...
금목암 [iconms1] 2005 읽음    2007-09-04 10:55
또아리 님이 쓰신 글 :
: ComPort를 사용하고 있는 유저입니다. 노트북을 사용해서 USB-TO-SERIAL 케이블을 사용해서 통신환경을 구축해서 사용하고 있습니다....정상 적인 통신을 하고있다가 Comport가 Error가 나면 즉, 통신중 USB-TO_SERIAL케이블이 빠지게 되면...
: CError_PurgeFailed(5)가 다이얼로그창으로 뜨면서 프로그램이 종료도 되지 않고..먹통이 되어 버리더군요..검색을 해보니 PurgeFailed가 버퍼 클리어시 에러가 발생한 내용이더군요...또 간혹 Comport로 계속 Send가 계속되고 그에 대한  응답이 없을 때 즉 ComPort1RxChar이벤트로 부터 ComPort1->Read함수가 호출되지 않고 계속 Comport에 Write할 경우....
: CError_PurgeFailed(5)가 발생하더군요...그러면서 먹통이 되어버리고요.....   
:
: CError_PurgeFailed(5)가 발생할 경우 자동으로 Buffer를 Purge시키거나 ...그게 여의치 않으면 CError_PurgeFailed(5)가 발생하면 프로그램을 종료하고 싶은데...방법을 못찾겠습니다....
:
: 내부프로토콜에 의하여 데이터를 Send하고 일정시간 응답이 없으면 Comport1->ClearBuffer(true, true)시켜도 소용이 없던데...특별한 방법이 없는지요..Comport를 잘 다루시거나 아시는분들의 답변 부탁드립니다..    감사합니다.
============================

[아래 검색 해보시면 요런식으로]

윈도우 메세지를 이용하세요.
: : 몇년전에 비슷한 작업.. USB에 연결된 핸드폰 케이블을 핸드폰에 끼우면 그것 감지해서 어떤넘의 포트인지 찻고, 캐이블이 빠지면 감지해서 포트 클로즈 해주는 프로그램 작성한적이 있습니다. 별문제 없이 동작했구요. 삼성, LG, 스카이, 큐리텔등 우리나라에서 판매되는 대부분의 핸드폰이 꼽힐 경우를 고려해야 했는데 각각의 회사, 제품 모델, 통신사마다 디바이스드라이브가 다른 경우가 많았기 때문에 사용하는 포트가 많아서 어떤넘이 꼽혔는지, 또는 캐이블이 빠졌는지를 확인해야 하는 절차가 필요해서 만든것입니다.
: :
: : 간단하게 동작을 설명 드리면 USB 핸드폰 케이블이 꼽혔을때나 빠졌을때 WM_DEVICECHANGE 메세지가 발생합니다. 물론 USB 카드리더기등 USB나 기타등등 관련장비에 변화가 생기면 WM_DEVICECHANGE 가 발생됩니다. 그것이 어떤 경우인지는 Message.WParam의 값을 보면 됩니다.
: : 당시에 이미 연결된 카드리더기에 메모리카드가 꼽힐 경우 어떠한 윈도우메세지도 발생하지 않아서 무지 고생했던게  아직도 눈에 선 하군요.
: :
: : 해당 메세지핸들러 올려드리겟습니다. 뭐 소스 보시면 어떻게 동작을 하는지 이해 되실겁니다. 소스는 다른 디바이스가 꼽히는 경우가 없으므로(특수장비라서 USB 핸드폰 캐이블만 꼽힐 수 있게 되었습니다.) 다른것은 체크하지 않고 간단하게 확인합니다.
: :
: : 포트 라이브러리가 틀리므로 전체 소스는 의미 없을듯합니다.
: : 주석은 제가 방금 달은것입니다.
: : DBT_DEVICEARRIVAL, DBT_DEVICEREMOVECOMPLETE 를 쓰기 위해선 #include <dbt.h> 해줘야 합니다.
: :
: : void __fastcall TComPortForm::OnMessages(Messages::TMessage &Message)
: : {
: :     switch(Message.Msg)
: :     {
: :         case WM_DEVICECHANGE:
: :             switch(Message.WParam)
: :             {
: :                 case DBT_DEVICEARRIVAL :
: :                     CheckPort();  // 핸드폰 케이블이 꼽혔다. 꼽힌 핸드폰 USB Serial port 번호 찻아서 해당포트 open하기.
: :                     break;
: :                 case DBT_DEVICEREMOVECOMPLETE :
: :                     ComPort1->Close();  // // 핸드폰 케이블이 빠졌다. 포트 뒷 정리.
: :                     break;
: :             }
: :             Message.Result = true;
: :             break;
: :         default:
: :             TForm::WndProc(Message);
: :     }
: : }

+ -

관련 글 리스트
50442 ComPort에 대한 질문... 또아리 1728 2007/09/03
50450     Re:ComPort에 대한 질문... 금목암 2005 2007/09/04
50481         Re:Re:ComPort에 대한 질문... 또아리 2482 2007/09/06
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.