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
[72565] Re:Cport Rx부분 질문입니다.
라스코니 [chouoo] 4189 읽음    2015-04-21 17:03
ComPort2RxChar() 가 rs232 수신단의 콜백함수라면 아래와 같이 해보세요.

char strr[200]; // NULL '/0' 로 초기화

ComPort2RxChar(int Count)
{
    char buff[100];
    char tmp[100];
    char *pos = &buff[0];
    char *result;
    int rcvdCnt;

    memset(buff,0,sizeof(buff));  // '\0' 으로 초기화
    memset(tmp,0,sizeof(tmp));  // '\0' 으로 초기화

    // rs232 port 로부터 Count 개수만큼 읽는다.
    rcvdCnt = ComPort2->Read(buff,Count);

    while(pos) {
        // 임시 tmp 저장소에 buff 데이터를 넣어준다
        strcpy(tmp, pos);

        // buff의 'E' 다음 위치를 업데이트, 즉 'E' 가 있는지 찾는다
        pos = (strstr(pos, strstr(pos, "E") != NULL) ? (strstr(pos, strstr(pos, "E")+1) : NULL;

        // 임시 tmp 저장소에 buff 데이터를 넣어준다
        if(pos) {  // tmp 내에 'E' 가 들어있다. 즉 다 들어온 데이터가 있다.
            // tmp 버퍼에 있는 데이터 중 'E' 뒤를 지워준다
            result = strstr(tmp, "E");
            *result = '\0';

            strcat(strr, tmp); // strr에 합친다.
            voltage = atof(strr); // 받은 문자열을 숫자로 변환한다
            memset(strr,0,sizeof(strr));  // strr을 초기화
        }
        else { // tmp 내에 'E'가 없다. 따라서 더 기다려야 한다
            strcat(strr, tmp); // strr에 합친후 다시 'E'가 들어오기를 기다린다
        }
    }
}

첨언하자면 질문을 하실때는 기본적인 매너는 지켜주세요. 저를 포함해서 몇분이 앱돌이님의 질문에 답변을 달아줬지만 아무런 피드백도 받지 못했습니다. 답변을 달아 주시는 분들도 귀중한 시간을 할애해서 글을 쓰는 만큼 기본적인 피드백은 남겨주시길 바라고 그리고 동일한 문제로 계속 다른 글타래를 만드는 것도 좋지 않아 보입니다. 하나의 글타래에 계속 답글을 다는것이 좋지 않을까요?

앱돌이 님이 쓰신 글 :
: c++왕초보자 질문좀 받아주세요
: Button3를 누르면 계측기로 명령어가 입력되어 rx부분에서 수신받아 LoadGrid함수를 불러 StringGrid에 뿌려지는 소스인대요
: StringGrid에 뿌려지는 걸 확인해보면 Read부분에서 아주잠깐 지연시간을 주면 정상적으로 계측기의 값이 입력됩니다.
: 지연시간을 없에버리면 숫자가 한개씩입력되거나 아예 입력이 안됩니다.
: breakPoint를 주고 확인해보면 breakpoint때문인지 정상적으로 입력이 됩니다.
: 그래서 다른분들의 조언을 들어 Rx부분 Count가 충분히 되었는지 확인하기위해 buff에 E가 입력될시 함수 호출하는 식으로 수정을 했는데 이번엔 Sleep을 해주면 정상출력되고 Sleep을 제거하면 E만 출력됩니다. ㅜ.ㅜ 너무 답답해서 조언을 구합니다.
: 질문1: Count가 충분한지 확인하려면 어떤식으로 수정을 해야할까요?
: 질문2: Count로 확인하지않고 buff에 문자열이 다들어왔는지 확인하기위해선 어떤식으로 수정해야할까요?
: 질문3: 문자열에 ETX까지 입력되었는지 확인하기위해선 어떻게해야할까요? 
:
: 전송방식은 rs232 LF입니다.
:
:
:
: 메모 부분은 그냥 확인하기 위해 만든거라 무시하셔도됩니다.
:
:
: double voltage;
: AnsiString ConVolt;
: char strr[200];
:
: void __fastcall TForm1::Button3Click(TObject *Sender)
: {
:
:
:
:         ComPort2->Open();
:         sprintf(strr,"MEAS:VOLT:DC?%c",0x0a);
:         ComPort2->Write(strr,StrLen(strr));
:
:
:
:
: }
:
:
: void __fastcall TForm1::ComPort2RxChar(TObject *Sender, int Count)
: {
:
:          char buff[100];
:
:          memset(buff,0,sizeof(buff));
:          for(int i=0;i<Count;i++){
:                 ComPort2->Read(buff,Count);
:                 Memo2->Lines->Add(buff);
:                 if(strstr(buff,"E")!= NULL){
:                         voltage = atof(buff);
:                         ConVolt = FloatToStr(voltage).sprintf("%.3f",voltage);
:                         LoadGrid();
:
:                 }
:          }
:
:
:
:
:
: }

+ -

관련 글 리스트
72561 Cport Rx부분 질문입니다. 앱돌이 4002 2015/04/21
72571     Re:Cport Rx부분 질문입니다. 김시환 4032 2015/04/23
72573         Re:Re:Cport Rx부분 질문입니다. 앱돌이 4008 2015/04/23
72565     Re:Cport Rx부분 질문입니다. 라스코니 4189 2015/04/21
72583         Re:Re:Cport Rx부분 질문입니다. 앱돌이 4064 2015/04/24
72572         Re:Re:Cport Rx부분 질문입니다. 앱돌이 3984 2015/04/23
72579             Re:Re:Re:Cport Rx부분 질문입니다. 라스코니 4048 2015/04/24
72570         Re:Re:Cport Rx부분 질문입니다. 4014 2015/04/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.