NEWS
Не работает поток в node-red
-
Создал поток в node-red, согласно документации https://github.com/mrkrasser/MercurySta … adme.ru.md
сам поток в файле https://github.com/mrkrasser/MercurySta ... Stats.json
Есть статус "connected" в свойствах порта (зелёный кружочек).
Ошибок в логах нет, но так как поток разорван - работает только первая часть (включил лог в функции "BinaryRequest" - лог пишется).
Вставил логирование в функции "Parser" в первой строке кода - оно не срабатывает.
Из чего делаю вывод что вторая часть потока вообще не запускается.
В чём может быть проблема?
Задача простая - передать строку в com-порт , а затем считать ответ с таймаутом 500 мсек.
При попытке работать в javascript с портом напрямую:
var SerialPort = require('serialport'); var port = new SerialPort('/dev/ttyUSB1', { parser: SerialPort.parsers.byteLength(4) }); var sendcmd = new Buffer("000774BE63", "hex"); port.on('open', function() { port.write(sendcmd, function(err) { if (err) { return console.log('Error on write: ', err.message); } log('message written'); }); }); port.on('data', function (data) { log('Data: ' + data); });периодически выходит ошибка:
Error: 2016-09-16 13:43:58.055 error Error Resource temporarily unavailable Cannot lock port
uncaught 2016-09-16 13:43:58.054 error exception: Error Resource temporarily unavailable Cannot lock port
Ответа (данных от порта) нет, возможно из-за отсутствия таймаута на считывание с порта, не знаю как правильно поставить.
Скрипт на php с этим портом работает стабильно.
-
Не работает функция port.close() - порт остаётся открытым :
lsof | grep /dev/ttyUSB1
io.javasc 29819 root 14uW CHR 188,1 0t0 11147 /dev/ttyUSB1 nodejs 29819 29820 root 14uW CHR 188,1 0t0 11147 /dev/ttyUSB1 V8 29819 29821 root 14uW CHR 188,1 0t0 11147 /dev/ttyUSB1 V8 29819 29822 root 14uW CHR 188,1 0t0 11147 /dev/ttyUSB1 V8 29819 29823 root 14uW CHR 188,1 0t0 11147 /dev/ttyUSB1 V8 29819 29824 root 14uW CHR 188,1 0t0 11147 /dev/ttyUSB1 nodejs 29819 29825 root 14uW CHR 188,1 0t0 11147 /dev/ttyUSB1 nodejs 29819 29826 root 14uW CHR 188,1 0t0 11147 /dev/ttyUSB1 nodejs 29819 29827 root 14uW CHR 188,1 0t0 11147 /dev/ttyUSB1 nodejs 29819 29828 root 14uW CHR 188,1 0t0 11147 /dev/ttyUSB1Помогает только рестарт драйвера javascript…
Задержку считывания сделал:
setStateDelayed('s1', false, 500, false, function () { port.on('data', function (data) { log('Data after 500 ms: ' + data); }); });Но ответа нет…
-
Не работает функция port.close() - порт остаётся открытым :
lsof | grep /dev/ttyUSB1
io.javasc 29819 root 14uW CHR 188,1 0t0 11147 /dev/ttyUSB1 nodejs 29819 29820 root 14uW CHR 188,1 0t0 11147 /dev/ttyUSB1 V8 29819 29821 root 14uW CHR 188,1 0t0 11147 /dev/ttyUSB1 V8 29819 29822 root 14uW CHR 188,1 0t0 11147 /dev/ttyUSB1 V8 29819 29823 root 14uW CHR 188,1 0t0 11147 /dev/ttyUSB1 V8 29819 29824 root 14uW CHR 188,1 0t0 11147 /dev/ttyUSB1 nodejs 29819 29825 root 14uW CHR 188,1 0t0 11147 /dev/ttyUSB1 nodejs 29819 29826 root 14uW CHR 188,1 0t0 11147 /dev/ttyUSB1 nodejs 29819 29827 root 14uW CHR 188,1 0t0 11147 /dev/ttyUSB1 nodejs 29819 29828 root 14uW CHR 188,1 0t0 11147 /dev/ttyUSB1Помогает только рестарт драйвера javascript…
Задержку считывания сделал:
setStateDelayed('s1', false, 500, false, function () { port.on('data', function (data) { log('Data after 500 ms: ' + data); }); });Но ответа нет… `
А где код, который делает port.close ? -
> А где код, который делает port.close ?
В такой комбинации порт начал закрываться:port.pause(); port.close();Смог подключиться своим скриптом к GSM- розетке,имеющей вход RS232 (через другой USB порт), получаю нормальный ответ.
Осталось разобраться с Меркурием.
Возможно не верно формируется строка запроса.
на php:
hex2bin ('000774BE6354e7');
на js -?
-
На js заработало, код:
createState('s1'); schedule("*/10 * * * *", function () { var cmd1 = new Buffer ([0x00,0x07,0x74,0xBE,0x63,0x54,0xE7]); var SerialPort = require('serialport'); var port = new SerialPort('/dev/ttyUSB1', { parser: SerialPort.parsers.byteLength(14), baudrate: 9600, dataBits: 8, parity: 'none' }, function (err) { if (err) { return console.log('Error: ', err.message); } port.write(cmd1, function(err) { if (err) { return console.log('Error on write: ', err.message); } //console.log('message written'); }); }); setStateDelayed('s1', false, 10, false, function () { port.on('data', function (data) { setState('Uv', Number(data.toString('hex',5,7)/10)); setState('Ia', Number(data.toString('hex',7,9)/100)); setState('Ew', Number(data.toString('hex',9,12)/1)); }); }); setStateDelayed('s1', false, 1000, false, function () { port.pause(); port.close(); log('Port is closed'); }); }); -
А так работает?
var cmd1 = new Buffer ([0x00,0x07,0x74,0xBE,0x63,0x54,0xE7]); var SerialPort = require('serialport'); schedule("*/10 * * * *", function () { var port = new SerialPort('/dev/ttyUSB1', { parser: SerialPort.parsers.byteLength(14), baudrate: 9600, dataBits: 8, parity: 'none' }, function (err) { if (err) return console.log('Error: ', err.message); port.on('data', function (data) { setState('Uv', Number(data.toString('hex', 5, 7) / 10)); setState('Ia', Number(data.toString('hex', 7, 9) / 100)); setState('Ew', Number(data.toString('hex', 9, 12) / 1)); setTimeout(function () { port.pause(); port.close(function (err) { if (err) console.error(err); //port is really closed console.log('Port is closed) port = null; // speed up garbage collector }); }, 100); }); port.write(cmd1, function(err) { if (err) { port.pause(); port.close(); return console.log('Error on write: ', err.message); } //console.log('message written'); }); }); }); -
Работает.
Правильнее сначала слушатель запустить с таймаутом 100 мс и только потом отправить комманду в порт?
-
Работает.
Правильнее сначала слушатель запустить с таймаутом 100 мс и только потом отправить комманду в порт? `
Да.Вот только "слушатель" запускается не с таймаутом, а просто перед тем, как послать команду. И после ответа порт по таймауту закрывается.
Hey! Du scheinst an dieser Unterhaltung interessiert zu sein, hast aber noch kein Konto.
Hast du es satt, bei jedem Besuch durch die gleichen Beiträge zu scrollen? Wenn du dich für ein Konto anmeldest, kommst du immer genau dorthin zurück, wo du zuvor warst, und kannst dich über neue Antworten benachrichtigen lassen (entweder per E-Mail oder Push-Benachrichtigung). Du kannst auch Lesezeichen speichern und Beiträge positiv bewerten, um anderen Community-Mitgliedern deine Wertschätzung zu zeigen.
Mit deinem Input könnte dieser Beitrag noch besser werden 💗
Registrieren Anmelden