0

http://nodejs.orgからダウンロードした nodejs "v0.10.28" と npm "1.4.9" を使用しています。

npmでシリアルポートをインストールしました

npm install serialport

私のプログラムは Raspberry-pi で実行されており、シリアルポートを介して更新された値をすばやく送信し続ける必要があるため、このテスト プログラムを作成しました。

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() が 1 回使用され、書き込み関数の最初に sp.isOpen() がポートが開いているかどうかを確認するために使用されていることがわかります。また、setInterval(write, 50); なくなり、setTimeout(write, 10); のみを使用するようになりました。

コードは機能するようになりましたが、以前のコードでポートを開閉するときになぜクラッシュしていたのかという疑問にはまだ答えていません。

于 2015-06-27T08:54:12.360 に答える