我使用nodejs" v0.10.28"和npm" 1.4.9",从http://nodejs.org下载。
我已经通过npm安装了serialport
npm install serialport
我的程序在Raspberry-pi上运行,需要通过serialport快速发送更新的值,所以我已经创建了这个测试程序。
var serialPort = require("serialport");
var SerialPort = require("serialport").SerialPort;
var sp = new SerialPort("/dev/ttyAMA0", {
baudrate: 9600
}, false);
console.log("Starting up serial host...");
var message = "Num: ";
var counter = 1000000;
function write()
{
message= counter.toString();
counter+=1;
sp.open(function(err)
{
console.log("Writing serial data: " + message);
sp.write(message, function(err, res)
{
if (err)
{
console.log(err);
}
sp.close();
});
});
}
setTimeout(write, 10); //wait 10 ms for everything to initialize correctly
setInterval(write, 50); //write data every 50 ms
该程序可以正好运行1012次写入,然后崩溃。
计划输出结束:
...
Writing serial data: 1001011
Writing serial data: 1001012
Writing serial data: 1001013
[Error: Serialport not open.]
events.js:72
throw er; // Unhandled 'error' event
^
Error: Serialport not open.
at SerialPortFactory.SerialPort.close (/home/pi/node_modules/serialport/serialport.js:476:17)
at /home/pi/serialTest.js:25:7
at SerialPortFactory.SerialPort.write (/home/pi/node_modules/serialport/serialport.js:290:9)
at /home/pi/serialTest.js:19:13
at /home/pi/node_modules/serialport/serialport.js:224:11
为什么会崩溃? 某处内存中是否有缓冲区溢出? 为什么1012写的呢?非常接近1024,这是巧合吗?
答案 0 :(得分:1)
一位朋友刚刚私下回答了这个问题,所以我会在这里分享调查结果。
代码:
var SerialPort = require("serialport").SerialPort;
var sp = new SerialPort("/dev/ttyAMA0", {
baudrate: 9600
}, false);
console.log("Starting up serial host...");
var message = "Num: ";
var counter = 1000000;
sp.open(function(err) {
if (err) {
console.log("Port open error: ", err);
}
else {
console.log("Port opened!");
}
});
function write()
{
if (sp.isOpen()) {
message= counter.toString();
counter+=1;
console.log("Writing serial data: " + message);
sp.write(message, function(err, res)
{
if (err)
{
console.log(err);
}
setTimeout(write, 50);
});
}
else {
setTimeout(write, 50);
}
}
setTimeout(write, 10); //wait 10 ms for everything to initialize correctly
如果你仔细观察,你会注意到现在sp.open()被使用一次,在写入函数的开头,sp.isOpen()用于检查端口是否打开。 还有setInterval(写,50);已经消失了,现在只使用setTimeout(写,10);
代码现在有效,但是仍然没有回答在上一段代码中打开和关闭端口时崩溃的原因。