Nodejs Serialport не открывается после записи 1012

Я использую nodejs "v0.10.28" и npm "1.4.9", загруженные с http://nodejs.org. .

Я установил серийный порт через 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, это совпадение?


person 0x00FE    schedule 26.06.2015    source источник
comment
Что находится на другом конце последовательного порта? Столь же вероятно, что принимающее устройство имеет проблемы с объемом отправляемых данных и закрывается/отказывается после отправки 1012 сообщений.   -  person knolleary    schedule 27.06.2015
comment
@knolleary, другой конец - микроконтроллер BASIC Stamp, единственный контакт, подключенный к Raspberry-pi, - это TX, управления потоком нет. И нет, на другом конце проблем нет.   -  person 0x00FE    schedule 27.06.2015
comment
что говорит сообщение err, когда вы пытаетесь открыть в sp.open(function(err) после итерации 1012?   -  person hassansin    schedule 27.06.2015
comment
@hassansin [Ошибка: последовательный порт не открыт.], Весь вывод ошибки находится в сообщении.   -  person 0x00FE    schedule 27.06.2015


Ответы (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);

Код теперь работает, но это по-прежнему не отвечает на вопрос, почему он вылетал при открытии и закрытии порта в предыдущем коде.

person 0x00FE    schedule 27.06.2015