使用 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 访问虚拟串行端口会给出错误或没有打开事件的主要内容,如果未能解决你的问题,请参考以下文章