|
답변 감사합니다.
RxChar 이벤트를 이용하고는 있지만...
현재 독립적인 클래스로 만들고 있고.. 회신된 데이터로는 리스트 등에 해당 데이터를 기록해야 합니다.
통신의 끝은 항상 Carriage Return이 들어오기 때문에 RxFlag 이벤트로 받아도 되도록 하였습니다.
제가 하고자 하는 바는...
장비로 A라는 명령을 내리고 B라는 회신을 받아 그 값을 뿌리고자 함이며 그 동작이 어떤 클래스와는 연관되지 않도록 작성하려고 합니다.
즉
Label1->Caption = Device->A();
이런 식으로 하려고 합니다.
그러려고 하니 A라는 명령을 Device 객체에서 장비로 전송해야 하고 Device 객체는 응답을 받아 리턴해야 하는데..
그 중간에 루프를 돌면서 기다리려니 RxChar 이벤트가 발생하지 않고...
중간에 Application->HandleMessage()를 넣으려니 이로 인해 다른 문제가 발생할 소지가 있어서...
다른 문제는 통신이 완료되지 않은 상태에서 다른 명령을 내릴 경우 발생하더군요.
아마... 별도로 이벤트를 만들어 날리든지...
메시지 중 입력 버퍼로 문자를 수신하는 이벤트만 허용하는 방법을 취해야 하지 않을까 싶네요...
보다 효율적인 방법이 없을지요... ㅠ.ㅠ
WARSHIP 님이 쓰신 글 :
: 권기식.with☆ 님이 쓰신 글 :
: : 안녕하세요?
: :
: : RS232 통신 프로그램을 비교적 자주 짜오면서 항상 이상하게 생각되는 부분이 있어 문의드립니다.
: :
: : CPort 라이브러리를 이용하고 있는데...
: :
: : 장치로 어떤 명령을 날리면 그 반응을 보고 다음 동작을 취하도록 해야 합니다.
: :
: : 이럴 경우 WriteStr로 명령을 날리고 약간의 지연을 준 다음 입력 버퍼에서 데이터를 읽어오는데요..
: :
: : 이 약간의 지연을 어떻게 줘야 할지 잘 모르겠습니다.
: :
: : Sleep 함수도 이용해봤지만..
: :
: : 필요없는 긴 지연을 주게 되더군요.
: :
: : while로 루프를 만들어 돌리면서 Application->HandleMessege() 함수를 쓰니 수신이 잘 되는데...
: :
: : 잘못하면 이것 때문에 프로그램이 꼬일 수 있더군요.
: :
: : 어떤 방법이 가장 적절할까요?
:
: 음 혹시 RxChar 이벤트를 아시는지요?
: RxChar 를 세팅해 놓으면 데이타가 도착할때마다 이벤트를 띄워줍니다.
: 그때 버퍼에 들어온 갯수를 체크하며 프로토콜에 맞게 읽어들이시면 됩니다.
:
: 만약 동작에 따른 프로토콜 플로우 차트가 있다면
: RxChar 이벤트에서 올바른 응답이 오면 다음단계의 명령을
: WriteStr해주면 될거 같습니다. ^^;
:
: 제가 질문의 요지를 잘 파악하지 못한거 같기도 한데...
:
: void __fastcall OnRxChar(TObject *Sender, int Count)
: {
: if ( Count > 응답받아야 하는 길이)
: {
: AnsiString result = ComPort1->Read~~;
: if ( result == "1" ) ComProt1->WriteStr(XXX);
: else if (result == "2" ) ComPort1->WriteStr(~~~);
: }
: }
|