원 소스는 아래 형태의 각각 진행 소스 입니다.
장치와의 통신이 잘됩니다.
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
모드버스 통신용 컴포넌트 개발에 사용한 소스입니다..
그럼..
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);