node-zserial 1.0.20 → 1.0.22
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/zserial.js +99 -33
package/package.json
CHANGED
package/zserial.js
CHANGED
|
@@ -24,7 +24,27 @@ module.exports = function (RED) {
|
|
|
24
24
|
node.send(msg);
|
|
25
25
|
done();
|
|
26
26
|
}, node);
|
|
27
|
-
}
|
|
27
|
+
}
|
|
28
|
+
else if (msg.serialConfigs) {
|
|
29
|
+
let allLen = msg.serialConfigs.length;
|
|
30
|
+
let total = msg.serialConfigs.length;
|
|
31
|
+
try {
|
|
32
|
+
for (var i = 0; i < allLen; i++) {
|
|
33
|
+
let serialConfig = msg.serialConfigs[i];
|
|
34
|
+
serialPool.close(serialConfig.serialport, function (err) {
|
|
35
|
+
total--;
|
|
36
|
+
if (total <= 0) {
|
|
37
|
+
node.send(msg);
|
|
38
|
+
done();
|
|
39
|
+
}
|
|
40
|
+
}, node);
|
|
41
|
+
}
|
|
42
|
+
} catch (error) {
|
|
43
|
+
node.error(error, msg);
|
|
44
|
+
done();
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
28
48
|
serialPool.closeAll(() => {
|
|
29
49
|
node.send(msg);
|
|
30
50
|
done();
|
|
@@ -413,37 +433,71 @@ module.exports = function (RED) {
|
|
|
413
433
|
if (msg.hasOwnProperty("flush") && msg.flush === true) { curPort.serial.flush(); }
|
|
414
434
|
|
|
415
435
|
setCallback(msg, serialConfig, done);
|
|
416
|
-
// msg.payload = serialConfig.payload;
|
|
417
|
-
setTimeout(function () {
|
|
436
|
+
// // msg.payload = serialConfig.payload;
|
|
437
|
+
// setTimeout(function () {
|
|
438
|
+
// try {
|
|
439
|
+
// // node.warn(`当前:${curPort.serial.path}打开状态,${curPort.isopen}`);
|
|
440
|
+
// if (curPort.isopen) {
|
|
441
|
+
// curPort.enqueue(serialConfig, node, function (err, res) {
|
|
442
|
+
// // node.warn("加入队列::" + curPort.serial.path);
|
|
443
|
+
// // node.warn(curPort.queue);
|
|
444
|
+
// // node.warn(res);
|
|
445
|
+
// if (err) {
|
|
446
|
+
// node.error(err)
|
|
447
|
+
// }
|
|
448
|
+
// }, function (queue) {
|
|
449
|
+
// // node.warn("队列开始发送::");
|
|
450
|
+
// // node.warn(queue);
|
|
451
|
+
// });
|
|
452
|
+
// } else {
|
|
453
|
+
// curPort._retryNum = 0
|
|
454
|
+
// zsend(null, {
|
|
455
|
+
// ...serialConfig,
|
|
456
|
+
// status: "ERR_IN_QUEUE",
|
|
457
|
+
// text: '串口未打开,加入消息队列失败',
|
|
458
|
+
// port: curPort.serial.path
|
|
459
|
+
// }, null, curPort.serial.path, done);
|
|
460
|
+
// }
|
|
461
|
+
// } catch (error) {
|
|
462
|
+
// node.error(error);
|
|
463
|
+
// }
|
|
464
|
+
|
|
465
|
+
// }, 100);
|
|
466
|
+
// 等待端口就绪后再入队,避免固定 100ms 竞态导致失败
|
|
467
|
+
var openTimeout = msg.openTimeout || 5000; // 可通过 msg.openTimeout 覆盖,默认 5s
|
|
468
|
+
var enqueued = false;
|
|
469
|
+
|
|
470
|
+
function doEnqueue() {
|
|
471
|
+
if (enqueued) return;
|
|
472
|
+
enqueued = true;
|
|
418
473
|
try {
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
// node.warn(res);
|
|
425
|
-
if (err) {
|
|
426
|
-
node.error(err)
|
|
427
|
-
}
|
|
428
|
-
}, function (queue) {
|
|
429
|
-
// node.warn("队列开始发送::");
|
|
430
|
-
// node.warn(queue);
|
|
431
|
-
});
|
|
432
|
-
} else {
|
|
433
|
-
curPort._retryNum = 0
|
|
434
|
-
zsend(null, {
|
|
435
|
-
...serialConfig,
|
|
436
|
-
status: "ERR_IN_QUEUE",
|
|
437
|
-
text: '串口未打开,加入消息队列失败',
|
|
438
|
-
port: curPort.serial.path
|
|
439
|
-
}, null, curPort.serial.path, done);
|
|
440
|
-
}
|
|
474
|
+
curPort.enqueue(serialConfig, node, function (err, res) {
|
|
475
|
+
if (err) { node.error(err); }
|
|
476
|
+
}, function (queue) {
|
|
477
|
+
// 队列开始发送(可选日志)
|
|
478
|
+
});
|
|
441
479
|
} catch (error) {
|
|
442
480
|
node.error(error);
|
|
443
481
|
}
|
|
482
|
+
}
|
|
444
483
|
|
|
445
|
-
|
|
446
|
-
|
|
484
|
+
if (curPort.isopen) {
|
|
485
|
+
doEnqueue();
|
|
486
|
+
} else {
|
|
487
|
+
curPort.once('ready', function () {
|
|
488
|
+
doEnqueue();
|
|
489
|
+
});
|
|
490
|
+
setTimeout(function () {
|
|
491
|
+
if (!enqueued) {
|
|
492
|
+
zsend(null, {
|
|
493
|
+
...serialConfig,
|
|
494
|
+
status: "ERR_IN_QUEUE",
|
|
495
|
+
text: '串口未在超时时间内就绪,加入消息队列失败',
|
|
496
|
+
port: (curPort.serial && curPort.serial.path) || serialConfig.serialport
|
|
497
|
+
}, null, (curPort.serial && curPort.serial.path) || serialConfig.serialport, done);
|
|
498
|
+
}
|
|
499
|
+
}, openTimeout);
|
|
500
|
+
}
|
|
447
501
|
|
|
448
502
|
}
|
|
449
503
|
|
|
@@ -541,7 +595,7 @@ module.exports = function (RED) {
|
|
|
541
595
|
binoutput = serialConfig.bin || 'false',
|
|
542
596
|
addchar = serialConfig.addchar || '',
|
|
543
597
|
responsetimeout = serialConfig.responsetimeout || 10000,
|
|
544
|
-
retryNum = serialConfig.retryNum ||
|
|
598
|
+
retryNum = serialConfig.retryNum || 5;
|
|
545
599
|
var id = port;
|
|
546
600
|
// just return the connection object if already have one
|
|
547
601
|
// key is the port (file path)
|
|
@@ -693,14 +747,14 @@ module.exports = function (RED) {
|
|
|
693
747
|
},
|
|
694
748
|
}
|
|
695
749
|
//newline = newline.replace("\\n","\n").replace("\\r","\r");
|
|
696
|
-
obj._emitter.setMaxListeners(
|
|
750
|
+
obj._emitter.setMaxListeners(500);
|
|
697
751
|
var olderr = "";
|
|
698
752
|
var setupSerial = function () {
|
|
699
753
|
obj._retryNum++;
|
|
700
754
|
// RED.log.info(obj._retryNum)
|
|
701
755
|
if (obj._retryNum > retryNum) {
|
|
702
756
|
// serialPool.zlog("已经重试" + retryNum + "次,请检查串口是否正常!", {});
|
|
703
|
-
obj._emitter.emit('retryerror', id, retryNum);
|
|
757
|
+
// obj._emitter.emit('retryerror', id, retryNum);
|
|
704
758
|
return null;
|
|
705
759
|
}
|
|
706
760
|
obj.serial = new SerialPort({
|
|
@@ -718,9 +772,13 @@ module.exports = function (RED) {
|
|
|
718
772
|
olderr = err.toString();
|
|
719
773
|
// RED.log.error("Err1:[serialconfig:" + id + "] " + RED._("serial.errors.error", { port: port, error: olderr }), {});
|
|
720
774
|
}
|
|
775
|
+
var delay = serialReconnectTime + Math.floor(Math.random() * 1000);
|
|
721
776
|
obj.tout = setTimeout(function () {
|
|
722
777
|
setupSerial();
|
|
723
|
-
},
|
|
778
|
+
}, delay);
|
|
779
|
+
// obj.tout = setTimeout(function () {
|
|
780
|
+
// setupSerial();
|
|
781
|
+
// }, serialReconnectTime);
|
|
724
782
|
} else {
|
|
725
783
|
obj.isopen = true;
|
|
726
784
|
}
|
|
@@ -731,9 +789,13 @@ module.exports = function (RED) {
|
|
|
731
789
|
serialPool.zlog("Err2:[serialconfig:" + id + "] " + RED._("serial.errors.error", { port: port, error: err.toString() }), {});
|
|
732
790
|
obj._emitter.emit('closed', id);
|
|
733
791
|
if (obj.tout) { clearTimeout(obj.tout); }
|
|
792
|
+
// obj.tout = setTimeout(function () {
|
|
793
|
+
// setupSerial();
|
|
794
|
+
// }, serialReconnectTime);
|
|
795
|
+
var delay = serialReconnectTime + Math.floor(Math.random() * 1000);
|
|
734
796
|
obj.tout = setTimeout(function () {
|
|
735
797
|
setupSerial();
|
|
736
|
-
},
|
|
798
|
+
}, delay);
|
|
737
799
|
});
|
|
738
800
|
obj.serial.on('close', function () {
|
|
739
801
|
obj.isopen = false;
|
|
@@ -744,9 +806,13 @@ module.exports = function (RED) {
|
|
|
744
806
|
}
|
|
745
807
|
obj._emitter.emit('closed', id);
|
|
746
808
|
if (obj.tout) { clearTimeout(obj.tout); }
|
|
809
|
+
// obj.tout = setTimeout(function () {
|
|
810
|
+
// setupSerial();
|
|
811
|
+
// }, serialReconnectTime);
|
|
812
|
+
var delay = serialReconnectTime + Math.floor(Math.random() * 1000);
|
|
747
813
|
obj.tout = setTimeout(function () {
|
|
748
814
|
setupSerial();
|
|
749
|
-
},
|
|
815
|
+
}, delay);
|
|
750
816
|
}
|
|
751
817
|
else {
|
|
752
818
|
obj._emitter.emit('stopped', id);
|