Я пытаюсь прочитать данные из 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 () возвращает?
Так почему же «прослушивание» не позволяет последовательному соединению получать что-либо, кроме как на короткое время при каждой обработке запроса? Разве я не могу использовать эти две функции, не мешая друг другу?