Globale Variable in Loop setzt sich immer zurück

Irgendwie komme ich hier nicht mehr weiter und kann mir das nicht erklären. Vermutlich hab ich irgendwo einen simplen Fehler drinnen, aber ich sehe ihn nicht. Vielleicht kann mir jemand helfen:

Ich habe eine Anwendung bei der ich über Softserial (Bluetooth) Zeichen hereinbekomme. Die Zeichenkette besteht aus einem Buchstaben und einer Zahl. Der Buchstabe kennzeichnet um was es sich für einen Wert handelt und die Zahl dann den Wert. Da ich die Werte für Berechnungen zwischenspeichern will hab ich globale Variable außerhalb des Loops angelegt und dort speichere will ich die Werte ablegen. Mein Problem jetzt:

Bei jedem Durchlauf der Loop werden die Werte directionValue und speedValue auf 0 gesetzt. Ich hab jetzt keine Ahnung warum. Eigentlich sollen die Werte dort abgelegt werden. Kann mir jemand sagen, was ich hier falsch mache bzw. wie ich die Werte so ablege, dass sie nicht bei jedem Loop Durchlauf auf 0 gesetzt werden.

#include <SoftwareSerial.h>
SoftwareSerial BTserial(8, 9); // RX | TX
 
const long baudRate = 38400; 
const int analogOut1 = 5;
const int analogOut2 = 6;
char c=' ';
char command='s';
char commandValueString[4]="0";
unsigned long commandValue=0;
int i=0;
boolean commandSend = true;
int analogValue1=0;
int analogValue2=0;
int speedValue=0;
int directionValue=0;
 
void setup() 
{   pinMode(analogOut1, OUTPUT);
    pinMode(analogOut2, OUTPUT);
    Serial.begin(115000);    
    BTserial.begin(baudRate);  
}
 
void loop()
{
    if (BTserial.available())
    {              
        c = BTserial.read();
        Serial.write(c);

        if ( c != 10 && i < 5 && commandSend == true && c < 59 ) {
          commandValueString[i++] = c;   
        }
        else
        {
          commandValueString[i] = '\0'; 
          i = 0;
          commandValue = strtoul( commandValueString, NULL, 10 ); 

          if (command == 's') speedValue=commandValue;
          if (command == 'd') directionValue=commandValue;

          analogValue1=speedValue-(128-directionValue);
          analogValue2=speedValue+(128-directionValue);
          
          analogWrite(analogOut1,analogValue1);
          analogWrite(analogOut2,analogValue2);
          commandSend=false;    
          Serial.print("DirectionValue: ");
          Serial.print(directionValue);
          Serial.print("   ---   SpeedValue:");
          Serial.print(speedValue);
        }

        if (c == 's' || c == 'd' || c == 'b') {
          commandSend = true;
          command = c;
        }

    }
}

Dann sie dir den Variableninhalt der besagten Variablen einfach mal mit dem seriellen Monitor an.

itsme7:
Irgendwie komme ich hier nicht mehr weiter und kann mir das nicht erklären. Vermutlich hab ich irgendwo einen simplen Fehler drinnen, aber ich sehe ihn nicht. Vielleicht kann mir jemand helfen:

Warum machst Du das (und weiteres):

if (command == 's')

und prüfst nicht auf Basis von c? Den hast Du vorher.
command bekommst Du erst gesetzt, wenn Du an der Bedingung vorbei bist.

my_xy_projekt:
Warum machst Du das (und weiteres):

if (command == 's')

und prüfst nicht auf Basis von c? Den hast Du vorher.
command bekommst Du erst gesetzt, wenn Du an der Bedingung vorbei bist.

Ich habe den Code jetzt mehrmals umgestellt um einiges auszuprobieren. Der bleibt nicht so. Allerdings ist mir trotzdem einfach nicht klar, warum die globalen Variablen beim Loop immer auf 0 gesetzt werden.

itsme7:
Ich habe den Code jetzt mehrmals umgestellt um einiges auszuprobieren. Der bleibt nicht so. Allerdings ist mir trotzdem einfach nicht klar, warum die globalen Variablen beim Loop immer auf 0 gesetzt werden.

Deswegen sollst du dir an der entsprechenden Stelle serielle Ausgaben einbauen, dann siehst du es selbst.
Und kannst evtl. auch deinen Fehler finden.

Nach
commandValue = strtoul ( commandValueString, NULL, 10 );
Neu einfügen:

static int testint=0;
Serial.println(commandValue);
testint++;
if (testint>10) {while(1);}

Gibt Dir 10 mal eine Ausgabe - dann bleibt der Code dort in der Endlosschleife.
Der Inhalt kann Dich führen....

HotSystems war schneller ;(

my_xy_projekt:
Nach
commandValue = strtoul ( commandValueString, NULL, 10 );
Neu einfügen:

static int testint=0;

Serial.println(commandValue);
testint++;
if (testint>10) {while(1);}




Gibt Dir 10 mal eine Ausgabe - dann bleibt der Code dort in der Endlosschleife.
Der Inhalt kann Dich führen....

HotSystems war schneller ;(

Aber was soll mir das helfen? Ich gebe ja weiter unten eh schon mit Serial.print(directionValue); den Wert aus. Da weiter unten passt es ja auch noch. Ich hatte auch schon viele weitere Ausgaben im Code mal eingebaut. Damit hab ich ja gesehen, dass solange man im gleichen Loop ist, der directionValue gesetzt bleibt aber sobald der Loop von vorne anfängt, ist der directionValue / speedValue wieder 0. Dem wird aber zwischenzeitlich ja nichts weiter zugewiesen.

itsme7:
Aber was soll mir das helfen?

Ich hatte auch schon viele weitere Ausgaben im Code mal eingebaut.

Dann bin ich raus.

Allerdings ist mir trotzdem einfach nicht klar, warum die globalen Variablen beim Loop immer auf 0 gesetzt werden.

Werden sie nicht!

Es sei denn:

  1. es erfolgt ein Reset
  2. du hast es so programmiert
  3. dir läuft ein Arrayindex, oder Pointer, aus dem Ruder.

Suchs dir selber aus!

Habs gefunden. Wie ich schon vermutet hab, ist es ein Logik-/Programmierfehler gewesen. Der else Zweig wird auch schon bei den Commands durchlaufen und dort die Werte dann gelöscht.

Deine besagten Variablen stehen doch nur im else-Zweig.
Also hast du das so programmiert.

HotSystems:
Also hast du das so programmiert.

Und wenn er meinen kleinen Schnipsel unwidersprochen genommen hätte, hätte er gesehen, das er oben mit seinem c den übergebenen Char bekommt und danach genau alles gelöscht wird.

Erstmal rumpoltern.
Aber vielleicht hat er ja doch den zündenden Funken gehabt, denn ich schrub:

Der Inhalt kann Dich führen....