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
[17080] Re:Re:시리얼 통신 보낸데이타에 대한 receive time-out 처리
초보허접 [] 1584 읽음    2002-04-01 13:33
개박살.U&I 님이 쓰신 글 :
:
: 안녕하세요? 개박살입니다.
:
: 좀 설명하기가 어렵네요 ^^;
:
: 일단 막설명을 드리자면, 쓰레드안에서 모든것을 처리하면 복잡하고 어려워 집니다..
:
: 프로토콜처리 즉, ACK를 받고 원하는 데이타를 보내고,, 받고.. 이런 처리는
:
: 메인로직에서 하는것이 좋습니다.
:
: 님이 짜신 부분은 말그대로 시리얼 1바이트를 받고 보내는 시리얼함수라고 보시고,
:
: 이함수를 이용해서 메인에서 처리를 하는것이죠..
:
: 자, 일단 원하는 데이타를 보내고, 그 ACK를 기다리고, 일정시간동안 ACK가 들어오지 않으면
:
: 종료하는 함수를 하나 보여드리겠습니다.
:
:
: bool NeedAckWrite(unsigned char *Buffer, unsigned short int Size)
: {
:     WriteData(Buffer, Size);    //[*] 이건 시리얼로 데이타를 쓰는 함수를 만드시고..
:     IsReciveAck = false;        //[*] 전역변수로써, 아크데이타를 받았는지를 결정합니다
:
:     //[*] ACK Loop
:     clock_t Retry = clock();
:     clock_t Start = clock();
:     while((clock() - Start) < 1000)  {      //[*] Wait 1-Sec
:         if(IsReciveAck) break;              //[*] Ack OK !
:         if((clock() - Retry) >= 200)   {    //[*] Retry 200-MSec
:             Retry = clock();
:             WriteData(Buffer, Size);        //[*] Retry Write
:         }
:         Application->ProcessMessages();     //[*] While Loop에서 처리를 점유하지 않기위해
:     }
:
:     //[*] Retry Fail ...
:     if((clock() - Start) >= 1000)    return false;
:    
:     return true;
: }
:
: 이함수의 역할은 일단 데이타를 보내고 1초동안 기다리면서 200MS동안 안들어오면 다시 보내고
:
: ACK가 들어왔다면 빠져나오면서 성공, 실패를 리턴하는 함수입니다.
:
: 이런 함수를 위해서는 IsReciveACK라는 Bool형 전역변수가 필요한데요
:
: 이변수를 ACK를 받을때 ReadProcssRX 함수안에서는 데이타를 분석해서 ACK식별이 가능하겠죠?
:
: 그곳에서 변수를 true로 만들어주어서 While을 빠져나오게 하는겁니다.
:
:
: 이런 함수로 인해서 프로토콜 로직 코딩이 한결쉬어집니다.
:
: 예를 들어
:
: [송신] 0x02
: [수신] 0x03 (ACK)
: [송신] 0x01
: [수신] 0x03 (ACK)
:
: 이런 프로그램을 하려면 그냥
:
: NeedAckWrite("\x02", 1);
: NeedAckWrite("\x01", 1);
:
: 두줄만 쓰면 ACK기다리고,, 뭐 이런처리를 알아서 해주는것이죠
:
: 단, ACK가 한종류일때는 이런 간단한 방법으로 되지만 여러개일때는 어느 ACK를
:
: 받앗는지 구분이 필요하겠죠? 이건 님이 잘생각해보시고 고민해보시고 구현해보세요~~
:
: 그럼 도움이 되시길 바랍니다...
:
: PS. 기능을 잘구분해서 분리하시고, 더나아가서는 클래스로 묶어서 마르고 닮도록 사용해세요 ^^;
:
:
: 초보허접 님이 쓰신 글 :
: : 질문이 있어서 올립니다.
: : 제가 초보라서여~`~~~~~~~~~
: :
: : 쓰레드에서
: :
: : if(WaitCommEvent( hComm, &dwEvent, NULL ))
: : {
: :       GetCommMask( hComm, &CommEvent );
: :       if(CommEvent & EV_RXCHAR)  ReadProcssRX();
: : }
: :
: : 이걸로 이벤트가 생기면 읽거든여
: : 내가 데이타를 포트로 보냈을때 내가 받은 데이타가 
: : 없다는 것을 이벤트가 안생기는데 어떻게 체크해야 돼나여?
: :
: : 고수님들 답변좀 부탁드립니다.
: : ReadProcssRX()에는 당연히 ReadFile(~~~)함수가 들어있읍니다.
: :
:

답변 정말 감사드립니다.
어떻게 해야 알지 이제 알겠네여
^^*~~~~~

+ -

관련 글 리스트
17014 시리얼 통신 보낸데이타에 대한 receive time-out 처리 초보허접 1604 2002/03/29
17044     Re:시리얼 통신 보낸데이타에 대한 receive time-out 처리 개박살.U&I 2890 2002/03/29
17080         Re:Re:시리얼 통신 보낸데이타에 대한 receive time-out 처리 초보허접 1584 2002/04/01
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.