使用 node.js 访问虚拟串行端口会给出错误或没有打开事件

Posted

技术标签:

【中文标题】使用 node.js 访问虚拟串行端口会给出错误或没有打开事件【英文标题】:Accessing virtual serial port with node.js gives either error or no open event 【发布时间】:2016-04-01 13:20:40 【问题描述】:

我正在尝试访问在 Windows 8 上使用 http://www.hhdsoftware.com/virtual-serial-ports 创建的虚拟串行端口。

当我使用终端仿真器(Realterm)访问端口时,它似乎可以工作;好吧,我看到我在输出文件中输入的字符,我在模拟器窗口中的输入文件中看不到任何东西,但老实说,模拟器的 UI 是压倒性的,我不完全理解我在做什么。

但我实际上想使用 node.js 的 serialport 模块访问端口。这是我的 JS 代码:

var serialport = require("serialport");
var SerialPort = serialport.SerialPort;


var serialPort = new SerialPort("COM2", 
    // these are the default values in Realterm that seem to work there
    baudRate: 57600,
    dataBits: 8,
    stopBits: 1,
    parity: 'none',
    parser: serialport.parsers.readline("\r\n")
, true, function(error)
  if ( error ) 
    console.log('failed to open: '+error);
   else 
    console.log('open');
    serialPort.on('data', function(data) 
      console.log('data received: ' + data);
    );
    serialPort.write("ls\r\n", function(err, results) 
      console.log('err ' + err);
      console.log('results ' + results);
    );
   
);

我的问题是,当我运行上面的代码时,我只得到一个错误:

打开失败:错误:SetCommState: Unknown error code 87

真正奇怪的是,我只在运行代码之前 使用Realterm 访问端口时收到此错误。关闭 Realterm 后,我没有收到此错误,而是根本没有输出,即代码没有收到“打开”事件。

任何想法我做错了什么?

【问题讨论】:

也许尝试使用0 而不是1 来代替stopBits? ***.com/a/4189646/2646526 可能有 2 个问题。错误可能是端口已经在 RealTerm 中打开。它不能同时被两个东西打开。 【参考方案1】:

您正在使用的库serialport 正在调用SetCommState:

if (!SetCommState(file, &dcb)) 
    ErrorCodeToString("SetCommState", GetLastError(), data->errorString);
    return;

配置虚拟串行端口的通信。然后它检查函数GetLastError返回的错误:

void ErrorCodeToString(const char* prefix, int errorCode, char *errorStr) 
  switch(errorCode) 

case ERROR_FILE_NOT_FOUND:
    _snprintf(errorStr, ERROR_STRING_SIZE, "%s: File not found", prefix);
    break;
  case ERROR_INVALID_HANDLE:
    _snprintf(errorStr, ERROR_STRING_SIZE, "%s: Invalid handle", prefix);
    break;
  case ERROR_ACCESS_DENIED:
    _snprintf(errorStr, ERROR_STRING_SIZE, "%s: Access denied", prefix);
    break;
  case ERROR_OPERATION_ABORTED:
    _snprintf(errorStr, ERROR_STRING_SIZE, "%s: operation aborted", prefix);
    break;
  default:
    _snprintf(errorStr, ERROR_STRING_SIZE, "%s: Unknown error code %d", prefix, errorCode);
    break;
  

未知错误 87 没有被检查,但这意味着在打开端口时已经传递了INVALID PARAMETER。问题是 GetLastError 函数不会提供更多信息来阐明导致错误的参数。

由于您无法在 Realterm 上做任何事情,我认为它也不起作用。

看了serialport的主页,发现它提供了两个玩串口的工具:serialportlist和serialportterm,试试最后一个,看看能不能从那里打开端口。

串口最常见的错误是波特率设置错误。我想您已经尝试了几种速度,但如果您不尝试,请尝试使用有效的速度:

115200、57600、38400、19200、9600、4800、2400、1800、1200、600、300、200、150、134、110、75或50

【讨论】:

以上是关于使用 node.js 访问虚拟串行端口会给出错误或没有打开事件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Azure VM串行控制台

npm错误安装串口

VMware Workstation15为虚拟机添加串行口

Linux 的虚拟串行端口

使用NGINX在端口80上为使用虚拟主机的Amazon EC2上托管的域的node.js应用程序提供HTTP流量

使用 CSerial (C++) 打开虚拟 COM 端口