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
[55919] RS232C에 데이타 수신이 누락될때가 있습니다..
linuxman [] 1788 읽음    2009-01-28 16:56
안녕하세요...
시리얼 통신에 대해 하다 궁금한것이 있어 질문을 드림니다.
최보현님의 RS232C class를 참조했습니다.

저의 상황은 매번 200 밀리 second마다 com1에 데이타를 보내면(약 20byte) 
그응답으로 약 100 byte 정도를 받습니다. ( 115200 bits )
아래의 코드를 이용해서, 한 character 마다 발생할때마다 interrupt가 발생해서 상위application에서 읽어가도록
되어 있는데...너무 빨라서 인지 데이타 데이타가 누락되는 현상이 일어납니다.

( 데이타가 많아서 인지? 속도가 너무 빨라서 인지? 읽어버리는 데이타가 발생합니다..)

또 이상한 점은 문자가 들어왔을대.. DataRead함수가 call되도록 되어있는데... 이때,
iLen = com1->Read ( RcvBuff,Message.WParam); 에서
iLen 의 값을 조사해보면,  iLen 이 0  일때가 종종 있습니다. (이것도 왜 그런지 이해가 안됩니다- 분명 데이타가 들어
와서 DataRead 함수가 call 된것인데... 길이가 0 이라니?)

혹 위의 문제에 대해서 commet 주시면 감사하겠습니다.

혹,상용이라도  RS232C 콤포넌트 쉽게 설치해서/ 쉽게 사용할수 있는 콤포넌트 있으면 알려주시면 감사하겠습니다.


수고하세요.



void __fastcall TserialF::DataRead(TMessage &Message)
{
    int iLen,i;
    memset (RcvBuff, '\0', sizeof (RcvBuff ) );
    iLen = com1->Read ( RcvBuff,Message.WParam);

}

void __fastcall TRS232CRxThread::Execute()
{
    DWORD    dwEventMask;
    DWORD   dwErrorFlags;
    COMSTAT CommStatus;

    while(!Terminated)
    {
        dwEventMask = 0;
        /*   wait read until a data arrive event    */
        WaitCommEvent(myRs232c->hmyPort, &dwEventMask, &myRs232c->evnRead);
        if(!dwEventMask) {Sleep(1); continue ;}

        EnterCriticalSection(&myRs232c->myCriticalSection);
        if(myRs232c->hmyWnd)
        {
            if(dwEventMask & EV_RXCHAR)
            {
                //------------ 수신버퍼에 데이터 문자가 수신 되었을 경우
                ClearCommError(myRs232c->hmyPort, &dwErrorFlags, &CommStatus);
                                SendMessage(myRs232c->hmyWnd, myRs232c->lparam, CommStatus.cbInQue, 0);
                                /*
                                if (myRs232c->device == SANG_HAENG_COM )
                                {

                   SendMessage(myRs232c->hmyWnd, UM_EVN_SANG_HAENG_COM_RXCHAR, CommStatus.cbInQue, 0);
                                }
                                else
                                {
                                   SendMessage(myRs232c->hmyWnd, UM_EVN_HA_HAENG_COM_RXCHAR, CommStatus.cbInQue, 0);
                                }
                                */
            }

            if(dwEventMask & EV_RXFLAG)   SendMessage(myRs232c->hmyWnd, UM_EVN_RXFLAG, 0, 0);
            if(dwEventMask & EV_TXEMPTY)  SendMessage(myRs232c->hmyWnd, UM_EVN_TXEMPTY, 0, 0);
            if(dwEventMask & EV_CTS)      SendMessage(myRs232c->hmyWnd, UM_EVN_CTS, 0, 0);
            if(dwEventMask & EV_DSR)      SendMessage(myRs232c->hmyWnd, UM_EVN_DSR, 0, 0);
            if(dwEventMask & EV_RLSD)     SendMessage(myRs232c->hmyWnd, UM_EVN_RLSD, 0, 0);
            if(dwEventMask & EV_BREAK)    SendMessage(myRs232c->hmyWnd, UM_EVN_BREAK, 0, 0);
            if(dwEventMask & EV_ERR)      SendMessage(myRs232c->hmyWnd, UM_EVN_ERR, 0, 0);
            if(dwEventMask & EV_RING)     SendMessage(myRs232c->hmyWnd, UM_EVN_RING, 0, 0);
            if(dwEventMask & EV_RX80FULL) SendMessage(myRs232c->hmyWnd, UM_EVN_RX80FULL, 0, 0);
        }
        LeaveCriticalSection(&myRs232c->myCriticalSection);
    }
}

+ -

관련 글 리스트
55919 RS232C에 데이타 수신이 누락될때가 있습니다.. linuxman 1788 2009/01/28
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.