nodejs: прослушивание http мешает чтению serialport - PullRequest
0 голосов
/ 03 января 2019

Я пытаюсь прочитать данные из arduino, используя serialport, и передать их в веб-браузер.

Без веб-сервера (т. Е. Если я просто пропущу этот вызов 'listen' в конце), последовательные данные будут постоянно передаваться с ожидаемыми 5 обновлениями в секунду, показанными в консоли.

Но когда я добавляю вызов 'listen', на консоли ничего не отображается, пока я не сделаю запрос к серверу с моим веб-браузером, и в это время консоль получает максимум одну добавленную запись журнала (но иногда все равно ничего ).

Данные, отображаемые в веб-браузере, представляют собой «старые» данные, полученные при каждом последнем запросе, а не текущие последние данные из arduino. Другими словами, последовательные данные обрабатываются немного после каждый HTTP-запрос обслуживается - не очень полезно.

const http = require('http');
const serialport = require('serialport');

var serial = new serialport('/dev/ttyUSB0', {
    baudRate: 115200
});

var jsonStr = '';
var jsonObj = {};

function handleData(data) {
    jsonStr += data;
    if ( data.indexOf('}') > -1 ) {
        try {
            jsonObj = JSON.parse(jsonStr);
            console.log(jsonObj);
        }
        catch(e) {}
        jsonStr = '';
    }
};

serial.on('data', function (data) {
    handleData(data);
});

const app = http.createServer((request, response) => {
    response.writeHead(200, {"Content-Type": "text/html"});
    response.write(JSON.stringify(jsonObj));
    response.end();
});

app.listen(3000);

(Данные, поступающие из arduino, уже являются строкой JSON, поэтому я ищу '}', чтобы начать ее анализ.)

Я также пытался использовать событие «readable» для получения последовательных данных, но это не имеет значения:

serial.on('readable', function () {
    handleData(serial.read());
});

Если я правильно понимаю, сам вызов прослушивания не блокируется, он просто регистрирует прослушиватель / обратный вызов события, который будет запущен позже. В качестве принятого ответа в связанном вопросе говорится: «Думайте о server.listen (port) как о подобном someElement.addEventListener (« click », обработчик) в браузере».

Если node.js однопоточный, то почему server.listen () возвращает?

Так почему же «прослушивание» не позволяет последовательному соединению получать что-либо, кроме как на короткое время при каждой обработке запроса? Разве я не могу использовать эти две функции, не мешая друг другу?

1 Ответ

0 голосов
/ 13 января 2019

Я обнаружил, что код работает, как и ожидалось, на другом компьютере, хотя на другом компьютере была установлена ​​точно такая же операционная система (Fedora 20) и точно такая же версия node.js (v10.15.0), которая была установлена точно так же (построен из источника).

Я также обнаружил, что он работал нормально на исходном компьютере с более свежей версией Fedora (29).

Это, вероятно, указывает на некоторую небольшую разницу в драйверах USB / последовательных устройств, в которую у меня нет времени, знаний или необходимости вникать. Я просто буду использовать конфигурации, которые, как я знаю, будут работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...