- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 26

Thema: Serial Daten bei Komma trennen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    shedepe
    Gast
    Ob es schlau ist oder nicht habe ich nicht gesagt, nur dass es machbar ist. Und da wir uns auf einem Mikrocontroller befinden will man häufig so effizient wie mögich mit seiner Rechenzeit umgehen. Das ist bei komplexeren Datenformaten + den damit komplexeren Parsern nicht unbedingt gegeben.

    Aber auch wenn man ein Newline zeichen hat, würde ich nicht hingehen, die Daten zuerst speichern und dann Parsen, sondern on the fly parsen. Stringoperationen sind nämlich nicht wirklich Rechenzeit optimal.

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von shedepe Beitrag anzeigen
    Ob es schlau ist oder nicht habe ich nicht gesagt, nur dass es machbar ist.
    Wenn du drauf bestehst, es ist nicht machbar, da ein Feld, wie geschrieben, 0 bis 3 Zeichen lang sein kann.
    Und da wir uns auf einem Mikrocontroller befinden will man häufig so effizient wie mögich mit seiner Rechenzeit umgehen. Das ist bei komplexeren Datenformaten + den damit komplexeren Parsern nicht unbedingt gegeben.
    Der Code muß so schnell sein, wie nötig und keine bisschen schneller.
    Aber auch wenn man ein Newline zeichen hat, würde ich nicht hingehen, die Daten zuerst speichern und dann Parsen, sondern on the fly parsen.
    Ich dagegen würde nie einzelne Zeichen abholen sondern einen Buffer im Interrupt füllen. Und erst wenn der Buffer dann geparst ist und nur gültige Werte enthält, würde ich die Daten weiterverabeiten.
    Stringoperationen sind nämlich nicht wirklich Rechenzeit optimal.
    Na dann sollte man den ganzen C++ Overhead des Arduino über Board werfen. Aber für nicht benutzte Prozessorzyklen gibts kein Geld zurück. Es ist also Unsinn, auf erprobte und tausendfach getestete Libraries zu verzichten. So ein moderner µC hat eine mit dem original IBM-XT vergleichbare oder sogar höhere Rechenleistung. Da wurde kaufmännische Buchhaltung oder Textverarbeitung mit gemacht, nur so zur Einordnung der Rechenleistung. Solange nicht ganz spezielle Gründe dagegen sprechen ( so als Lehrling muß man mal einen Würfel feilen bevor man an die Fräse darf ) würd ich immer Funktionen aus der C-Library verwenden. Da muß man zwischen 8-Bit µC, einem 32-Bit µC und dem PC nicht umlernen, ist alles C bzw C++.

    MfG Klebwax
    Geändert von Klebwax (08.10.2017 um 13:19 Uhr)
    Strom fließt auch durch krumme Drähte !

  3. #3
    HaWe
    Gast
    da die Daten als Text-String im ASCII- bzw. csv-Format per Serial() gesendet und empfangen werden , ist es sinnvoll, die Arduino Serial + String-class Funktionen zu verwenden, zusammen mit einem eindeutigen Trennzeichen, z.B. LineFeed:

    HTML-Code:
    char termbyte = '\n';
    String ReadBuffer = "";
    while ( !Serial.available() );
    if ( Serial.available() ) {
       ReadBuffer = Serial.readStringUntil(termbyte);
    }
    Dann muss man den Puffer noch an den Kommas in Einzelstrings ("Tokens") aufteilen und die einzelnen Tokens in echte Zahen umwandeln.

    https://www.arduino.cc/en/Reference/Serial
    https://www.arduino.cc/en/Reference/StringObject

    edit:
    alternativ kann man die Daten auch einzeln jeweils bis zum termbyte ',' lesen, dann sofort in eine Zahl umwandeln, und fortsetzen bis das termbyte '\n' ist, damit man wieder eindeutigere Start- und Stoppbedingungen hat, und dann wieder von vorn - ist aber wschl etwas schwieriger zu programmieren mit den Arduino-Methoden.
    Geändert von HaWe (09.10.2017 um 19:09 Uhr)

  4. #4
    shedepe
    Gast
    @Klebwax. Sorry. Lese Kompetenz
    Über die anderen Punkte kann man sich streiten. Auf einem Desktop würde ich dir sofort recht geben, auf einem Mikrocontroller nicht.

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    67
    Beiträge
    2.435
    Kennt das Arduino-C kein scanf(); oder sscanf(); ?

    Code:
    sscanf(buffer, "%d,%d,%d,%d", &sensor[0], &sensor[1], &sensor[2], &sensor[3]);
    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  6. #6
    HaWe
    Gast
    Zitat Zitat von Peter(TOO) Beitrag anzeigen
    Kennt das Arduino-C kein scanf(); oder sscanf(); ?

    Code:
    sscanf(buffer, "%d,%d,%d,%d", &sensor[0], &sensor[1], &sensor[2], &sensor[3]);
    MfG Peter(TOO)
    prinzipiell schon - aber erstmal müsstest du zeigen, wie dein "buffer" erzeugt wird, und dann - probier's aus!

  7. #7
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    707
    Zitat Zitat von HaWe Beitrag anzeigen
    prinzipiell schon - aber erstmal müsstest du zeigen, wie dein "buffer" erzeugt wird, und dann - probier's aus!
    Ich habe mir gerade mal erlaubt das hier auf dem Uno zu testen
    Code:
    void setup() {
      // put your setup code here, to run once:
    
      Serial.begin(9600);
    
      int a,b,c;  
      String test = "1 2 3";
      sscanf(test.c_str(), "%d %d %d",&a, &b, &c);
    
      Serial.print("a = ");
      Serial.println(a);
      Serial.print("b = ");
      Serial.println(b);
      Serial.print("c = ");
      Serial.println(c);
    }
    
    void loop() {
      // put your main code here, to run repeatedly:
    
    }
    ergibt auch brav
    a = 1
    b = 2
    c = 3
    Nachteil: Der kleine Sketch belegt bereits 4780 Bytes Flash und 228 Bytes RAM.

    Normalerweise nehme ich sprintf usw. nur auf dem Teensy. Da gehen aber auch C++ strings und die Konvertierungsfunktionen aus C++14.

Ähnliche Themen

  1. serial daten übertragen
    Von foobar123 im Forum Arduino -Plattform
    Antworten: 0
    Letzter Beitrag: 04.02.2014, 23:24
  2. Serial USB Daten
    Von Ripper121 im Forum AVR Hardwarethemen
    Antworten: 4
    Letzter Beitrag: 15.06.2011, 07:33
  3. komma verschieben in zahl
    Von puci123 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 12.10.2009, 13:09
  4. Aufrunden nach dem komma!
    Von grillfisch im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 26.01.2009, 19:35
  5. Variablen und Komma ??
    Von Roberto im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 5
    Letzter Beitrag: 26.08.2005, 03:54

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress