多个设备挂起的窗口上的node-serialport

时间:2015-06-22 15:15:30

标签: javascript node.js windows serial-port

我一直在尝试使用node-serialport库来访问连接到USB集线器的设备,并向这些设备发送/接收数据。代码在Linux上工作正常但在Windows(Windows 8.1和Windows 7)上我得到一些奇怪的行为。它似乎不适用于2个以上的设备,它只是在写入端口时挂起。 write方法的回调永远不会被调用。我不确定如何调试此问题。我不是一个窗户的人,如果有人可以给我一些指示,那就太好了。

以下是我目前用于测试的代码。

/*
  Sample code to debug node-serialport library on windows

*/ 

//var SerialPort = require("./build/Debug/serialport");
var s = require("./serialport-logger");
var parsers = require('./parsers');
var ee = require('events');


s.list(function(err, ports) {
  console.log("Number of ports available: " + ports.length);
  ports.forEach(function(port) {
    var cName = port.comName,
        sp;
    //console.log(cName);

    sp = new s.SerialPort(cName, {
      parser: s.parsers.readline("\r\n")
    }, false);

    // sp.once('data', function(data) {
    //   if (data) {
    //     console.log("Retrieved data " + data);
    //     //console.log(data);  
    //   }

    // });

    //console.log("Is port open " + sp.isOpen());

    if(!sp.isOpen()) {
      sp.open(function(err) {
        if(err) {
          console.log("Port cannot be opened manually");

        } else {
          console.log("Port is open " + cName);

          sp.write("LED=2\r\n", function(err) {
            if (err) {
              console.log("Cannot write to port");
              console.error(err);

            } else {
              console.log("Written to port " + cName);


            }

          });


        }

      });

    } 

    //sp.close();   
  });  
});

我确定您已经注意到我并不需要使用serialport库而是我使用serialport-logger库它只是一种使用方式在windows box上使用调试开关编译的serialport插件。

2 个答案:

答案 0 :(得分:0)

TLDR;对我来说,它通过增加libuv的线程池大小来工作。 $ UV_THREADPOOL_SIZE=20 && node server.js

我很好地为每个命令打开/关闭端口一段时间,但我正在处理的功能请求现在需要保持端口打开并重用连接来运行命令。所以我必须找到这个问题的答案。

通过打开连接并坚持它可以支持的设备数量为3.问题恰好是默认的线程池大小4.我已经有另一个后台工作者占用1个线程所以我只剩下3个线程。 node-serialport中的EIO_WatchPort函数作为后台工作程序运行,从而导致阻塞线程。因此,当我使用3个以上的设备时,"打开"方法调用正在队列中等待推送到后台工作程序,但由于它们都忙于阻塞节点。然后,节点无法处理任何后续请求。最后增加线程池大小就行了,它现在工作正常。它可能对某人有帮助。另外this线程肯定帮助了我。

答案 1 :(得分:0)

正如opensourcegeek指出的那样,你需要做的就是将UV_THREADPOOL_SIZE变量设置为默认的4个线程。

当我尝试在USB端口上查询更多tan 3 RS-485设备时,我在使用node.js和modbus-rtu或modbus-serial库的项目中遇到了问题。 3个设备,没问题,4个或更多,永久超时。这些设备每个都以600毫秒的间隔响应,但是当池忙时,它们永远不会得到响应。

所以在Windows上只需输入你的node.js环境命令行: 设置UV_THREADPOOL_SIZE = 8 或者你喜欢什么,直到128.我查询了6个USB端口,所以我用了8个。