CRC16 변경에 대해서 문의드립니다.
C코드를 델파이로 변경했는데 제대로 안되는것 같아서요.
고수님들의 고견한 견해 부탁드립니다.
기존 C 코드 입니다.
#define CRC_POLYNOM_COMMON 0x8408
#define CRC_PRESET_COMMON 0xFFFF
U32 Crc16Full_Common(U8 *data, int count, int Flag_Send)
{
U32 crcValue = CRC_PRESET_COMMON;
int i,j;
for(i=0;i<count;i++){
crcValue ^=(unsigned int)data[i];
for(j=0;j<8;j++)
crcValue=(crcValue & 0x0001) ? (crcValue>>1)^CRC_POLYNOM_COMMON:(crcValue>>1);
}
if (Flag_Send){
data[i] = crcValue&0xFF;
data[i+1] = crcValue>>8;
return crcValue;
}
else {
if (crcValue ==0) return 0;
else return 1;
}
}
위에 C코드를 변경한것인데 맞게 변경한 것인지 모르겠습니다.
작동해 보니 제대로 안되는것도 같고...
틀린부분이 있는지요...부탁드립니다..
function TForm1.make_crc16(msg: PChar; iLength, flag: Integer): Word;
var
crc, Tembyte : Word;
i, j : Integer;
begin
crc := $ffff;
for i:= 0 to iLength -1 do
begin
crc := (crc xor Word(msg[i]));
for j:= 0 to 7 do
begin
if (crc and $0001) > 0 then
crc := (crc shr 1) xor $8408 // POLYNOM
else
crc := (crc shr 1);
end;
end;
if flag = 1 then
begin
Buffer2[i] := crc and $ff;
Buffer2[i+1] := crc shr 8;
Result := crc;
end
else
begin
if crc = 0 then
Result := 0
else
Result := 1;
end;
end;
procedure TForm1.Timer2Timer(Sender: TObject);
var
SendStr : String;
begin
SendStr := '6' + Char($FF) + Char($A0) + Char($E2);
make_crc16(PChar(SendStr), 4, 1);
// ComPort2.Write(Buffer2,Length(Buffer2));
end;