ein paar Fragen zur Seriellen Datenübertragung

Hallo zusammen,

ich möchte Daten zwischen zwei Arduinos austauschen - soweit so klar.
Ein erster Test funktioniert soweit - jetzt sitze ich an den Feinheiten.

Ich möchte relativ viele floats übertragen (Messwerte von DHT22 Sensor und Messwerte einer Batterie).

Kann ich einfache

dtostrf(g_Batterie_Spannung, 0, 2, buffer);   // dtostrf(val, width, precision, buffer);
      Serial1.println(buffer);
dtostrf(g_Solar_Spannung, 0, 2, buffer);   // dtostrf(val, width, precision, buffer);
      Serial1.println(buffer);
dtostrf(g_Solar_Strom, 0, 2, buffer);   // dtostrf(val, width, precision, buffer);
      Serial1.println(buffer);

etc.

aufrufen oder wird das nicht funktionieren und ich sollte vor jeder Übertragung noch auf einen Start des Master Arduino warten?
Evtl Switch Case und pro Case einen Messwert schicken ala:

switch (Kommando) {
    case 0:
      dtostrf(g_Batterie_Spannung, 0, 2, buffer);   // dtostrf(val, width, precision, buffer);
      Serial1.println(buffer);
       break;
    case 1:
      dtostrf(g_Solar_Spannung, 0, 2, buffer);   // dtostrf(val, width, precision, buffer);
      Serial1.println(buffer);
       break;
    default:

           break;
  }

Zeitkritisch ist der Abruf nicht - mir reicht es, wenn die Werte jede Minute aktualisiert werden (Mittelwerte kann ich im Slave bilden).

So Teil zwei was ich noch ziemlich bescheiden gelöst habe ->
Beim Test konnte ich immer nur 3 Messwerte übertragen, dann hat der Arduino nichts mehr gelesen. Vermutung lag auf vollem Puffer. Mit dem "Trick"

Serial.end();
Serial.begin(115200);

wurde das Problem behoben - ich weiß dämlich, aber auf die Schnelle hat es funktioniert.

Das Lesen sah so aus

while (Serial1.available()) {
        if(stringComplete == false){
      inChar = (char)Serial1.read();
      inputString += inChar;
      Serial.println(inChar);
      if (inChar == '\n') {
        stringComplete = true;

Ich dachte bei Serial.read wird dann beim lesen das gelesene gelöscht?
Sollte man hier anstelle von
"while (Serial1.available()) {"
besser
"while (Serial1.read() >=0) {"
verwenden?

Viele Grüße
Oliver

Was hältst Du von Serial1.println(g_Batterie_Spannung,2);

Desweiteren könntest Du die Information, welche Spannung es ist, mitschicken:

Serial1.print(g_Batterie_Spannung,2);
Serial1.println('B');

agmue:
Was hältst Du von Serial1.println(g_Batterie_Spannung,2);

Desweiteren könntest Du die Information, welche Spannung es ist, mitschicken:

Serial1.print(g_Batterie_Spannung,2);
Serial1.println('B');

Klappt das dann auch mit negativen Vorzeichen?
Bei der Spannung wäre das kein Problem (die sollte ja immer positiv sein), aber bei Strom und Temperatur?

Die zweite Zeile könnte man als zusätzliche Rückmeldung nehmen - muss ich mal überlegen.
Bei mit Switch case hätte ich ja im Prinzip schon eine Zuordnung die sicher wäre.

BullSimons:
... aber bei Strom und Temperatur?

Der Strom sollte doch immer zum Akku fließen und die Temperatur in Kelvin ist auch immer positiv ;D

Wenn Du Dir die Werte auf dem seriellen Monitor ausgeben läßt, siehst Du, was übertragen wird.

BullSimons:
Bei mit Switch case hätte ich ja im Prinzip schon eine Zuordnung die sicher wäre.

Nee, die Reihenfolge ist immer gleich, es fehlt aber eine Synchronisierung. Der Lesende steigt ja irgendwann ein.

agmue:
Der Strom sollte doch immer zum Akku fließen und die Temperatur in Kelvin ist auch immer positiv ;D

Ein Akku kann aber auch entladen werden - das wäre dann negativ :wink: ok beim Strom vom Solarpanel wäre das eher nicht der Fall, aber ich messe auch beim Verbraucher.

agmue:
Wenn Du Dir die Werte auf dem seriellen Monitor ausgeben läßt, siehst Du, was übertragen wird.
Nee, die Reihenfolge ist immer gleich, es fehlt aber eine Synchronisierung. Der Lesende steigt ja irgendwann ein.

Der Master schickt an den Slave zB "1" , der Slave switcht dann in Case 1, bei 3 in Case 3 etc.
Oder ?

BullSimons:
Ein Akku kann aber auch entladen werden - das wäre dann negativ :wink:

War nur ein Scherz :slight_smile:

BullSimons:
Der Master schickt an den Slave zB "1" , der Slave switcht dann in Case 1, bei 3 in Case 3 etc.
Oder ?

Ja, aber Buchstaben lassen sich von den Zahlen besser unterscheiden, also "B" zu case 'B'.

Viele Wege führen nach Rom, auch ESC 1 wäre möglich.