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
[42041] 시리얼 통신 문제입니다. 한번 봐주세요.
쩡이 [xtremegroove] 1559 읽음    2005-09-29 09:11
AsyncPro 컴포넌트를 이용해서 LG GM4 PLC와 시리얼 통신을 합니다.
TX 데이터를 sBufferTX에 넣어서 밑의 SEND() 함수를 사용하여 전송합니다.

CharReady()로 TX가 완료되면 GetChar()에서 RX 데이터를 한 문자씩 받아서
ETX가 들어올 때 까지 sBufferRX에 차곡차곡 더합니다.

하이퍼터미널로 중간에 캡처해서 보면 TX, RX 모두 프레임은 깨끗합니다.
그런데 문제점이 RX 데이터가 정상적일 때.. 12345가 와야한다면
112345 또는 123345 이런식으로 중간에 한 문자가 더 들어오는 일이 빈번합니다.
그래서 이상한 데이터를 창에 표시하거나 혹은 PC가 아예 다운이 되곤 합니다.

그리하여, RX 프레임 분석하는 곳 부터 시작해서 차례차례 올라가 보니
C= GetChar(); 의 C에서 부터 한 문자씩 더 들어오더군요.
이것이 컴포넌트의 함수라 더 이상 어쩌지 못하는.. ㅜㅜ
참고로 요넘의 PLC는 체크섬하는 것이 없습니다. (제길..)

원래 쓰레드로 돌리던 프로그램이라, 혹시나 예제프로그램을 만들어서
버튼 누를 때만 데이터 전송하도록 해봐도 PC 다운되는 문제를 제외하고는 현상은 같게 나오더군요.

추가 질문 사항으로 시리얼이나 모든 통신 시에 버퍼를 사용한다는데
윈도 XP내의 시스템 버퍼에서 프로그램 내의 버퍼(컴포넌트의 CharReady(), GetChar() 함수?)를 거쳐서
들어온 프레임으로 데이터 가공을 하게 되는 것으로 알고 있습니다.
대략 이정도의 개념만 가지고 있습니다. (맞나? -_-)
실제로 통신 데이터가 PC에서 오고가는 것을 알아야 문제를 해결할 것 같은데요.

AsyncPro 컴포넌트 사용자나 이런 경우의 경험을 가지고 있으신 분은 조언 부탁드립니다.
안녕히계세요. 꾸뻑 ㅡ0ㅡ;

//---------------------------------------------------------------------------
bool __fastcall TRSPort::SEND(const AnsiString sSendData)
{
    if(iExitThread) return false;

    char C;
    long int iOneCycleTime= 0, iOneCycleAbs= 0;
    iOneCycleTime= clock();                         
    switch(WaitForSingleObject(hMutex, 1000)) {
        case WAIT_ABANDONED:
        case WAIT_TIMEOUT:
        return false;
    }
    bCommResult= false;

    sBufferTX= sSendData;

    this->FlushInBuffer();
    this->FlushOutBuffer();

    this->Output= sBufferTX;  

    bool bRxStart= false;
    int  iCount= 0;
    while(abs(iOneCycleTime-clock())<=3000 && !bCommResult && !iExitThread) {
        if(CharReady()) {   
            C= GetChar();     
            iCount++;
            switch(C) {
                case ACK:
                    bRxStart= true;
                    sBufferRX= (char) C;
                    break;
                case ETX:
                    sBufferRX+= (char) C;
                    if(bRxStart&& !iExitThread) {
                        bCommResult= GLOFA_DECODE();
                        bCommResult= true;   
                    }
                    break;
                default:
                    sBufferRX+= (char) C;
            }
        }
        if((iCount%30)==0) {                      
            Sleep(5);
            Application->ProcessMessages();
        }
    }
    Sleep(SLEEP);
    ReleaseMutex(hMutex);
    iOneCycleAbs= abs(iOneCycleTime - clock());
    return bCommResult;
}
//---------------------------------------------------------------------------

+ -

관련 글 리스트
42041 시리얼 통신 문제입니다. 한번 봐주세요. 쩡이 1559 2005/09/29
42051     Re:시리얼 통신 문제입니다. 한번 봐주세요. ayh 1269 2005/09/29
42053         Re:Re:시리얼 통신 문제입니다. 한번 봐주세요. 쩡이 1332 2005/09/29
42071             Re:Re:Re:시리얼 통신 문제입니다. 한번 봐주세요. 금목암 1498 2005/10/04
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.