我正在尝试使用node.js在ubuntu上打开一个串口。
我似乎无法打开任何端口,也无法列出任何端口。
这是我的列表代码:
var serialport = require("serialport"),
serialport.list(function (err, ports) {
console.log("thisis the list callback");
ports.forEach(function(port) {
console.log(port.comName);
console.log(port.pnpId);
console.log(port.manufacturer);
});
});
我没有输出也没有错误。它只返回零端口。我有两个被操作系统认可的COM端口:
rd@mediaplayer:~/cotto$ dmesg | grep tty
[ 0.000000] console [tty0] enabled
[ 0.732717] serial8250: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[ 0.804533] serial8250: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
[ 1.097341] 00:0a: ttyS0 at I/O 0x3f8 (irq = 4) is a 16550A
[ 1.168637] 00:0b: ttyS1 at I/O 0x2f8 (irq = 3) is a 16550A
如果我尝试显式打开一个com端口,使用它时会出现“not open”错误。我认为这是因为节点serialport没有“看到”我的任何com端口:
rd@mediaplayer:~/cotto$ sudo node sptest.js
opening serial port: /dev/ttyS0
events.js:72
throw er; // Unhandled 'error' event
^
Error: Serialport not open.
at SerialPortFactory.SerialPort.write (/home/rd/node_modules/serialport/serialport.js:246:17)
at Object.<anonymous> (/home/rd/cotto/sptest.js:33:8)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
at startup (node.js:119:16)
at node.js:902:3
打开串口的代码可供参考:
var serialport = require("serialport"),
SerialPort = serialport.SerialPort;
var portName = "/dev/ttyS0";
console.log("opening serial port: " + portName);
var myPort = new SerialPort(portName, { baudrate: 9600,
});
myPort.write("Hello World\r\n");
我需要做些什么特别的事情才能将linux com端口暴露给node serialport?
答案 0 :(得分:0)
我有类似的问题。我无法在树莓派上列出端口。相同的代码在Windows上运行得很好。 另一方面,我可以打开端口并读取和写入它没有任何问题。
你可以尝试:var SerialPort = require("serialport").SerialPort
var serialPort = new SerialPort("/dev/ttyS0", {
baudrate: 57600
}, false); // this is the openImmediately flag [default is true]
serialPort.open(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\n", function(err, results) {
console.log('err ' + err);
console.log('results ' + results);
});
}
});
查看打开时是否出现任何错误。
编辑: 暂时我会用这样的东西来列出端口,这有点hacky但反正...
var exec = require('child_process').exec;
exec('dmesg | grep tty', function (error, stdout, stderr) {
stdout.split("\n").forEach(function(line){
var words=line.split(" ");
if(words.length>=6 && words[6].substring(0,3)=="tty"){
console.log(words[6])
}
});
});
编辑2:
我的设备是/dev/ttyAMA0
在/lib/udev/rules.d/60-persistent-serial.rules
我看到这一行:
KERNEL!="ttyUSB[0-9]*|ttyACM[0-9]*", GOTO="persistent_serial_end"
我怀疑它是未列在/dev/serial/by-id
下的原因。有什么想法我可以做些什么吗?
答案 1 :(得分:0)
使用较新版本的节点serialport,写入将排队,直到端口打开,但是对于版本2和3,您需要等待端口打开才能写入端口。旧版本的serialport文档讨论了在编写之前等待open事件。
对于版本3 https://github.com/EmergingTechnologyAdvisors/node-serialport/blob/3.1.2/README.md#opening-a-port
我知道这个问题有点旧,但我想给其他人解决这个问题留下答案。我强烈建议您至少使用serialport版本3,因为它修复了v2的主要错误,并且有小的api更改,但是4和5更快,使用更少的内存并支持背压并且有更多错误修复。