|
RxChar 이벤트를 사용해 보세요...
수신버퍼에 전송되면 무조건 실행됩니다....
void __fastcall TForm1::ComPort1RxChar(TObject *Sender, int Count)
{
char temp[500];
memset(temp, 0x00, sizeof(temp));
ComPort1->Read(temp, Count);
}
이한진 님이 쓰신 글 :
: 제가 마이컴을 주로 사용하기 때문에 마이컴 보드 테스트용 프로그램을 작성하기위치
: 요즘 빌더를 배우고 있습니다.
: 그런데, 통신관련 프로그램을 하는 중에 잘 되지 않아 이렇게 질문을 올립니다.
:
: 통신 데이타를 보내는 것은 Main Form에서 버튼을 누르면 데이타를 보내게 했기에
: 송신은 별 문제없이 되는데 수신이 문제입니다.
:
: 수신의 경우 하이퍼터미널이나 여타 통신 프로그램처럼 계속 수신을 받으려고 합니다.
: 수신된 내용을 Memo창에 표시를 하구요
: 그런데, 쓰레드에서 데이타가 수신되면 수신된 데이타를 읽어 표시하려고
: "WaitCommEvent"을 이용하여 데이타가 수신될때만 Open 명령을 실행하려 했더니
: 프로그램 실행도중 "WaitCommEvent "에서 멈추더군요..
: 그래서 그런지 프로그램이 "WaitCommEvent"에 멈추어 있는동안은
: 송신도 이루어지지 않고, 어느 데이타가 수신되어야만 송신도 가능하더라구요
:
: 어떻게 해결 해야 할지 모르겟네요..
: 데이타의 수신을 항시 확인하면서 송신이나 다른 작업을 할수 잇는 방법은 없을까요..
: 쓰레드에서 수신되 데이타를 읽어와서 확인하는 방법말고
: 이벤트나 인터럽트같은 것을 사용하는 방법은 없는것인가요?
:
: 보통 마이컴의 경우 데이타가 수신되면 인터럽트가 발생하여 메인 프로그램과는 별도록
: 제어할 수 있잖아요..그렇게 하고 싶습니다..
: 많은 고수님들의 답변 부탁드립니다.
:
: *------ apicom.cpp 내용----
: /* 통신 Port로 부터 Signal이 들어오는지를 감시 한다. */
: bool WaitRxEvent(int Port)
: {
: DWORD dwEvtMask = 0;
: ::WaitCommEvent(m_hCommPort[Port], &dwEvtMask, NULL);
: if ( (dwEvtMask & EV_RXCHAR) == EV_RXCHAR )
: return true;
: else
: return false;
: }
: *------ rs232Thred.cpp 내용 ----
: void __fastcall RS232Thread::Execute()
: {
: char inbuff;
:
: // 테이타 수신 확인
: while( WaitRxEvent(th_Port) )
: {
: //데이타가 수신되면 다음 명령을 실행한다.
: // serial data Read
: bool kk = COM_Read(th_Port, &inbuff, 1);
: if( kk )
: {
: MainForm->Memo2->Text = inbuff;
: }
: Sleep(1);
: }
: }
|