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: 0211000112
const 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. -
Erstmal danke - Da ich mich hier als absoluter Programmier-Anfänger outen muss: Hast Du einen Beispielcode oder kannst Du mir anhand meines Scriptes erklären was ich da wo ändern muss? Danke schon mal...