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

Accessing virtual serial port with node.js gives either error or no open event

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

当我使用终端仿真器 (Realterm) 访问该端口时,它似乎可以工作;好吧,我在输出文件中看到了我输入的字符,我在模拟器 window 中的输入文件中没有看到任何内容,但老实说,模拟器的 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);
    });
  } 
});

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

failed to open: Error: SetCommState: Unknown error code 87

真正奇怪的是,当我 运行 代码 使用 Realterm 访问端口时,我只得到这个错误。关闭 Realterm 后,我没有收到此错误,而是根本没有输出,即代码没有收到 "open" 事件。

知道我做错了什么吗?

图书馆serialport you're using is calling SetCommState:

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

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

的错误
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