Q&A

  • RS232 통신중 CRC에 대해..
안녕하세요.

음 하다가 막히는 부분이 있어 이렇게 글을 올립니다.

아래 평션은 사부가 만든건데 1년전에 그만 둬서....쩝.

초보인 저로서는 이걸 해야 하는데 분석조차 참 힘드네요..



여기서 CRCMASK = #223 입니다.





//======================================== 수신 Data CRC Check

function CkCRC( sStr : String ) : Boolean;

var

i : integer;

sum, crc : Char;

begin

sum := #0;



for i:=2 to Length( sStr )-2 do

sum := Chr( Ord(sum) + Ord(sStr[i]) );

crc := Chr( Ord(sum) and Ord(CRCMASK) );

if 0 = Ord(crc) then crc := Chr( not Ord(CRCMASK) );



if sStr[Length(sStr)-1] = crc then Result := True

else Result := False;

end;



//========================================== 송신할 Data의 CRC를 만든다.

function CRCMake( SendStr : String ) : Char;

var

i : integer;

sum, crc : Char;

begin

sum := #0;



for i:=3 to Length(SendStr) do

sum := Chr( Ord(sum) + Ord(SendStr[i]) );

crc := Chr( Ord(sum) and Ord(CRCMASK) );

if 0 = Ord(crc) then crc := Chr( not Ord(CRCMASK) );



Result := crc;

end;



SendStr, Str 모두 ABC 가 들어왔다고 가정하면

값이 어떻게 되는지요?

설명도 좀 부탁드립니다..그럼.



2  COMMENTS
  • Profile
    김용배 2000.12.12 03:38
    정성훈 wrote:

    > 안녕하세요.

    > 음 하다가 막히는 부분이 있어 이렇게 글을 올립니다.

    > 아래 평션은 사부가 만든건데 1년전에 그만 둬서....쩝.

    > 초보인 저로서는 이걸 해야 하는데 분석조차 참 힘드네요..

    >

    > 여기서 CRCMASK = #223 입니다.

    >

    >

    > //======================================== 수신 Data CRC Check

    > function CkCRC( sStr : String ) : Boolean;

    > var

    > i : integer;

    > sum, crc : Char;

    > begin

    > sum := #0;

    >

    > for i:=2 to Length( sStr )-2 do

    > sum := Chr( Ord(sum) + Ord(sStr[i]) );

    > crc := Chr( Ord(sum) and Ord(CRCMASK) );

    > if 0 = Ord(crc) then crc := Chr( not Ord(CRCMASK) );

    >

    > if sStr[Length(sStr)-1] = crc then Result := True

    > else Result := False;

    > end;

    >

    > //========================================== 송신할 Data의 CRC를 만든다.

    > function CRCMake( SendStr : String ) : Char;

    > var

    > i : integer;

    > sum, crc : Char;

    > begin

    > sum := #0;

    >

    > for i:=3 to Length(SendStr) do

    > sum := Chr( Ord(sum) + Ord(SendStr[i]) );

    > crc := Chr( Ord(sum) and Ord(CRCMASK) );

    > if 0 = Ord(crc) then crc := Chr( not Ord(CRCMASK) );

    >

    > Result := crc;

    > end;

    >

    > SendStr, Str 모두 ABC 가 들어왔다고 가정하면

    > 값이 어떻게 되는지요?

    > 설명도 좀 부탁드립니다..그럼.

    >



    제가 쓰는 방식은 crc table을 배열로 정의해놓고 쓰는데 참고하세요..

    crc mask값은 일반적으로 #255값을 쓰는데 이분은 아마도 프로토콜상에 lock을

    하기위해 mask값을 바꾼것 같군요..



    function Crc16Process(nDp: PChar; const nSize: Word): Word;

    const

    //==================================================================================================

    // > CRC Table Define

    //--------------------------------------------------------------------------------------------------

    nCrcTable: array[0..255] of Word = (

    $0000,$C0C1,$C181,$0140,$C301,$03C0,$0280,$C241,$C601,$06C0,$0780,$C741,$0500,$C5C1,

    $C481,$0440,$CC01,$0CC0,$0D80,$CD41,$0F00,$CFC1,$CE81,$0E40,$0A00,$CAC1,$CB81,$0B40,

    $C901,$09C0,$0880,$C841,$D801,$18C0,$1980,$D941,$1B00,$DBC1,$DA81,$1A40,$1E00,$DEC1,

    $DF81,$1F40,$DD01,$1DC0,$1C80,$DC41,$1400,$D4C1,$D581,$1540,$D701,$17C0,$1680,$D641,

    $D201,$12C0,$1380,$D341,$1100,$D1C1,$D081,$1040,$F001,$30C0,$3180,$F141,$3300,$F3C1,

    $F281,$3240,$3600,$F6C1,$F781,$3740,$F501,$35C0,$3480,$F441,$3C00,$FCC1,$FD81,$3D40,

    $FF01,$3FC0,$3E80,$FE41,$FA01,$3AC0,$3B80,$FB41,$3900,$F9C1,$F881,$3840,$2800,$E8C1,

    $E981,$2940,$EB01,$2BC0,$2A80,$EA41,$EE01,$2EC0,$2F80,$EF41,$2D00,$EDC1,$EC81,$2C40,

    $E401,$24C0,$2580,$E541,$2700,$E7C1,$E681,$2640,$2200,$E2C1,$E381,$2340,$E101,$21C0,

    $2080,$E041,$A001,$60C0,$6180,$A141,$6300,$A3C1,$A281,$6240,$6600,$A6C1,$A781,$6740,

    $A501,$65C0,$6480,$A441,$6C00,$ACC1,$AD81,$6D40,$AF01,$6FC0,$6E80,$AE41,$AA01,$6AC0,

    $6B80,$AB41,$6900,$A9C1,$A881,$6840,$7800,$B8C1,$B981,$7940,$BB01,$7BC0,$7A80,$BA41,

    $BE01,$7EC0,$7F80,$BF41,$7D00,$BDC1,$BC81,$7C40,$B401,$74C0,$7580,$B541,$7700,$B7C1,

    $B681,$7640,$7200,$B2C1,$B381,$7340,$B101,$71C0,$7080,$B041,$5000,$90C1,$9181,$5140,

    $9301,$53C0,$5280,$9241,$9601,$56C0,$5780,$9741,$5500,$95C1,$9481,$5440,$9C01,$5CC0,

    $5D80,$9D41,$5F00,$9FC1,$9E81,$5E40,$5A00,$9AC1,$9B81,$5B40,$9901,$59C0,$5880,$9841,

    $8801,$48C0,$4980,$8941,$4B00,$8BC1,$8A81,$4A40,$4E00,$8EC1,$8F81,$4F40,$8D01,$4DC0,

    $4C80,$8C41,$4400,$84C1,$8581,$4540,$8701,$47C0,$4680,$8641,$8201,$42C0,$4380,$8341,

    $4100,$81C1,$8081,$4040 );

    //--------------------------------------------------------------------------------------------------

    var

    nComb_val,nAccp,nLen: Word;

    begin

    nAccp := 0;

    for nLen := 0 to Pred(nSize) do begin

    nComb_val := nAccp xor Word(nDp[nLen]);

    nAccp := ((nAccp shr 8) xor nCrcTable[nComb_val and $00FF]);

    end;

    Result := nAccp;

    end;



  • Profile
    정성훈 2000.12.13 02:56
    내용무 답변 정말 감사합니다. 조금 어렵지만 함 해볼께요....

    그럼 오늘 하루도 행복하시길..