Digitale Daten einer Leitung auslesen

 /*
  0xFF
  "&7- 0,7ms H+0019m0019m 5,5V 000.0"
  0x00

  0xFF
  "&7  0,0ms H+0017m0021m 5,5V 000.0"
  0x00

  0xFF
  "&7+ 0,1ms H+0021m0021m 5,5V 000.0"
  0x00

  https://www.arduino.cc/en/Reference/SoftwareSerial
*/
//============================== von hier ======================================================
#include <Streaming.h>
#include <SoftwareSerial.h>

#define rxPin 9
#define txPin 8

SoftwareSerial mySerial(txPin, rxPin) ; // =  SoftwareSerial(rxPin, txPin);

const byte numChars = 36;
char receivedChars[numChars];   // an array to store the received data

boolean newData = false;

void setup() {
  Serial.begin(9600);
  Serial.println("<Arduino is ready>");
  // Serial3.begin(9600);
}


void recvWithEndMarker() {
  static byte ndx = 0;
  char startMarker = '\xFF';
  char endMarker = '\x00';
  char rc;
}


//void loop() {
recvWithEndMarker();
showNewData();


while (Serial.available() > 0 && newData == false) {
  rc = Serial.read();

  if (rc != endMarker && rc != startMarker) {
    receivedChars[ndx] = rc;
    ndx++;
    if (ndx >= numChars) {
      ndx = numChars - 1;
    }
  }
  else {
    receivedChars[ndx] = '\0'; // terminate the string
    ndx = 0;
    if (rc == endMarker) newData = true;
  }
}

//}

// ============================================== bis hier ==========================================================

/*


  // char receivedChars1[] = {"&7- 0,7ms H+0019m0019m 5,5V 000.0"};
  // char receivedChars2[] = {"&7  0,0ms H-0017m0021m 5,5V 000.0"};
  // char receivedChars3[] = {"&7+ 0,1ms H+0021m0021m 5,5V 000.0"};

  //void setup()
  //{}

  /*  Serial.begin(9600);
  Serial.println(F("Anfang"));
  ausgabe(receivedChars1);
  ausgabe(receivedChars2);
  ausgabe(receivedChars3);
  }
  void ausgabe(char* text) {
  Serial << text << endl;
  char dir;
  byte a1 = 0, a2 = 0, s1 = 0, s2 = 0; // Hier sollen die Zahlenwerte landen
  short int h1 = 0, h2 = 0;
  sscanf(text, "&7%c %hhu,%hhums H%hdm%hdm %hhu,%hhuV 000.0", &dir, &a1, &a2, &h1, &h2, &s1, &s2);
  Serial << "dir: " << dir << "\ta1: " << a1 << "\ta2: " << a2 << "\th1: " << h1 << "\th2: " << h2 << "\ts1: " << s1 << "\ts2: " << s2 << endl;

  float stg = a1 + (a2 / 10.);
  float spg = s1 + (s2 / 10.);
  Serial << "Richtung: " << dir << "\tSteigung: " << stg << "\tHoehe: " << h1 << "\tSpannung: " << spg << endl;

  // Fuer die folgenden Zeilen ist eine Erweiterung der IDE notwendig, damit %f funktioniert.
  // Quelle: https://forum.arduino.cc/index.php?topicht=570408.msg3888254#msg3888254
  char* pos = strchr(text, (int)',');
   pos = '.';
  pos = strchr(text, (int)',');
   pos = '.';
  Serial << text << endl;

  float af = 0, sf = 0;
  sscanf(text, "&7%c %fms H%hdm%hdm %fV 000.0", &dir, &af, &h1, &h2, &sf); // hier %f
  Serial << "dir: " << dir << "\taf: " << af << "\th1: " << h1 << "\th2: " << h2 << "\tsf: " << sf << endl;
  // Ende notwendige Erweiterung.

  Serial.println(F("-------"));
  }
*/

Greyhaired:
Wo liegen die Fehler?

Du kannst die Dateien vergleichen, dann findest Du meine Änderungen. Versuche mal so:

#include <Streaming.h>
#include <SoftwareSerial.h>

#define rxPin 9
#define txPin -1  // Tx wird nicht verwendet

SoftwareSerial mySerial(rxPin,txPin) ; // =  SoftwareSerial(rxPin, txPin);

const byte numChars = 36;
char receivedChars[numChars];   // an array to store the received data

boolean newData = false;

void setup() {
  Serial.begin(9600);
  Serial.println(F("<Arduino is ready>"));
  mySerial.begin(9600);
}

void recvWithEndMarker() {
  static byte ndx = 0;
  char startMarker = '\xFF';
  char endMarker = '\x00';
  char rc;
  while (mySerial.available() > 0 && newData == false) {
    rc = mySerial.read();

    if (rc != endMarker && rc != startMarker) {
      receivedChars[ndx] = rc;
      ndx++;
      if (ndx >= numChars) {
        ndx = numChars - 1;
      }
    }
    else {
      receivedChars[ndx] = endMarker; // terminate the string
      ndx = 0;
      if (rc == endMarker) newData = true;
    }
  }
}

void showNewData() {
  if (newData == true) {
    Serial.print("Empfangen: ");
    ausgabe(receivedChars);
    newData = false;
  }
}

void ausgabe(char* text) {
  Serial << text << endl;
  char dir;
  byte a1 = 0, a2 = 0, s1 = 0, s2 = 0; // Hier sollen die Zahlenwerte landen
  short int h1 = 0, h2 = 0;
  sscanf(text, "&7%c %hhu,%hhums H%hdm%hdm %hhu,%hhuV 000.0", &dir, &a1, &a2, &h1, &h2, &s1, &s2);
  Serial << "dir: " << dir << "\ta1: " << a1 << "\ta2: " << a2 << "\th1: " << h1 << "\th2: " << h2 << "\ts1: " << s1 << "\ts2: " << s2 << endl;

  float stg = a1 + (a2 / 10.);
  float spg = s1 + (s2 / 10.);
  Serial << "Richtung: " << dir << "\tSteigung: " << stg << "\tHoehe: " << h1 << "\tSpannung: " << spg << endl;

  Serial.println(F("-------"));
}

void loop() {
  recvWithEndMarker();
  showNewData();
}

Falls Du nicht zu Fuß verfleichen willst: Winmerge. Die UNIXer kennen diff sowieso.

Gruß Tommy

Ich möchte mich bei allen, die mich bis hierher unterstützt haben bedanken, besonders bei "agmue".

Leider funktioniert lesen und anzeigen der Daten nicht.
Eben habe ich (vielleicht) verstanden, daß ich, was die zu lesenden Daten betrifft, wahrscheinlich auf dem Holzweg bin: Im Beitrag #11 habe ich zwei Bild-Dateien gepostet die zeigen, auf der Leitung werden binäre Datenpakete gesendet ! Und nicht wie von mir angenommen im Hex-Format.

Der Logic-Analyzer liest binäre Daten und zeigt sie in Hex an: Datei #10.

Gibt es für diesen Zweck eine #include xx.h-Unterstüzung oder ist ein Programm bekannt, das die Umwandlung binär nach hex vornimmt? Oder habe ich es immer noch nicht begriffen??

Vielen Dank + Gruß vom Bodensee
Rüdiger R.

Frage zu #10: wieviel Byte haben die gezeigten Datenpakete jeweils: 35+1 ?

Wie hast Du die Datei erzeugt? Welcher Logic-Analyzer, welches Programm?

Es sind 35 Bytes.

Ich benutze zwei Programme für die Datenanalyse: Saleae Logic 1.2.29 Beta und PulseView. Die USB-Hardware ist ein Saleae-kompatibler NoName_Analyzer. Alles zusammen funktioniert gut. Ich habe unten eine Bild-Datei beigefügt, die mit PulseView heute erstellt wurde. Es ist ganz eindeutig UART. Jedes Byte wird erkannt und richtig beschrieben. Allerdings bekomme ich keine Spannung angezeigt. Der zum VT-1_Variosystem gehörende Monitor (normal an der Datenleitung per Steckerkabel angeschlossen) zeigt die vom Logic-Analyzer gefundenen Werte 1:1 an.
Aber an der selben Leitung (Analyzer weg) den Arduino an Pin 9 und an GND angeschlossen zeigt keine Daten im Monitor.
Ich habe heute den MEGA2650 bekommen. Ich sollte es vielleicht an einem der Rx-Eingänge versuchen.
Danke für die Mühe.
Rüdiger R.

Gibt es für diesen Zweck eine #include xx.h-Unterstüzung oder ist ein Programm bekannt, das die Umwandlung binär nach hex vornimmt? Oder habe ich es immer noch nicht begriffen??

Nicht begriffen!
(befürchte ich)

Denn der Prozessor kann nur mit binären Daten umgehen.
Diese Sorte von Rechnern heißt nicht ohne Grund Binär Computer
Binärcode

Hex, Dezimal, oder ASCII sind nur leichter für Menschen lesbare Repräsentationen dieses Binärcodes.

Weil es bislang nicht wie erwartet funktioniert, frage ich nun ob es mit der Lese-Geschwindigkeit zu tun hat? Das Bild in #25 zeigt, daß das Datenpaket von Saleae in 36 ms gelesen wird. Passt das zur SoftwareSerial Einstellung 9600 ?

Warum rechnest du dir das nicht aus?

Habe ich inzwischen: 7750 Bit/Sek., also reichen 9600 Baud aus.

Es scheint, die Signale vom VT-1_Vario haben nicht die erforderliche Spannung, um vom Arduino gelesen/verstanden werden.

Deshalb habe ich die Leitung am Eingang eines Baustein ULM2003 angeschlossen (aus einer früheren Anwendung). Am Ausgang liegen jetzt Signale an, die am seriellen EingangsPin (hier #9) eine Aktion auslösen : while (mySerial.available....... dazu vorher an Pin 13 eine LED HIGH programmiert). Der serielle Montor zeigt Text, aber noch ohne Werte.

Die Signale werden allerdings nicht verstanden. Am Logic-Analyzer zeigte sich, das die Bits nun invertiert sind. Ich werde also eine kleine Transistor-Schaltung zufügen, um die Bits ein zweitesmal zu invertieren. Oder etwas anderes als den ULM2003 nehmen. Eine Software-Lösung wäre mir lieber.
Rüdiger R.

Greyhaired:
... ULM2003 ...

Du meinst ULN2003?

Der hat sieben Inverter und "Minus mal Minus macht Plus". Zum Probieren sollte es reichen.

Ja, ULN2003.
Der Versuch, das Ausgangssignal des ULN2003 an einem der anderen Kanäle wieder einzuschleifen und auf eine Umkehrung des Signals zu hoffen funktioniert nicht. Der Ausgang des ursprünglichen ersten Durchgangs bricht dabei zusammen. Der Analyzer zeigt kein Signal mehr an.

Ich brauche eine Technik/Schaltkreis, das den Signalpegel der VT-1_Leitung lediglich auf 5V anhebt und das Signal dabei nicht verändert.

Vielleicht wäre das etwas:
LMV358 100 Mal Signal Operationsverstärker Chipentwurf Modul Für Ardiuno

Das Leiden hat ein Ende. Dank freundlicher Unterstützung läuft das System wie gewünscht. Die Daten werden gelesen und angezeigt. Tatsächlich waren die Daten auf der Leitung zu schwach. Durch verstärken (BC548) und invertieren (ULN2003) habe ich jetzt die erforderliche Signalstärke. Ab jetzt geht es mir darum, ausgesuchte Daten (aktuelle Höhe; AkkuSpannung im Segler) mit einer Spachausgabe (gespeichert als Wave auf einer SD-Card) auszugeben.
Das wird auch nicht ohne Probleme sein. Ich sage nochmal DANKE. Das nächste Thema werde ich unter einem neuen Titel behandeln.

Greyhaired:
Das Leiden hat ein Ende. Dank freundlicher Unterstützung läuft das System wie gewünscht.

Bitte gerne :slight_smile:

Wenn ich nicht irre, kommen die Daten per Funk? Dann könnten Fehler enthalten sein, was eine Plausibilitätskontrolle notwendig machen könnte. Die roten Markierungen könnten beispielsweise überprüft werden:

&7- 0,7ms H+0019m0019m 5,5V 000.0"

Guten Abend, seit heute funktioniert mein Programm wie im 1. Beitrag beschrieben vollständig. Wegen des Umfangs brauche ich einen Mega2560. Die ersten Testdateien werden gefunden und gelesen.
Jetzt müssen die Wave-Dateien noch bezüglich der Datenrate etc. konvertiert und zu Gehör gebracht werden.
Die ersten Testdateien konnte ich leise hören. Ein kleiner Verstärker ist notwendig, aber das ist kein Programmierproblem. Bedanken möchte ich mich nochmal bei "agmue" für die freundliche Unterstützung.
Rüdier R.

Greyhaired:
Bedanken möchte ich mich nochmal bei "agmue" für die freundliche Unterstützung.

Bitte gerne, danke für die Rückmeldung :slight_smile: