Welcome Guest, you are in: Login

Fruit Of The Shed

Navigation (MMBasic)

Search the wiki


Xmodem CRC

Modified on 2020/11/29 21:22 by CaptainBoing Categorized as Communications, Strings


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.

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
' Process the message
' Ignore the message or send a NAK


The Function:
  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
        CRC% = CRC% << 1
      END IF
    NEXT j%
  NEXT n%
  XCRC$ = CHR$(CRC% >> 8 AND &HFF) + CHR$(CRC% AND &HFF)