INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
C++ Library Datenübergabe Problem
08.05.2018, 07:40
Beitrag #1
C++ Library Datenübergabe Problem
Hallo,

nach der Anleitung von luftdaten.info habe ich mir einen Feinstaubsensor zusammengebaut - der läuft gut.

Ermutigt davon habe ich einen mobilen Sensor mit eigener Software aufgebaut.
Dazu wollte ich die vorhandene Library erweitern.

Für den Sensor SDS011 von Nova Fitness gibt es mehrere
c++ libraries auf github und eine Dokumentation des Herstellers über das Protokoll.

Ich habe nun versucht auf basis der Librariy https://github.com/ricki-z/SDS011 so zu erweitern, damit alle Funktionen abgebildet sind und alle dokumentierten Daten Verwendung finden.

Mit der Arduino IDE kann ich das ohne Fehler kompilieren,
jedoch erhalte ich keine sinnvollen Ergebnisse vom Sensor zurück.Huh

Als Anfänger mit c++ vermute ich, dass ein Problem die Übergabe von Parametern an die Funktionen und die Rückgabe ist.
Die habe ich im copy und paste stil mit & und * ausgeführt und ausgebaut,
wie ich es vom Basisbeispiel abgeschaut habe.

Jetzt weiss ich aber nicht weiter. Confused

Kann ich hier bei der Fehlersuche helfend Unterstützung erhalten?
Angel

Gruß

Jose_ph


Angehängte Datei(en)
.zip  SDS011_vers.zip (Größe: 6,52 KB / Downloads: 11)
.pdf  Laser Dust Sensor Control Protocol_V1.4.pdf (Größe: 149,02 KB / Downloads: 12)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.05.2018, 08:30
Beitrag #2
RE: C++ Library Datenübergabe Problem
Stelle bitte die .h Datei und die Methoden, um die es geht aus der .cpp und deren Aufruf in der .ino direkt hier ein. Benutze dazu Codetags. Wie das geht, steht hier.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.05.2018, 10:31 (Dieser Beitrag wurde zuletzt bearbeitet: 08.05.2018 10:33 von jose_ph.)
Beitrag #3
RE: C++ Library Datenübergabe Problem
aus der ino

Code:
int  queryset = 1;    // 1 set Mode
  int activequery = 0;  // 0 activereport Mode (DEFAULT)
  int DevID1c = 0xFF;  // FF= all
  int DevID2c = 0xFF;  // FF= all

  int querysetr ;
  int activequeryr;
  int DevID1r;
  int DevID2r;
error = my_sdsv.SetDataReportingMode(&queryset, &activequery, &DevID1c, &DevID2c, &querysetr, &activequeryr, &DevID1r, &DevID2r);

  Serial.println("SetDataReportingMode: ");
  Serial.println(querysetr);
  Serial.println(activequeryr);
  Serial.println(String("DevID  " + DevID1r + DevID2r));
  Serial.print("Error: "); Serial.println(error);
  Serial.println("-- ");



und dann die library

Code:
static byte data_reporting_mode_query_SDS_cmd[19] = {


  0xAA, // head
  0xB4, // command id
  0x02, // data byte 1
  0x01, // data byte 2 ( 0 query mode) (1 set mode)
  0x01, // data byte 3 ( 0 report active mode DEFAULT)    (1 report query mode)
  0x00, // data byte 4
  0x00, // data byte 5
  0x00, // data byte 6
  0x00, // data byte 7
  0x00, // data byte 8
  0x00, // data byte 9
  0x00, // data byte 10
  0x00, // data byte 11
  0x00, // data byte 12
  0x00, // data byte 13
  0xFF, // data byte 14 (device id byte 1) FF= all
  0xFF, // data byte 15 (device id byte 2) FF= all
  0x02, // checksum
  0xAB  // tail
};

//checksum = summe databytes 1-15 = 2+1+1+ff+ff= 2

//-------------------------------------------------------------------------------------------------------

int SDS011_vers::SetDataReportingMode(int *queryset, int *activequery, int *DevID1c, int *DevID2c, int *querysetr, int *activequeryr, int *DevID1r, int *DevID2r)
{

  // sammeln des commandos
  for (uint8_t i = 0; i < 19; i++) {
    sds_data->write(data_reporting_mode_query_SDS_cmd[i]);
  }
  int checksum_is = 0;
  checksum_is += data_reporting_mode_query_SDS_cmd[2];
  data_reporting_mode_query_SDS_cmd[3]  = *queryset;    checksum_is += data_reporting_mode_query_SDS_cmd[3];
  data_reporting_mode_query_SDS_cmd[4]  = *activequery; checksum_is += data_reporting_mode_query_SDS_cmd[4];
  data_reporting_mode_query_SDS_cmd[15] = *DevID1c;     checksum_is += data_reporting_mode_query_SDS_cmd[15];
  data_reporting_mode_query_SDS_cmd[16] = *DevID2c;     checksum_is += data_reporting_mode_query_SDS_cmd[16];
  data_reporting_mode_query_SDS_cmd[17] = checksum_is % 256;
  sds_data->flush();   // Puffer zum sds schreiben




  // Antwort einlesen
  byte buffer;
  int value;
  int _qs = 0;
  int _ar = 0;
  int _res = 0;
  int _DevB1 = 0;
  int _DevB2 = 0;
  int len = 0;

  int checksum_ok = 0;
  int error = 2;  // ungleich null


  // Solange daten anliegen und bis 10 byte anwort erreicht sind
  while ((sds_data->available() > 0) && (sds_data->available() >= (10 - len))) {
    buffer = sds_data->read();
    value = int(buffer);

    // prüfen bis richtige Antwort kommt, solange len zurücksetzen
    switch (len) {
      case (0): if (value != 0xAA) {
          len = -1;
        };    break;
      case (1): if (value != 0xC5) {
          len = -1;
        };    break;     // replay data reporting mode
      case (2): if (value != 0x02) {
          len = -1;
        };    break;     // dito
      case (3): _qs  = value; checksum_is += value; break;       // query 0 / set 1
      case (4): _ar = value;  checksum_is += value; break;       // active 0 / report 1
      case (5): _res   = value; checksum_is += value; break;       // 0 reserve
      case (6): _DevB1 = value; checksum_is += value; break;       // Device Byte 1
      case (7): _DevB2 = value; checksum_is += value; break;       // Device Byte 2
      case (8): if (value == (checksum_is % 256)) {                // Checksum
          checksum_ok = 1;
        } else {
          len = -1;
        }; break;
      case (9): if (value != 0xAB) {
          len = -1;
        }; break;
    }

    len++;

    // wenn 10 byte gelesen und die checksumme ok ist übergabe daten
    if (len == 10 && checksum_ok == 1) {
      *querysetr  = _qs;
      *activequeryr = _ar;
      //*r_es   = _res;
      *DevID1r = _DevB1;
      *DevID2r = _DevB2;

      len = 0; checksum_ok = 0;  checksum_is = 0;  error = 0;  //alles auf null warum wird doch eh neu angelegt beim nächsten aufruf?
    }


    yield();  //Speicher putzen
  }
  return error;
}


und die h


Code:
#ifndef SDS011_vers_h
#define SDS011_vers_h

#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif

//----------------------------------------------------------------

#include <SoftwareSerial.h>

//----------------------------------------------------------------

class SDS011_vers {
//----------------------------------------------------------------
  public:

    SDS011_vers(void);

    void begin(uint8_t pin_rx, uint8_t pin_tx);

    void begin(SoftwareSerial* serial);

    void begin(HardwareSerial* serial);

//----------------------------------------------------------------


// 1


// 2
    int SetDataReportingMode(int *queryset,int *activequery,int *DevID1c,int *DevID2c,int *querysetr,int *activequeryr,int *DevID1r,int *DevID2r);

    int SetQueryReportingMode();

    int SetActiveReportingMode();

// 3



// 4
    int QueryDataCommand( int *DevID1c,int *DevID2c,float *p25, float *p10,int *DevID1r,int *DevID2r);

    int Read(float *p25, float *p10);

// 5
    int SetDeviceID(int *DevID1n,  int *DevID2n,  int *DevID1r,  int *DevID2r  );


// 6
    int SetSleepAndWork(int *queryset,int *sleepwork,int *DevID1c,int *DevID2c,int *querysetr,int *sleepworkr,int *DevID1r,int *DevID2r  );

    int SetSleep();

    int SetWork();


// 7
    int  CheckFirmwareVersion(int  *Y_ear, int *M_onth, int *D_ay,  int *D_evB1,  int *D_evB2  );
    

// 8
    int SetWorkingPeriod( int *queryset, int *contperiod, int *DevID1c, int *DevID2c, int *querysetr, int *contperiodr, int *DevID1r, int *DevID2r );

    int SetContinuousMode();


//----------------------------------------------------------------
  private:
    uint8_t _pin_rx, _pin_tx;
    Stream *sds_data;



//----------------------------------------------------------------
};

#endif
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.05.2018, 11:00
Beitrag #4
RE: C++ Library Datenübergabe Problem
Du solltest erst mal klar unterscheiden, welche Parameter nur in die Funktion übergeben werden sollen.
Diese als const definieren und als Wert, nicht als Zeiger übergeben.
Da Du die ...r-Werte im Sketch nicht benutzt, scheinst Du sie nicht zu brauchen. Dann können sie weg.
Sollten das Werte sein, die sich die Klasse merken soll, dann gehören sie als private in die Klasse.

Der Code funktioniert so nicht. Da stehen viele Anweisungen in der ino einfach in der Luft und nicht in einer Funktion.

yield() putzt übrigens nicht den Speicher. Auf Arduino ist es eine leere Funktion.

Evtl. wären ein paar Infos von Deiner Seite sinnvoll, was diese Methode eigentlich tun soll.

Um zu erkennen, was passiert/nicht passiert, kannst Du auch Serial-Ausgaben in die Lib bauen, um den Weg/Wert Deiner Parameter zu verfolgen.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.05.2018, 11:17
Beitrag #5
RE: C++ Library Datenübergabe Problem
Ok, das mit dem yield hatte ich al so gelesen, danke.

Ich möchte der Funktion
error = my_sdsv.SetDataReportingMode(&queryset, &activequery, &DevID1c, &DevID2c, &querysetr, &activequeryr, &DevID1r, &DevID2r);

vier werte übergeben und von ihr vier Antwortwerte erhalten.

Das klappt leider nicht derzeit, die r werte waren als die Replywerte gemeint.

Die Erklärung dazu steht im PDF, dem Protokoll des Sensor s im ersten Post.
... ein 19 byte kommendo wird an den sensor geschickt (vier variablen)
... eine zehn byze antwort kommt vom senso (vier variablen)
daran könnte ich sehen ob der sensor das bestätigt was ich von ihm wollte, die ersten beiden Variablen, und die beiden anderen sollten die device id des sensors sein.

Ich möchte im ino vergleichen ob er getan hat was ich wollte, daher habe ich die r werte eröffnet als gefäß.


Was soll ich also tun damit es geht?







(08.05.2018 11:00)Tommy56 schrieb:  Du solltest erst mal klar unterscheiden, welche Parameter nur in die Funktion übergeben werden sollen.
Diese als const definieren und als Wert, nicht als Zeiger übergeben.
Da Du die ...r-Werte im Sketch nicht benutzt, scheinst Du sie nicht zu brauchen. Dann können sie weg.
Sollten das Werte sein, die sich die Klasse merken soll, dann gehören sie als private in die Klasse.

Der Code funktioniert so nicht. Da stehen viele Anweisungen in der ino einfach in der Luft und nicht in einer Funktion.

yield() putzt übrigens nicht den Speicher. Auf Arduino ist es eine leere Funktion.

Evtl. wären ein paar Infos von Deiner Seite sinnvoll, was diese Methode eigentlich tun soll.

Um zu erkennen, was passiert/nicht passiert, kannst Du auch Serial-Ausgaben in die Lib bauen, um den Weg/Wert Deiner Parameter zu verfolgen.

Gruß Tommy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.05.2018, 12:23
Beitrag #6
RE: C++ Library Datenübergabe Problem
Das habe ich doch geschrieben. Die Werte rein in die Methode als const Werte und Ausgaben in die Lib rein, damit Du siehst was passiert.
Und dann durch debuggen. Das kannst nur Du machen, da wir Deine Hardware nicht haben.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.05.2018, 12:52
Beitrag #7
RE: C++ Library Datenübergabe Problem
Sorry, das verstehe ich nicht.

Wie sieht sowas aus? - Ich denke ich hab das doch getan.

Gib mal ein Beispiel wie das gehen soll.

Nur auf der verbalen Oberfläche hilft mir das mangels Kenntnis nicht weiter.
Wenn ich das komplett verstünde, hätte ich das eigentliche Problem nicht.




(08.05.2018 12:23)Tommy56 schrieb:  Das habe ich doch geschrieben. Die Werte rein in die Methode als const Werte und Ausgaben in die Lib rein, damit Du siehst was passiert.
Und dann durch debuggen. Das kannst nur Du machen, da wir Deine Hardware nicht haben.

Gruß Tommy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.05.2018, 13:06
Beitrag #8
RE: C++ Library Datenübergabe Problem
Also wenn Du nicht weißt, wie Du mit Serial.print umgehen mußt oder wie Du "normale" Parameterübergaben ohne Pointer machst, dann fehlen Dir die elementarsten Grundlagen.
Die solltest Du dann erst mal lernen (nicht nur kopieren).

Bis dahin solltest Du die Lib weg legen, denn dann wird das nichts.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Problem mit TFT Display Anzeige wechseln Thor Wallhall 10 1.296 06.07.2018 20:51
Letzter Beitrag: Thor Wallhall
  Zeit-Server-Problem 182 19 1.749 07.06.2018 21:42
Letzter Beitrag: ardu_arne
  Bootloader update mit USBASP Problem sepp01 15 1.425 12.05.2018 17:23
Letzter Beitrag: sepp01
  Library Tellen 8 655 01.05.2018 13:31
Letzter Beitrag: Tellen
  Problem mit der Textauswertung Franz54 13 807 15.04.2018 18:17
Letzter Beitrag: Tommy56
  Arduin Radio Head Library driver Probleme gandalf7588 3 605 08.04.2018 13:05
Letzter Beitrag: gandalf7588
  Adresse MCP23008 mit Library? DL1AKP 5 431 29.03.2018 13:07
Letzter Beitrag: DL1AKP
  Problem mit RIFD UID ParadoxDev 6 500 27.03.2018 12:04
Letzter Beitrag: ParadoxDev
  Problem mit OLED 0.96" Display torsten_156 5 2.137 07.03.2018 23:27
Letzter Beitrag: Tommy56
  Ucglib Library Problem Bully 26 1.855 05.03.2018 18:47
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste