在1012次写入后,Nodejs Serialport未打开

时间:2015-06-26 21:46:09

标签: node.js node-serialport

我使用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,这是巧合吗?

1 个答案:

答案 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);

代码现在有效,但是仍然没有回答在上一段代码中打开和关闭端口时崩溃的原因。