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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/zserial.js +99 -33
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-zserial",
3
- "version": "1.0.20",
3
+ "version": "1.0.22",
4
4
  "description": "Node-RED nodes to talk to serial ports",
5
5
  "dependencies": {
6
6
  "serialport": "^12.0.0"
package/zserial.js CHANGED
@@ -24,7 +24,27 @@ module.exports = function (RED) {
24
24
  node.send(msg);
25
25
  done();
26
26
  }, node);
27
- } else {
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
- // node.warn(`当前:${curPort.serial.path}打开状态,${curPort.isopen}`);
420
- if (curPort.isopen) {
421
- curPort.enqueue(serialConfig, node, function (err, res) {
422
- // node.warn("加入队列::" + curPort.serial.path);
423
- // node.warn(curPort.queue);
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
- }, 100);
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 || 1;
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(50);
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
- }, serialReconnectTime);
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
- }, serialReconnectTime);
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
- }, serialReconnectTime);
815
+ }, delay);
750
816
  }
751
817
  else {
752
818
  obj._emitter.emit('stopped', id);