node.js和serialport不能列出任何端口

我正在尝试使用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端口,那么在使用它时会出现“未打开”错误。 我假设这是因为节点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端口到节点的串行端口?

我有一个类似的问题。 我无法列出覆盆子pi上的端口。 相同的代码在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); }); } }); 

看看你打开时是否有任何错误。

编辑:暂时我去这样的事情列出的端口,这是有点哈克,但反正…

 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 。 任何想法我能做些什么呢?

使用更新版本的节点串行端口,写入将排队,直到端口打开,然而对于版本2和3,您需要等待端口在写入之前打开。 旧版本的serialport文档讨论了在写入之前等待打开的事件。

对于版本3 https://github.com/EmergingTechnologyAdvisors/node-serialport/blob/3.1.2/README.md#opening-a-port

我知道这个问题已经有点老了,但是我想给任何人解答这个问题。 我强烈build议你至less使用serialport版本3,因为它修复了v2的一些小错误,但是4和5更快,使用更less的内存和支持背压,并有更多的错误修复。