Page History: Xmodem CRC
Compare Page Revisions
Page Revision: 2018/12/13 07:59
Introduction:This CRC (Cyclic Redundancy Check) is for the Xmodem transfer protocol. The 16 bit CRC is calculated by processing the data in a message bit by bit. It cannot correct any data corruption but can indicate if a message has been corrupted in any way.
PLEASE NOTE:Although this is an Xmodem CRC it is in no way restricted to the Xmodem protocol. Like the Modbus CRC any message structure of any length consisting of a stream of 8-bit data bytes can utilise it to improve security. For example:
Msg$ = “The quick brown fox jumps over the lazy dog”
The structure of an Xmodem message is:
Byte 1 SOH
Byte 2 Packet number (0-255)
Byte 3 Inverse packet number (255 - packet number)
Byte 4-131 128 bytes of data
Byte 132-133 16 bit CRC
The receiver responds with an ACK or NACK depending whether the CRC is good or bad. And depending on the answer the transmitter will transmit the next block of data or re-transmit the bad block. Where there are not 128 bytes of data the block of 128 is filled with a packing character. If you want to fully implement the Xmodem protocol there is plenty of infomation on the web.
Add the CRC to the message (eg: RxMsg$) by:
TxMsg$ = TxMsg$ + XCRC$(TxMsg)
and transmit it.
Performing a CRC check on a message that already includes a valid CRC will produce a 'CRC' of &h000 so:
To test a recieved message (eg: RxMsg$) for a correct CRC and that it is not otherwise corrupted use:
IF XCRC$(RxMsg$) = CHR$(0) + CHR$(0) THEN ' CRC is OK
' Ignore the message or send a NAK
ELSE
' Process the message
END IF
Assumptions:
None
The Function:
FUNCTION XCRC$(a$)
LOCAL CRC% = &H0000, n%, j%
FOR n% = 1 TO LEN(A$)
CRC% = (CRC% AND &HFFFF) XOR (ASC(MID$(a$, n%, 1)) << 8)
FOR j% = 1 TO 8
IF (CRC% AND &H8000) <> 0 THEN
CRC% = (CRC% << 1) XOR &H1021
ELSE
CRC% = CRC% << 1
END IF
NEXT j%
NEXT n%
XCRC$ = CHR$(CRC% >> 8 AND &HFF) + CHR$(CRC% AND &HFF)
END FUNCTION