You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node-RED中Modbus返回字符串转数字失败的问题求助

解决Modbus缓冲区转数字时的不可见字符问题

问题背景

Modbus Flex Getter节点返回缓冲区[118,48,49,49,48,56,61,57,52,54,46,54,52,0,0,0,0,0],通过以下函数节点代码转换为字符串:

var bufstr = msg.payload.buffer.toString();
var bufarr = bufstr.split("=");
msg.payload = bufarr[1];

return msg;

调试窗口显示msg.payload为"946.64",但实际字符串末尾带有调试窗口未显示的空字符(\u0000),导致使用Change节点的JSONata表达式$number(payload)转换时报错:

Ungültiger JSONata Ausdruck: Unable to cast value to a number: "946.64\u0000\u0000\u0000\u0000\u0000"
同时使用Number(msg.payload)也返回NaN,此前尝试的正则表达式/(^0-9.-)/无效。

解决方案

方法1:直接截取有效长度

已知有效数字字符串长度为5,在函数节点中直接截取前5位:

var bufstr = msg.payload.buffer.toString();
var bufarr = bufstr.split("=");
msg.payload = bufarr[1].slice(0, 5);
return msg;

之后即可正常用$number(payload)或Number()转换为数字。

方法2:正则提取有效数字部分

使用正则匹配所有数字和小数点组成的子串,精准提取有效内容:

var bufstr = msg.payload.buffer.toString();
var bufarr = bufstr.split("=");
var validNumStr = bufarr[1].match(/[\d.]+/)[0];
msg.payload = Number(validNumStr);
return msg;

此方法无需提前知道有效长度,自动提取连续的数字和小数点。

方法3:移除所有空字符

直接替换字符串中所有的空字符(\u0000):

var bufstr = msg.payload.buffer.toString();
var bufarr = bufstr.split("=");
msg.payload = bufarr[1].replace(/\u0000/g, "");
return msg;

清理后再进行数字转换即可成功。

内容的提问来源于stack exchange,提问作者Stefan B.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 22:36:15