NEWS
Synchrone Datenübertragung RS232 - Hilfe...
-
Vorweg, ich bin Anfänger in Javascript und brauche mal Hilfe von den Experten... Also folgendes: Ich kommuniziere mit meinem Heizungsregler über RS232, die Kommunikation ist sagen wir mal "synchron", d.h. ich sende einen Befehl, warte auf Antwort, dann 500ms Pause, nächster Befehl, warte auf Antwort usw. Also richtig old-school.
Was will ich machen: Ich möchte 3 Werte abholen, diese sind oben als Array deklariert.
Problem: Ich bekomme es in der sendData und receiveData Funktion überhaupt nicht gebacken das ich diese "Send->Receive-Pause" Abfolge einhalte. Aktuell wird anscheinend das ganze Array auf einmal abgeschickt...
Jeder der 3 empfangenen Werte soll in einen Datenpunkt.Hier mal der log und mein Code, bin echt für jeden Tipp dankbar.
15:02:42.304 info javascript.0 (3816) script.js.common.Test-1: Data send: 17,1,0,0,16,17,2,0,0,19,17,3,0,0,18 15:02:42.306 info javascript.0 (3816) script.js.common.Test-1: Data send: 17,1,0,0,16,17,2,0,0,19,17,3,0,0,18 15:02:42.306 info javascript.0 (3816) script.js.common.Test-1: Data send: 17,1,0,0,16,17,2,0,0,19,17,3,0,0,18 15:02:42.454 info javascript.0 (3816) script.js.common.Test-1: Data received: 0211000112 15:02:42.455 info javascript.0 (3816) script.js.common.Test-1: 0211000112 15:02:42.459 info javascript.0 (3816) script.js.common.Test-1: Data received: 0211000112 15:02:42.460 info javascript.0 (3816) script.js.common.Test-1: 0211000112 15:02:42.463 info javascript.0 (3816) script.js.common.Test-1: Data received: 0211000112 15:02:42.463 info javascript.0 (3816) script.js.common.Test-1: 0211000112 15:02:42.467 info javascript.0 (3816) script.js.common.Test-1: Data received: 0211000112 15:02:42.467 info javascript.0 (3816) script.js.common.Test-1: 0211000112const SerialPort = require('serialport'); const ByteLength = SerialPort.parsers.ByteLength; var cronStr = "*/1 * * * *"; var buffer = new Array(3); //Send-buffer - fetch Controller Mode Circuit 1 buffer[0] = new Array(5); buffer[0][0] = 0x11; //Command buffer[0][1] = 0x01; //Address buffer[0][2] = 0x00; buffer[0][3] = 0x00; buffer[0][4] = 0x10; //11 ^ 01 = 10 //Send-buffer - fetch Controller Mode Circuit 2 buffer[1] = new Array(5); buffer[1][0] = 0x11; //Command buffer[1][1] = 0x02; //Address buffer[1][2] = 0x00; buffer[1][3] = 0x00; buffer[1][4] = 0x13 //11 ^ 02 = 13 //Send-buffer - fetch Controller Mode Circuit 3 buffer[2] = new Array(5); buffer[2][0] = 0x11; //Command buffer[2][1] = 0x03; //Address buffer[2][2] = 0x00; buffer[2][3] = 0x00; buffer[2][4] = 0x12; //11 ^ 03 = 12 var name = [ 'Danfoss-ECL-300.Controller Mode - Heizkreis 1', 'Danfoss-ECL-300.Controller Mode - Heizkreis 2', 'Danfoss-ECL-300.Controller Mode - Heizkreis 3' ] // SerialPort Init const port = new SerialPort("/dev/ttyUSB0", { baudRate: 1200, dataBits : 8, parity : 'odd', stopBits: 1, flowControl: false }, function (err) { if (err) { port.close(); return log('Error: ', err.message); } function receiveData(i, port, name) { const parser = port.pipe(new ByteLength({ length: 5 })); parser.on('data', function (data) { console.log('Data received: ' + data.toString('hex')); var daten = data.toString('hex'); console.log (daten); setState(name[i], ("Danfoss-ECL-300.Controller Mode - Heizkreis 1")); }); } function sendData(buffer, i) { port.write(buffer[i], function(err) { if (err) { return log('Error on write: ', err.message); } log('Data send: ' + buffer.toString('hex')); }); } var i; for (i = 0; i < 7; i++) { receiveData(i, port, name); sendData(buffer, i); sleep(400); } // close port if the script stopped (to be able to open it again) onStop(function (callback) { if (port && port.isOpen) { port.close(); log('port closed'); } }); createState('Danfoss-ECL-300.Controller Mode - Heizkreis 1', { type: 'number', min: 0, def: 0, role: 'value' }); createState('Danfoss-ECL-300.Controller Mode - Heizkreis 2', { type: 'number', min: 0, def: 0, role: 'value' }); createState('Danfoss-ECL-300.Controller Mode - Heizkreis 3', { type: 'number', min: 0, def: 0, role: 'value' }); // Cron // schedule(cronStr, sendData ); }); -
Vorweg, ich bin Anfänger in Javascript und brauche mal Hilfe von den Experten... Also folgendes: Ich kommuniziere mit meinem Heizungsregler über RS232, die Kommunikation ist sagen wir mal "synchron", d.h. ich sende einen Befehl, warte auf Antwort, dann 500ms Pause, nächster Befehl, warte auf Antwort usw. Also richtig old-school.
Was will ich machen: Ich möchte 3 Werte abholen, diese sind oben als Array deklariert.
Problem: Ich bekomme es in der sendData und receiveData Funktion überhaupt nicht gebacken das ich diese "Send->Receive-Pause" Abfolge einhalte. Aktuell wird anscheinend das ganze Array auf einmal abgeschickt...
Jeder der 3 empfangenen Werte soll in einen Datenpunkt.Hier mal der log und mein Code, bin echt für jeden Tipp dankbar.
15:02:42.304 info javascript.0 (3816) script.js.common.Test-1: Data send: 17,1,0,0,16,17,2,0,0,19,17,3,0,0,18 15:02:42.306 info javascript.0 (3816) script.js.common.Test-1: Data send: 17,1,0,0,16,17,2,0,0,19,17,3,0,0,18 15:02:42.306 info javascript.0 (3816) script.js.common.Test-1: Data send: 17,1,0,0,16,17,2,0,0,19,17,3,0,0,18 15:02:42.454 info javascript.0 (3816) script.js.common.Test-1: Data received: 0211000112 15:02:42.455 info javascript.0 (3816) script.js.common.Test-1: 0211000112 15:02:42.459 info javascript.0 (3816) script.js.common.Test-1: Data received: 0211000112 15:02:42.460 info javascript.0 (3816) script.js.common.Test-1: 0211000112 15:02:42.463 info javascript.0 (3816) script.js.common.Test-1: Data received: 0211000112 15:02:42.463 info javascript.0 (3816) script.js.common.Test-1: 0211000112 15:02:42.467 info javascript.0 (3816) script.js.common.Test-1: Data received: 0211000112 15:02:42.467 info javascript.0 (3816) script.js.common.Test-1: 0211000112const SerialPort = require('serialport'); const ByteLength = SerialPort.parsers.ByteLength; var cronStr = "*/1 * * * *"; var buffer = new Array(3); //Send-buffer - fetch Controller Mode Circuit 1 buffer[0] = new Array(5); buffer[0][0] = 0x11; //Command buffer[0][1] = 0x01; //Address buffer[0][2] = 0x00; buffer[0][3] = 0x00; buffer[0][4] = 0x10; //11 ^ 01 = 10 //Send-buffer - fetch Controller Mode Circuit 2 buffer[1] = new Array(5); buffer[1][0] = 0x11; //Command buffer[1][1] = 0x02; //Address buffer[1][2] = 0x00; buffer[1][3] = 0x00; buffer[1][4] = 0x13 //11 ^ 02 = 13 //Send-buffer - fetch Controller Mode Circuit 3 buffer[2] = new Array(5); buffer[2][0] = 0x11; //Command buffer[2][1] = 0x03; //Address buffer[2][2] = 0x00; buffer[2][3] = 0x00; buffer[2][4] = 0x12; //11 ^ 03 = 12 var name = [ 'Danfoss-ECL-300.Controller Mode - Heizkreis 1', 'Danfoss-ECL-300.Controller Mode - Heizkreis 2', 'Danfoss-ECL-300.Controller Mode - Heizkreis 3' ] // SerialPort Init const port = new SerialPort("/dev/ttyUSB0", { baudRate: 1200, dataBits : 8, parity : 'odd', stopBits: 1, flowControl: false }, function (err) { if (err) { port.close(); return log('Error: ', err.message); } function receiveData(i, port, name) { const parser = port.pipe(new ByteLength({ length: 5 })); parser.on('data', function (data) { console.log('Data received: ' + data.toString('hex')); var daten = data.toString('hex'); console.log (daten); setState(name[i], ("Danfoss-ECL-300.Controller Mode - Heizkreis 1")); }); } function sendData(buffer, i) { port.write(buffer[i], function(err) { if (err) { return log('Error on write: ', err.message); } log('Data send: ' + buffer.toString('hex')); }); } var i; for (i = 0; i < 7; i++) { receiveData(i, port, name); sendData(buffer, i); sleep(400); } // close port if the script stopped (to be able to open it again) onStop(function (callback) { if (port && port.isOpen) { port.close(); log('port closed'); } }); createState('Danfoss-ECL-300.Controller Mode - Heizkreis 1', { type: 'number', min: 0, def: 0, role: 'value' }); createState('Danfoss-ECL-300.Controller Mode - Heizkreis 2', { type: 'number', min: 0, def: 0, role: 'value' }); createState('Danfoss-ECL-300.Controller Mode - Heizkreis 3', { type: 'number', min: 0, def: 0, role: 'value' }); // Cron // schedule(cronStr, sendData ); }); -
@spaceduck
port.write()ist asynchron, du darfst erst im callback die nächste iteration aufrufen.
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