Navigation

    Logo
    • Register
    • Login
    • Search
    • Recent
    • Tags
    • Unread
    • Categories
    • Unreplied
    • Popular
    • GitHub
    • Docu
    • Hilfe
    1. Home
    2. Deutsch
    3. Skripten / Logik
    4. JavaScript
    5. Synchrone Datenübertragung RS232 - Hilfe...

    NEWS

    • Neuer Blog: Fotos und Eindrücke aus Solingen

    • ioBroker@Smart Living Forum Solingen, 14.06. - Agenda added

    • ioBroker goes Matter ... Matter Adapter in Stable

    Synchrone Datenübertragung RS232 - Hilfe...

    This topic has been deleted. Only users with topic management privileges can see it.
    • S
      spaceduck last edited by

      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 );
      
      });
      
      
      UncleSam 1 Reply Last reply Reply Quote 0
      • UncleSam
        UncleSam Developer @spaceduck last edited by

        @spaceduck port.write() ist asynchron, du darfst erst im callback die nächste iteration aufrufen.

        S 1 Reply Last reply Reply Quote 0
        • S
          spaceduck @UncleSam last edited by spaceduck

          @UncleSam

          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...

          1 Reply Last reply Reply Quote 0
          • First post
            Last post

          Support us

          ioBroker
          Community Adapters
          Donate

          864
          Online

          31.8k
          Users

          80.0k
          Topics

          1.3m
          Posts

          2
          3
          221
          Loading More Posts
          • Oldest to Newest
          • Newest to Oldest
          • Most Votes
          Reply
          • Reply as topic
          Log in to reply
          Community
          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
          The ioBroker Community 2014-2023
          logo