node-modbus-serial
node-modbus-serial copied to clipboard
Does the CRC check in the Modbus RTU code have any effect?
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.