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
[63933] Re:Re:serial 통신 receive 가 잘 안되서 질문 드립니다.
초보 견습생 [minkoog] 1912 읽음    2011-03-16 10:56
송신측에서 한번에 데이터를 선송한다고 해도
수신측에선 송신측에서 전송된 데이터를 길이만큼 받는것이 아닙니다
그때 그때 시스템 상황에 따라 여러번 동작할 수 있습니다

buffer와 data (unsigned 형)
통신에 넘들중에 128값 이상을 무시하는 설정이 있는 넘도있습니다
아래쪽 데이터에서 [A5]값을 처리하는것으로 봐선 아닌듯하고
선어부에 문제가 있는듯
tpapro라는 넘이 있는데 참 쓸만하죠

그리고 case 0에 break; <-- 확인요

[5][6] Data를 받고 처리 해야 할듯 한데

다음은 조금 수정된 내용 입니다
    Comm1->Read(serial_data,Count);
    for(i=0;i<Count;i++){
        buffer=serial_data[i];
        switch(serial_number){
            case 0: case 1: case 2: case 3: case 4:
                if(buffer==0xa5) {
                    data[ serial_number++ ] = buffer;
                } else{
                    serial_number=0;
                    message = 0;
                }
                break;
            /--------------------------------------------------------------------------
           
            default:
                data[serial_number++]=buffer;
                if ( serial_number >= 6 ) {
                    if((unsigned int)((data[5]<<8)+data[6])<serial_number) <----- 이부분           
                    {
                    ..
                    ..
                    }
                }
                if(serial_number >= 1024 ) serial_number = 0;
                break;
        }
    }



nansama 님이 쓰신 글 :
: data[] 가 혹시 char 형이라면 byte ( unsigned char ) 형이어야 할것 같아요,.
:
: 번외편 님이 쓰신 글 :
: : C++ Builder 6 유저입니다.
: : comport 시리얼 통신을 하다가 send쪽은 되는데 receive가 잘 안되어서 질문 드립니다.
: :
: : 우선 receive 패킷 프레임은 아래와 같습니다.
: : Preamble   (4byte)  : 0xa5 0xa5 0xa5 0xa5
: : STX            (1byte) : 0xAE
: : Length        (2byte) : stx~etx
: : Type           (2byte) : 0x0000 ~ 0xffff
: : Opcode      (1byte) : 0x00 ~ 0xff
: : Data           (Nbyte) : 0x00 ~ 0xff 길이 가변
: : CRC           (1byte) : length~data 합(%255)
: : ETX            (1byte) : 0xaf
: : 이런 프레임을 가지고 있으며 length type opcode data 는 Preamble, STX, ETX의 데이터를 가질수 없으며
: : stuffing을 해서
: : Preamble과 동일 데이터는 0xa0 0x05로 send 및 receive를 하며
: : STX 동일데이터는 0xa0 0x0e
: : ETX 동일데이터는 0xa0 0x0f
: : 데이터 중간 a0가 있을시 0xa0 0x00 입니다.
: :
: : send쪽은 전부 코딩했는데 receive를 하면서 데이터가 잘 받아지지 않습니다.
: : 소스에 이상한부분이 있는지좀 봐주시면 감사드리겠습니다.
: : c++ builder 6에 comm 컴포넌트 사용중입니다.
: : 아래 소스 입니다.
: :
: : unsigned int SERIAL_LEN = 0;
: :
: : void __fastcall TForm1::Comm1RxChar(TObject *Sender, DWORD Count)
: : {
: :         Comm1->Read(serial_data,Count);
: :         for(i=0;i<Count;i++)
: :         {
: :                 buffer=serial_data[i];
: :
: :                 switch(serial_number)
: :                 {
: :                         case 0:
: :                         if(buffer==0xa5)
: :                         {
: :                                 serial_number=1;
: :                                 data[0]=buffer;
: :                         }
: :                         else
: :                         {
: :                                 serial_number=0;
: :                                 message = 0;
: :                         }
: :
: :                         case 1:
: :                         if(buffer==0xa5)
: :                         {
: :                                 serial_number=2;
: :                                 data[1]=buffer;
: :                         }
: :                         else
: :                         {
: :                                 serial_number=0;
: :                         }
: :                         break;
: :
: :                         case 2:
: :                         if(buffer==0xa5)
: :                         {
: :                                 serial_number=3;
: :                                 data[2]=buffer;
: :                         }
: :                         else
: :                         {
: :                                 serial_number=0;
: :                         }
: :                         break;
: :
: :                         case 3:
: :                         if(buffer==0xa5)
: :                         {
: :                                 serial_number=4;
: :                                 data[3]=buffer;
: :                         }
: :                         else
: :                         {
: :                                 serial_number=0;
: :                         }
: :                         break;
: :
: :                         default:
: :                         data[serial_number-1]=buffer;
: :                         serial_number++;
: :                         if(serial_number >= 1024 ) serial_number = 0;
: :               break;
: :                 }
: :                 if((unsigned int)((data[5]<<8)+data[6])<serial_number) <----- 이부분
: :                 {
: :                 }
: :         }
: :         serial_number = 0;
: : }
: :
: : 위의 저 부분을 체크해보니 숫자를 강제로 length에 맞춰서 136과 같이 넣으면 동작되는데
: : 저렇게 (unsigned int)((data[5]<<8)+data[6]) 넣으면 동작을 하지 않습니다.
: : 먼저 stuff를 하고 if문이 들어가야 하지만 데이터에 stuff 해야하는 데이터를 넣지 않아도
: : 동작을 하지 않네요.
: :
: : 어디 부분에서 잘못하고있는지 찍어주시면 감사하겠습니다.
: : receive 되는 실제 패킷은 아래와 같습니다.
: :
: : 2011-03-15 23:22:43.785 [RX] - A5 A5 A5 A5 AE 00 84 02 00 00 01 01 00 00 00 10 04 07 90 23 27 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 7D AF
: : 또 다른 패킷
: : 2011-03-15 23:30:15.325 [RX] - A5 A5 A5 A5 AE 00 09 12 00 EE 01 09 AF

+ -

관련 글 리스트
63931 serial 통신 receive 가 잘 안되서 질문 드립니다. 번외편 1506 2011/03/16
63932     Re:serial 통신 receive 가 잘 안되서 질문 드립니다. nansama 1805 2011/03/16
63933         Re:Re:serial 통신 receive 가 잘 안되서 질문 드립니다. 초보 견습생 1912 2011/03/16
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.