개박살.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(~~~)함수가 들어있읍니다.
: :
:
답변 정말 감사드립니다.
어떻게 해야 알지 이제 알겠네여
^^*~~~~~
|