# Finding out checksum algorithm

I have old serial communication protocol and having some trouble finding out about checksum algorithm that has been used. I've tried several CRC16 algorithms and none of them seem to work.

Tx message format looks like:

``````start(10B) + messageIndex(1B) + data(5-15B) + checksum(2B) + end(1B)
``````

Rx message has same format but only 1 data byte. Here are few examples provided (hash # added to separate the blocks; hexadecimal format):

``````Tx: 82 00 00 00 01 00 00 00 ff c1 # 48 # 56 57 50 41 54 5f 30 5f 31 3d 31 # 7f 12 # 83
Rx: 82 00 00 00 ff 00 00 00 01 01 # 48 # 4f # cc 68 # 83

Tx: 82 00 00 00 01 00 00 00 ff c1 # 49 # 56 57 50 41 4e 5f 30 5f 32 3d 49 55 30 30 30 # f5 16 # 83
Rx: 82 00 00 00 ff 00 00 00 01 01 # 49 # 4f # 5c 69 # 83

Tx: 82 00 00 00 01 00 00 00 ff c1 # 4a # 56 57 50 41 54 5f 30 5f 32 3d 31 # b8 1b # 83
Rx: 82 00 00 00 ff 00 00 00 01 01 # 4a # 4f # ac 69 # 83

Tx: 82 00 00 00 01 00 00 00 ff c1 # 4b # 56 57 41 4b 54 50 4e 5f 30 3d 32 # 60 6f # 83
Rx: 82 00 00 00 ff 00 00 00 01 01 # 4b # 4f # 3c 68 # 83

Tx: 82 00 00 00 01 00 00 00 ff c1 # 4c # 56 57 50 41 4e 5f 31 5f 31 3d 49 4c 30 30 30 # 6a ec # 83
Rx: 82 00 00 00 ff 00 00 00 01 01 # 4c # 4f # 0c 6a # 83
``````

If necessary, I can provide more data. Any help or hint would be appreciated ;)

Best regards, Zlatko

EDIT The correct algorithm is regular CRC16 (0x8005 polynom). Thanks booto for correct answer.

It's a big-endian CRC16 (polynomial `0x8005`) of the data from the byte following the `0x82` up to and including the byte before the CRC.

For example, for your last RX frame:

``````82 00 00 00 ff 00 00 00 01 01 4c 4f 0c 6a 83
``````

The CRC16 of `{0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x01,0x01,0x4c,0x4f}` is `0x0c6a`.

To find out this CRC algorithm, I assumed that `0x82` was a 'Start-of-Frame' marker and `0x83` was an 'End-of-Frame' marker. Then, I plugged the remaining data (sans crc field) into this on-line CRC calculation application and the emitted CRC16 looked correct.

I, then, checked a few of the other frames you supplied and verified the CRC calculation with other sources.

And, voila...

• Out of interest, how did you work that out? – Cybergibbons Aug 12 '15 at 7:44
• I assumed 0x82 was a Start-of-Frame marker and 0x83 was an End-of-Frame marker. I plugged the remaining data (sans crc field) into lammertbies.nl/comm/info/crc-calculation.html and the emitted CRC16 looked correct. I then checked a few of the other frames you supplied and verified the crc calculation with other sources. – booto Aug 12 '15 at 8:23
• I have tried the algorithm on few more examples that I have not posted and it does work. – zlajoan Aug 12 '15 at 12:47