Q&A

  • CRC 통신 중에 ;; TT
원 소스는 아래 형태의 각각 진행 소스 입니다.
장치와의 통신이 잘됩니다.

SendBuff := SStxHead + Chr($15) + Chr($00) + Chr(Sv)+ #05 +     <- 패킷
                    SendWeek + SendDate + SendTime + SEtxHead;
  <- SendBuff는 스트링입니다.

MakeCRC(SendBuff);
_QCCom32V51.Write (SendBuff);     <- 통신 콤포넌트

procedure MakeCRC(VAR PlainData : String);
var
CRC : Word;
begin
     CRC := CalcCRC(PlainData);
     PlainData := PlainData + Chr(HiByte(CRC)) + Chr(LoByte(CRC));
end;

function CalcCRC(PlainData : String):Word;
var
   i, Len, CRC, tCRC:  WORD;
begin
     Len := Length(PlainData);
     CRC := $FFFF;
     For i := 1 To Len Do
     begin
          tCRC := LoByte(CRC) XOR Byte((@PlainData[i])^);
          CRC  := HiByte(CRC);
          tCRC := CRC_table[tCRC];
          CRC  := CRC XOR tCRC;
     end;
     CRC := CRC XOR $FFFF;
    

     Result := swap(CRC);
end;

바로 위의 함수 CalcCRC에서는 String 을 인자로 받습니다.
그런데 저희쪽 프로그램에서는 바이트 배열을 보냅니다.
Send[0] := $00;
Send[1] := $15;
Send[2] := $00;
.
.
그리고 Comport(Send, 8); <-통신 컴포넌트  
이런식으로 다른 통신컴포넌트를 씁니다.
마지막 Send[6]과 Send[7]을 0으로 하면 CRC 검사를 안하기 때문에
통신이 잘 됩니다.
그런데 저 나름대로 함수를 바이트 배열을 받도록 하던가 4일동단
별 수를 다쓰면서 똑 같이 값을 넣어서 계산하고 통신을 하면 CRC 오류가나서
통신이 도대체 되지 않습니다.
고수님들 한번 보시고 CalcCRC 함수가 바이트 배열을 받고 제대로 계산 되도록 수정 좀 해주셨으면 합니다. 너무 초보라 별수를 다써도 당체 알수가 있어야죠 TT  
1  COMMENTS
  • Profile
    한만교 2004.01.26 19:17
    수정부분은 CRC16의 연산법입니다..
    모드버스 통신용 컴포넌트 개발에 사용한 소스입니다..
    그럼..
         CRCHi, CRCLo : Byte;
           CRCHi := $FF;
           CRCLo := $FF;

                tCRC   := CRCHi xor byte(PlainData[i]);
                CRCHi := CRCLo xor CRC_table[tCRC];
                CRCLo := CRC_table[tCRC];

           Result := (CRCHi shl 8 or CRCLo);