0

我正在使用从http://nodejs.org下载的 nodejs "v0.10.28" 和 npm "1.4.9" 。

我已经通过 npm 安装了串口

npm install 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,是巧合吗?

4

1 回答 1

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(write, 50); 不见了,现在只使用 setTimeout(write, 10);

代码现在可以工作了,但这仍然不能回答为什么在前面的代码中打开和关闭端口时它会崩溃的问题。

于 2015-06-27T08:54:12.360 回答