String der via Python gesendet wird im C++ zerlegen
-
@Th69 sagte in String der via Python gesendet wird im C++ zerlegen:
Du übergibst bei
particleSensor.sensorConfiguration(ledBrightness1, sampleAverage1, ledMode1, sampleRate1, pulseWidth1, adcRange1);
string
-Werte, aber die Methode erwartetuint8_t
(also Zahlenwerte).
Du mußt also noch stoi o.ä. jeweils aufrufen.Danke für die Antwort. Das hatte ich auch vermutet, aber der Sensor wird ja mit Begriffen und Zahlen initialisiert, wie geht das zusammen? Siehe:
"particleSensor.sensorConfiguration(50, SAMPLEAVG_4, MODE_MULTILED, SAMPLERATE_1000, PULSEWIDTH_411, ADCRANGE_16384);"
-
Das sind ja alles nur Zahlen (die Bezeichner dort sind ja per
#define
erzeugte Werte, z.B.#define SAMPLEAVG_4 2
, und werden vom Präprozessor ersetzt, so daß der Compiler nur noch die reinen Zahlenwerte sieht).
-
@Th69 sagte in String der via Python gesendet wird im C++ zerlegen:
Das sind ja alles nur Zahlen (die Bezeichner dort sind ja per
#define
erzeugte Werte, z.B.#define SAMPLEAVG_4 2
, und werden vom Präprozessor ersetzt, so daß der Compiler nur noch die reinen Zahlenwerte sieht).Danke für deine Antwort! Aber um das nochmal zu klären, soll ich nun den Text separat übergeben und die Nummer als Variable oder den Text gleich weglassen? So ganz habe ich das noch nicht verstanden. Beim Ledmodus habe ich ja gar keine Zahl?
-
Jetzt habe ich bei deinem (zuletzt geposteten) Code erst gesehen, daß die Zeilen 23-29 so keinen Sinn ergeben (man kann keinen Makronamen in einem String speichern, um daraus dann direkt den Wert zu extrahieren).
Am besten, du deklarierst die 6 Variablen alsint
(bzw.uint_8
) und beim Parsen benutzt du dann direktledBrightness1 = std::stoi(parameters[0]); // etc.
Dafür müssen aber auch schon direkt in dem zu parsenden String Zahlenwerte stehen (und nicht die Makronamen), ansonsten müßtest du diese wiederum mittels einer
std::map<string, int>
o.ä. speichern und daraus dann die Zahlenwerte lesen.Wie sieht denn ein konkreter String aus?
-
@Th69 sagte in String der via Python gesendet wird im C++ zerlegen:
Jetzt habe ich bei deinem (zuletzt geposteten) Code erst gesehen, daß die Zeilen 23-29 so keinen Sinn ergeben (man kann keinen Makronamen in einem String speichern, um daraus dann direkt den Wert zu extrahieren).
Am besten, du deklarierst die 6 Variablen alsint
(bzw.uint_8
) und beim Parsen benutzt du dann direktledBrightness1 = std::stoi(parameters[0]); // etc.
Dafür müssen aber auch schon direkt in dem zu parsenden String Zahlenwerte stehen (und nicht die Makronamen), ansonsten müßtest du diese wiederum mittels einer
std::map<string, int>
o.ä. speichern und daraus dann die Zahlenwerte lesen.Wie sieht denn ein konkreter String aus?
Wenn ich dich richtig verstehe meinst du, dass ich in das Array das ich via BLE sende die Zahlen reinschreibe und diese dann den Variablen (in) innerhalb des C++ Sketch zuordne und auf die Namen verzichte, oder? So hätte ich mir das gedacht, aber ich muss dem Sensor ja auch noch den Namen übergeben, oder? Das hätte ich zB mit SAMPLEAVG_+(Variable) versucht, hatte aber nicht geklappt. Ich kann jedenfalls natürlich auch einfach Zahlen schicken und diese dann auch korrekt extrahieren. Bei der ersten Variable (Led Helligkeit = 50 oder 20, 30) klappte das schon.
-
Ja, so meine ich das.
-
@Th69 sagte in String der via Python gesendet wird im C++ zerlegen:
Ja, so meine ich das.
Ich habe das nun versucht, aber ich bekomme immer Fehlermeldungen, egal ob Plus oder ohne:
"'SAMPLERATE_' was not declared in this scope"
Das habe ich nun so geschrieben SAMPLERATE_+(Variable) oder 'SAMPLERATE_(Variable). Die Variable dürfte nun korrekt den Zahlenwert als Int haben, nur den Konstruktor (?) kann ich irgendwie nicht übergeben. Alternativ hatte ich gedacht im Sensordatenplatt zu schauen wie man den Sensor initialisiert und dann die Funktion selber anlegen. Aber kann das sein? Dass man das nicht anders lösen kann? Oder übersehe ich da was?
-
Du sollst (bzw. mußt) auf die Makronamen verzichten und direkt die Zahlen verwenden.
Die in DFRobot_MAX30102.h deklarierten Werte sind doch nur Zahlen zwischen 0 und 7.Oder werden vom Python-Programm nicht diese Zahlen übergeben, sondern z.B.
1000
bei derSample Rate
?Dann mußt du entweder das Python-Programm anpassen oder aber, wie ich schon schrieb, eine Datenstruktur dafür verwenden, z.B.
std::map<int, int> SampleRates = { { 50, 0 }, { 100, 1 }, { 200, 2 }, // ... };
Und dann per
SampleRate[sampleRate1]
darauf zugreifen.
Entsprechend dann für die anderen Parameter ähnliche Datenstrukturen anlegen.
-
@Th69 sagte in String der via Python gesendet wird im C++ zerlegen:
Du sollst (bzw. mußt) auf die Makronamen verzichten und direkt die Zahlen verwenden.
Die in DFRobot_MAX30102.h deklarierten Werte sind doch nur Zahlen zwischen 0 und 7.Ach jetzt hab ich das kapiert. Ja ich hatte immer die Zahlen 1000 zB übergeben und nicht 5. So macht das nun mehr Sinn, werde ich später dann testen. Stand igw total am Schlauch.
^^
-
@Th69 sagte in String der via Python gesendet wird im C++ zerlegen:
Du sollst (bzw. mußt) auf die Makronamen verzichten und direkt die Zahlen verwenden.
Die in DFRobot_MAX30102.h deklarierten Werte sind doch nur Zahlen zwischen 0 und 7.Oder werden vom Python-Programm nicht diese Zahlen übergeben, sondern z.B.
1000
bei derSample Rate
?Dann mußt du entweder das Python-Programm anpassen oder aber, wie ich schon schrieb, eine Datenstruktur dafür verwenden, z.B.
std::map<int, int> SampleRates = { { 50, 0 }, { 100, 1 }, { 200, 2 }, // ... };
Und dann per
SampleRate[sampleRate1]
darauf zugreifen.
Entsprechend dann für die anderen Parameter ähnliche Datenstrukturen anlegen.Ja das war der Fehler, nun klappt es. Yuhu! Danke und LG