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
[17044] Re:시리얼 통신 보낸데이타에 대한 receive time-out 처리
개박살.U&I [inutero] 2889 읽음    2002-03-29 22:17

안녕하세요? 개박살입니다.

좀 설명하기가 어렵네요 ^^;

일단 막설명을 드리자면, 쓰레드안에서 모든것을 처리하면 복잡하고 어려워 집니다..

프로토콜처리 즉, 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 처리 초보허접 1603 2002/03/29
17044     Re:시리얼 통신 보낸데이타에 대한 receive time-out 처리 개박살.U&I 2889 2002/03/29
17080         Re:Re:시리얼 통신 보낸데이타에 대한 receive time-out 처리 초보허접 1584 2002/04/01
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.