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.
相关产品推荐
相关产品推荐

