node-modbus-serial icon indicating copy to clipboard operation
node-modbus-serial copied to clipboard

Does the CRC check in the Modbus RTU code have any effect?

Open covered0000 opened this issue 1 year ago • 0 comments

servers\serverserial.js

class ServerSerial extends EventEmitter {
    ...
    modbus._server.on("data", function(data) {
        let recvBuffer = Buffer.from([]);

        modbusSerialDebug({ action: "socket data", data: data });
        recvBuffer = Buffer.concat([recvBuffer, data], recvBuffer.length + data.length);

        while (recvBuffer.length > ADDR_LEN) {
            const requestBuffer = Buffer.alloc(recvBuffer.length);
            recvBuffer.copy(requestBuffer, 0, 0, recvBuffer.length);

            // Move receive buffer on
            recvBuffer = recvBuffer.slice(recvBuffer.length);

            const crc = crc16(requestBuffer.slice(0, -2));
            requestBuffer.writeUInt16LE(crc, requestBuffer.length - 2);
        }
    });




function _parseModbusBuffer(requestBuffer, vector, serverUnitID, sockWriter, options) {
        ...
        if (crc !== crc16(requestBuffer.slice(0, -2))) {
            modbusSerialDebug("wrong CRC of request Buffer");
            return;
        }
    }
}

Explanation:

Before performing the CRC check, the result of const crc = crc16(requestBuffer.slice(0, -2)); is written into requestBuffer using requestBuffer.writeUInt16LE(crc, requestBuffer.length - 2);. This method will always result in the CRC check being correct because the CRC is calculated and immediately written into the buffer. Consequently, when checking the CRC later, it will always match since it was calculated and set in the same manner.

covered0000 avatar Aug 12 '24 06:08 covered0000