Node.js中使用async parallel与modbus-serial无法获取值求助
解决modbus-serial结合async.parallel无法获取返回值的问题
作为Node.js和Modbus开发的过来人,我一眼就看到了你代码里的几个关键问题,帮你拆解并给出修正方案:
核心问题分析
- 连接未就绪就执行请求:
client.connectRTUBuffered是异步方法,你直接在它后面就调用async.parallel,这时候客户端还没完成连接,Modbus请求自然发不出去或者拿不到返回。 - async任务未触发回调:你定义的每个并行任务函数,只执行了
client.writeFC3,但没有调用clbk回调来传递错误或结果——async.parallel就是靠这个回调来收集返回值的,你不调用它自然拿不到数据。 - 代码拼写不完整:你代码里的
fu...应该是function的拼写错误,得补全才能正常运行。
修正后的完整代码
const ModbusRTU = require("modbus-serial"); const async = require("async"); // 初始化Modbus客户端 const client = new ModbusRTU(); // 先确保连接成功,再启动定时任务 client.connectRTUBuffered("COM3", { baudRate: 9600 }) .then(() => { console.log("Modbus RTU连接成功 ✅"); // 每秒执行一次并行Modbus请求(可根据需求调整间隔) setInterval(() => { async.parallel({ // 第一个Modbus请求任务 async_modbus_1_1: (clbk) => { client.writeFC3(1, 4103, 2, (err, data) => { if (err) { return clbk(err, null); // 传递错误给async } console.log("任务1返回数据:", data); clbk(null, data); // 传递数据给async }); }, // 第二个Modbus请求任务 async_modbus_1_2: (clbk) => { client.writeFC3(1, 4105, 2, (err, data) => { if (err) { return clbk(err, null); } console.log("任务2返回数据:", data); clbk(null, data); }); } }, (err, results) => { // 所有并行任务完成后的统一处理 if (err) { console.error("并行任务执行出错:", err); return; } console.log("所有任务最终结果:", results); }); }, 1000); }) .catch((err) => { console.error("Modbus RTU连接失败 ❌:", err); });
关键修改说明
- 等待连接就绪:用
.then()等待connectRTUBuffered连接成功后再启动定时任务,彻底避免未连接状态下的无效请求。 - 正确触发async回调:每个并行任务里,在
writeFC3的回调中必须调用clbk,把错误或数据传递给async.parallel,这样才能在最终回调里拿到所有任务的返回值。 - 完善错误处理:添加了连接失败的捕获,以及每个Modbus请求的错误处理,方便你排查连接或请求层面的问题。
- 补全代码拼写:把不完整的
fu...替换成了标准的箭头函数(也可以用function,箭头函数更简洁)。
内容的提问来源于stack exchange,提问作者Vindy Pratama
相关产品推荐
相关产品推荐

