|
송신측에서 한번에 데이터를 선송한다고 해도
수신측에선 송신측에서 전송된 데이터를 길이만큼 받는것이 아닙니다
그때 그때 시스템 상황에 따라 여러번 동작할 수 있습니다
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
|