使用 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
我正在尝试访问 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