Help on CRC-8 function

Hello,

I'm newbie on Node-Red.

I would like to interface my Texecom panel with Node Red with the Texecom Connect Protocol (in TCP/IP).
In this purpose, i need create a CRC-8 function

I have the CRC function but in C language:

I have translate in Red Node function but i have bad CRC calculation:

My function:

var crc= 0x85;
var poly= 0xFF;
var i;
var j;
var buff= new Buffer(msg.payload);

for (let i=0; i < buff.length; i++) {
crc^=buff.readUInt8(i); //msg.payload[i];
for (let j=0; j < 8; j++) {
if ((crc & 0x80)==0x80) {
crc =((crc<<1)^poly);
}
else
{
crc = (crc<<1);
}
}
}

msg.crc = crc;
return msg;

May you help me?

Since there is no byte (or 8bit) number type, try anding all shifts and calcs with 0xff.

If you can provide sample data (the value of payload) and an expected CRC value, I'll show you how.

I have payload but no example of CRC. The only information is the function in C Language :frowning:

i have found this: https://npm.io/package/texecom-connect/v/0.1.7

i have copied the response of the texecom panel:
0x74 x052 0x7 0x2 0x3 0x15 0xd2
0xd2 is the CRC

I have found with this site


i choose:
custom CRC-8
Polynomial: 0x85
Initial Value: 0xFF
Final Xor Value: 0x00
Input reflected:no
Result reflected: :no

I have also found this function (CHECKSUM_TABLE is an extract of the result on the site http://www.sunshine2k.de/coding/javascript/crc/crc_js.html):
But the result is 0xC5. I think that I need to modify the Initial Value (0xFF), but i don't know where?

var CHECKSUM_TABLE = [
0x00, 0x85, 0x8F, 0x0A, 0x9B, 0x1E, 0x14, 0x91, 0xB3, 0x36, 0x3C, 0xB9, 0x28, 0xAD, 0xA7, 0x22,
0xE3, 0x66, 0x6C, 0xE9, 0x78, 0xFD, 0xF7, 0x72, 0x50, 0xD5, 0xDF, 0x5A, 0xCB, 0x4E, 0x44, 0xC1,
0x43, 0xC6, 0xCC, 0x49, 0xD8, 0x5D, 0x57, 0xD2, 0xF0, 0x75, 0x7F, 0xFA, 0x6B, 0xEE, 0xE4, 0x61,
0xA0, 0x25, 0x2F, 0xAA, 0x3B, 0xBE, 0xB4, 0x31, 0x13, 0x96, 0x9C, 0x19, 0x88, 0x0D, 0x07, 0x82,
0x86, 0x03, 0x09, 0x8C, 0x1D, 0x98, 0x92, 0x17, 0x35, 0xB0, 0xBA, 0x3F, 0xAE, 0x2B, 0x21, 0xA4,
0x65, 0xE0, 0xEA, 0x6F, 0xFE, 0x7B, 0x71, 0xF4, 0xD6, 0x53, 0x59, 0xDC, 0x4D, 0xC8, 0xC2, 0x47,
0xC5, 0x40, 0x4A, 0xCF, 0x5E, 0xDB, 0xD1, 0x54, 0x76, 0xF3, 0xF9, 0x7C, 0xED, 0x68, 0x62, 0xE7,
0x26, 0xA3, 0xA9, 0x2C, 0xBD, 0x38, 0x32, 0xB7, 0x95, 0x10, 0x1A, 0x9F, 0x0E, 0x8B, 0x81, 0x04,
0x89, 0x0C, 0x06, 0x83, 0x12, 0x97, 0x9D, 0x18, 0x3A, 0xBF, 0xB5, 0x30, 0xA1, 0x24, 0x2E, 0xAB,
0x6A, 0xEF, 0xE5, 0x60, 0xF1, 0x74, 0x7E, 0xFB, 0xD9, 0x5C, 0x56, 0xD3, 0x42, 0xC7, 0xCD, 0x48,
0xCA, 0x4F, 0x45, 0xC0, 0x51, 0xD4, 0xDE, 0x5B, 0x79, 0xFC, 0xF6, 0x73, 0xE2, 0x67, 0x6D, 0xE8,
0x29, 0xAC, 0xA6, 0x23, 0xB2, 0x37, 0x3D, 0xB8, 0x9A, 0x1F, 0x15, 0x90, 0x01, 0x84, 0x8E, 0x0B,
0x0F, 0x8A, 0x80, 0x05, 0x94, 0x11, 0x1B, 0x9E, 0xBC, 0x39, 0x33, 0xB6, 0x27, 0xA2, 0xA8, 0x2D,
0xEC, 0x69, 0x63, 0xE6, 0x77, 0xF2, 0xF8, 0x7D, 0x5F, 0xDA, 0xD0, 0x55, 0xC4, 0x41, 0x4B, 0xCE,
0x4C, 0xC9, 0xC3, 0x46, 0xD7, 0x52, 0x58, 0xDD, 0xFF, 0x7A, 0x70, 0xF5, 0x64, 0xE1, 0xEB, 0x6E,
0xAF, 0x2A, 0x20, 0xA5, 0x34, 0xB1, 0xBB, 0x3E, 0x1C, 0x99, 0x93, 0x16, 0x87, 0x02, 0x08, 0x8D 
    ]
    
    //let testHex = [0x6a, 0x00, 0x5f, 0x3a, 0x00, 0x01, 0xd5, 0x42];
    
    let crc = new Uint8Array(1);
    crc = 0;
    for (let i = 0; i < msg.payload.length; i++) {
        crc = CHECKSUM_TABLE[(crc ^ (msg.payload[i] & 0xFF)) & 0xFF];
    }
    
    //return (crc & 0xff);
    msg.crc=crc; //crc & 0xff;

return msg;

That's the other way around then in the C code.

Just my 2 cents.

Thats not a valid value i'm afraid

This would be much easier if you could capture a few packets and the CRCs

Assuming you meant 0x74 0x52 0x07 0x02 0x03 0x15 0xd2 has a CRC of 0xd2 then even that C code doesnt give 0xd2

Assuming you meant 0x74 0x52 0x07 0x02 0x03 0x15 has a CRC of 0xd2 then even that C code doesnt give 0xd2 - you get 67 (or 0x43)

C version...
image
Click here to see it in action

Additionally, my interpretation of that c code in JS function results in the same CRC

[{"id":"aa6441fb.6f381","type":"function","z":"56a2925d.72edac","name":"Calc CRC","func":"var crc= 0x85;\nvar poly= 0xFF;\n\nvar buf= msg.payload;\n\nfor (let i=0; i < buf.length; i++) {\n    crc = (crc ^ (buf.readUInt8(i) & 0xff)) & 0xff\n    for (let j=0; j < 8; j++) {\n        if ((crc & 0x80)==0x80) {\n            crc =  ( ((crc<<1) & 0xff) ^ poly) & 0xff;\n        } else {\n            crc = ((crc & 0xff) << 1) & 0xff;\n        }\n    }\n}\n\nmsg.crc = crc;\nmsg.crchex = crc.toString(16);\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":900,"y":200,"wires":[["9cd60bb9.e21668"]]},{"id":"9d48507f.9343c","type":"inject","z":"56a2925d.72edac","name":"as hex string 745207020315","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"hex string 745207020315","payload":"745207020315","payloadType":"str","x":620,"y":140,"wires":[["1bf1e4.0d454e1d"]]},{"id":"1bf1e4.0d454e1d","type":"function","z":"56a2925d.72edac","name":"to buffer","func":"msg.payload = Buffer.from(msg.payload,\"hex\")\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":880,"y":140,"wires":[["aa6441fb.6f381"]]},{"id":"9cd60bb9.e21668","type":"debug","z":"56a2925d.72edac","name":"crc","active":true,"tosidebar":true,"console":false,"tostatus":true,"complete":"true","targetType":"full","statusVal":"crc","statusType":"msg","x":1050,"y":200,"wires":[]},{"id":"6634df59.7895f","type":"inject","z":"56a2925d.72edac","name":"as buffer [116 ,82 ,7 ,2 ,3 ,21]","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"buffer [116 ,82 ,7 ,2 ,3 ,21]","payload":"[116 ,82 ,7 ,2 ,3 ,21]","payloadType":"bin","x":620,"y":240,"wires":[["aa6441fb.6f381"]]},{"id":"ac80a6c.4707958","type":"inject","z":"56a2925d.72edac","name":"as hex string 745207020315d2","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"hex string 745207020315d2","payload":"745207020315d2","payloadType":"str","x":630,"y":100,"wires":[["1bf1e4.0d454e1d"]]},{"id":"f03c1bd1.83ecb8","type":"inject","z":"56a2925d.72edac","name":"as buffer [116 ,82 ,7 ,2 ,3 ,21 ,210]","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"buffer [116 ,82 ,7 ,2 ,3 ,21 ,210]","payload":"[116 ,82 ,7 ,2 ,3 ,21, 210]","payloadType":"bin","x":640,"y":200,"wires":[["aa6441fb.6f381"]]}]

Thanks for all, that's run :slight_smile:

my function:

var CHECKSUM_TABLE = [
0x00, 0x85, 0x8F, 0x0A, 0x9B, 0x1E, 0x14, 0x91, 0xB3, 0x36, 0x3C, 0xB9, 0x28, 0xAD, 0xA7, 0x22,
0xE3, 0x66, 0x6C, 0xE9, 0x78, 0xFD, 0xF7, 0x72, 0x50, 0xD5, 0xDF, 0x5A, 0xCB, 0x4E, 0x44, 0xC1,
0x43, 0xC6, 0xCC, 0x49, 0xD8, 0x5D, 0x57, 0xD2, 0xF0, 0x75, 0x7F, 0xFA, 0x6B, 0xEE, 0xE4, 0x61,
0xA0, 0x25, 0x2F, 0xAA, 0x3B, 0xBE, 0xB4, 0x31, 0x13, 0x96, 0x9C, 0x19, 0x88, 0x0D, 0x07, 0x82,
0x86, 0x03, 0x09, 0x8C, 0x1D, 0x98, 0x92, 0x17, 0x35, 0xB0, 0xBA, 0x3F, 0xAE, 0x2B, 0x21, 0xA4,
0x65, 0xE0, 0xEA, 0x6F, 0xFE, 0x7B, 0x71, 0xF4, 0xD6, 0x53, 0x59, 0xDC, 0x4D, 0xC8, 0xC2, 0x47,
0xC5, 0x40, 0x4A, 0xCF, 0x5E, 0xDB, 0xD1, 0x54, 0x76, 0xF3, 0xF9, 0x7C, 0xED, 0x68, 0x62, 0xE7,
0x26, 0xA3, 0xA9, 0x2C, 0xBD, 0x38, 0x32, 0xB7, 0x95, 0x10, 0x1A, 0x9F, 0x0E, 0x8B, 0x81, 0x04,
0x89, 0x0C, 0x06, 0x83, 0x12, 0x97, 0x9D, 0x18, 0x3A, 0xBF, 0xB5, 0x30, 0xA1, 0x24, 0x2E, 0xAB,
0x6A, 0xEF, 0xE5, 0x60, 0xF1, 0x74, 0x7E, 0xFB, 0xD9, 0x5C, 0x56, 0xD3, 0x42, 0xC7, 0xCD, 0x48,
0xCA, 0x4F, 0x45, 0xC0, 0x51, 0xD4, 0xDE, 0x5B, 0x79, 0xFC, 0xF6, 0x73, 0xE2, 0x67, 0x6D, 0xE8,
0x29, 0xAC, 0xA6, 0x23, 0xB2, 0x37, 0x3D, 0xB8, 0x9A, 0x1F, 0x15, 0x90, 0x01, 0x84, 0x8E, 0x0B,
0x0F, 0x8A, 0x80, 0x05, 0x94, 0x11, 0x1B, 0x9E, 0xBC, 0x39, 0x33, 0xB6, 0x27, 0xA2, 0xA8, 0x2D,
0xEC, 0x69, 0x63, 0xE6, 0x77, 0xF2, 0xF8, 0x7D, 0x5F, 0xDA, 0xD0, 0x55, 0xC4, 0x41, 0x4B, 0xCE,
0x4C, 0xC9, 0xC3, 0x46, 0xD7, 0x52, 0x58, 0xDD, 0xFF, 0x7A, 0x70, 0xF5, 0x64, 0xE1, 0xEB, 0x6E,
0xAF, 0x2A, 0x20, 0xA5, 0x34, 0xB1, 0xBB, 0x3E, 0x1C, 0x99, 0x93, 0x16, 0x87, 0x02, 0x08, 0x8D 
    ]
    
    //let testHex = [0x6a, 0x00, 0x5f, 0x3a, 0x00, 0x01, 0xd5, 0x42];
    
    let crc = new Uint8Array(1);
    crc = 0xFF;
    for (let i = 0; i < msg.payload.length; i++) {
        crc = CHECKSUM_TABLE[(crc ^ (msg.payload[i] & 0xFF)) & 0xFF];
    }
    
    //return (crc & 0xff);
    msg.crc=crc; //crc & 0xff;
    //var payload= msg.payload + crc;
    //var payload= new Buffer(msg.payload+new Uint8Array(crc));
    //payload.push(crc); //=msg.payload
    //msg.payload=payload;
    var payload= Buffer.alloc(msg.payload.length+1);
    for (let i = 0; i < msg.payload.length; i++) {
        payload[i]=msg.payload[i];      
    }
    payload[payload.length-1]=crc;
    msg.payload=payload;
return msg;
1 Like

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.