问题描述
我正在测试一个带有红色节点的小应用程序,从设备读取 modbus 数据,我观察到设备数据读取良好,但它不断向我发送错误“”类型错误:“值”参数超出范围“” ,我在每个读取函数中都有这段代码,并且在每个函数中都出现相同的错误,我正在从缓冲区读取浮动数据。
var pay = msg.payload.data;
var buf = Buffer.allocUnsafe(4);
buf.writeInt16BE(pay[1],2);
buf.writeInt16BE(pay[0],0);
msg.payload = buf.readFloatBE(0);
return msg;
解决方法
如果你只在纯 NodeJS 中运行它,你会得到完整的错误:
> buf.writeInt16BE(60009,2)
Uncaught:
RangeError [ERR_OUT_OF_RANGE]: The value of "value" is out of range. It must be >= -32768 and <= 32767. Received 60009
at checkInt (internal/buffer.js:68:11)
at writeU_Int16BE (internal/buffer.js:828:3)
at Buffer.writeInt16BE (internal/buffer.js:890:10)
at REPL39:1:5
at Script.runInThisContext (vm.js:120:18)
at REPLServer.defaultEval (repl.js:442:29)
at bound (domain.js:427:14)
at REPLServer.runBound [as eval] (domain.js:440:12)
at REPLServer.onLine (repl.js:777:10)
at REPLServer.emit (events.js:326:22) {
code: 'ERR_OUT_OF_RANGE'
}
这个错误也应该被打印到 Node-RED 日志中。
60009
太大,无法成为 16 位有符号整数,因此无法使用 writeInt16BE()
写入缓冲区。
它可以用 writeUInt16BE()
编写,或者我怀疑您直接从 msg 对象中已有的缓冲区读取浮点数会更好。
msg.payload = msg.payload.buffer.readFloatBE()