Serielle Schnittstelle Auslesen probleme

Danke dir durch dich habe ich es jetzt fast Geschäft :slight_smile:

habe jetzt es hin bekommen das Config auszulesen und dann die Zahlen auch richtig auszulesen und in das Array zu schreiben :slight_smile:
ich kann es auch Resetten :slight_smile: das ist alles schon mal sehr gut,
ich lasse mir auch immer eine Kontrolle Zeile nach dem Empfang zusenden, so kann ich das dann auch Prüfen ob alles Richtig eingegeben wurde oder nicht.

jetzt habe ich nur ein Problem mein Prog hängt sich glaube ich auf :frowning: denn nachdem ich die taste gedrückt habe kann ich nichts mehr machen, ich finde nur den Fehler nicht,
vielleicht könnt da mal jemand drüber schauen und mir sagen wo der Wurm drin ist.

das ist der Code:

/* 
  Befehl              Reagzion             Antwort
  
  Name:               Ausgabe              Programm Name
  
  Firmware:           Ausgabe              Firmware Nr.
  
  Reset:              Sätzt das Array      Hadware Reset  
                      Hadware wider auf 
                      0
                      
  Print:              Ausgabe der hadware 
                      Config in einer Tabelle
                      
  Config:1,10,30,0    sätzt die Hadware    Zahlenfolge
                      Configuration neu ...
*/

   #define ZEILENTRENNZEICHEN 13                                // 13 ist Steuerzeichen CR (Carriage Return)

// Config Daten 
   char Firmware_Nr[] = "1.0.1";                                // Firmware
   char Name[]        = "Tropfen Box";                          // Programmmane
   int  startPin      = 2;                                      // Hier ist der taster angeschloßen
   int  Baudrate      = 9600;                                   // Baudrate für die Übertragung zwischen Arduino und PC 
   int  Lauf          = 0;                                      // Zwischenspeicher
   unsigned long gesamtDauer = 0;
   unsigned long starttime;
   unsigned long looptime;

   struct hardware_t{int pin;long vorlaufzeit; long dauer;};    // Hadware Strucktur
// Test Hadware Arrey füllen   
   hardware_t hardware[5]=
    {
      {3, 10, 30},
      {4, 50, 30},
    };
   int schritte = sizeof(hardware) / sizeof(hardware[0]);       // Anzahl der Hadware Schritte definiren


// Das ist eine Funktion !!!
char* receiveBuffer()
 {
  static char lineBuffer[100];                                              // Maximale Zeilenlänge festlegen
  static byte counter=0;
  char c;
  
  if (Serial.available()==0) return NULL;                                   // Nullpointer zurück
  if (counter==0) memset(lineBuffer,0,sizeof(lineBuffer));                  // Puffer vor Benutzung löschen
  c=Serial.read();                                                          // Aktueller Pufer in c Speichern

  if (c==ZEILENTRENNZEICHEN)                                                // wenn c gleich ZEILENTRENNZEICHEN dann aufführen 
   {
     counter=0;                                                             // Zähler zurücksätzen damit neue Zeilen empfangen werden kann
     return lineBuffer;                                                     // Volständige Zeile zurückgeben
   }
   else if (c>=32)                                                          // kein Steuerzeichen! (23 = Ascii zeichen !)
   {
    lineBuffer[counter]=c;                                                  // Zeichen im Zeilenpuffer einfügen
    if (counter<sizeof(lineBuffer)-2) counter++;
   }
   return NULL;
  }
// Das ist eine Funktion !!!

void setup()
 { 
    Serial.begin(Baudrate);                       // Serielenport Starten
    pinMode(startPin, INPUT);                     // startPin auf INPUT setzen (Taster) 
 }                                                 


void loop()
{
 char* text=receiveBuffer();                                                // Alles aus der Serielenschnitstelle Lesen
 if(text != NULL)
  {
     if (strcmp(text,"Name:")==0)                                               // Befehl prüfen "Name:"
       {Serial.println(Name);}                                                    // Ausgabe
     else if (strcmp(text,"Firmware:")==0)                                      // Befehl prüfen "Firmware:"
       {Serial.println(Firmware_Nr);}                                              // Ausgabe
     else if (strcmp(text,"Reset:")==0)                                         // Befehl prüfen "Reset:"
       {memset(hardware, 0, sizeof(hardware)); Serial.println("Hadware Reset");}   // Hadware Reseten und Ausgabe
     else if (strcmp(text,"Print:")==0)                                         // Befehl prüfen "Print:"
       {  
         for (int i=0;i<schritte;i++)
          {
            Serial.print(hardware[i].pin);
            Serial.print(", ");
            Serial.print(hardware[i].vorlaufzeit);
            Serial.print(", ");
            Serial.println(hardware[i].dauer);
          }
       }
     else if (strncmp(text,"Config:",7)==0)                                      // Befehl prüfen "Config:"
       {
             text = text + strlen_P(PSTR("Config:")) ;
             int pin         = atoi(strtok(text, ","));
             int vorlaufzeit = atoi(strtok(NULL, ","));
             int dauer       = atoi(strtok(NULL, ","));
             int Zeile       = atoi(strtok(NULL, ","));

          hardware[Zeile].pin         = pin;
          hardware[Zeile].vorlaufzeit = vorlaufzeit;
          hardware[Zeile].dauer       = dauer;
          Serial.print(pin); Serial.print(",");                                  // Ausgabe
          Serial.print(vorlaufzeit); Serial.print(",");                          // Ausgabe
          Serial.println(dauer);                                                 // Ausgabe
       }                                              
   }

  if (digitalRead(startPin)== HIGH)                                    // Taste Wurde gedrückt
   {
     Lauf = 0;                                                         // Programm darf Starten  
     while(digitalRead(startPin)== HIGH)                               // Die Schleife leuft so lange bis die Taste wider los gelassen wird
     {
        for (int i=0;i<schritte;i++)
         {
          pinMode(hardware[i].pin,OUTPUT);                             // Pin auf OUTPUT setzen
          hardware[i].vorlaufzeit*=1000;                               // Millisekunden zu Mikrosekunden
          hardware[i].dauer*=1000;                                     // Millisekunden zu Mikrosekunden
          hardware[i].dauer+=hardware[i].vorlaufzeit; 
      
          if (hardware[i].dauer>gesamtDauer)                           // Wenn vorlaufzeit + dauer > gesamtDauer
            {gesamtDauer=hardware[i].dauer;}                           // Dann Speichere vorlaufzeit + dauer in gesamtDauer
          }
       if (Lauf == 0)                                                  // Prüfen ob das programm Starten darf 
        {
          starttime=micros();                                          // Startzeit merken
          while (micros()-starttime<gesamtDauer)                       // so lange widerholen bis die Gesammte Dauer der Aktionen zeitmäßig vorbei ist
          {
            looptime=micros()-starttime;                               // Aktuelle verstrichene zeit im Loop 
            for (int i=0;i<schritte;i++)                               // Alle Aktionen durchgehen
            {
              if (looptime>=hardware[i].vorlaufzeit && looptime<hardware[i].dauer)
                digitalWrite(hardware[i].pin,HIGH);                    // Hardware EIN Schalten !!!!
              else  
                digitalWrite(hardware[i].pin,LOW);                     // Hardware Ausschalten !!!!
            }
          }
      
          // Nur zur Sicherheit nochmal alles abschalten
          for (int i=0;i<schritte;i++)
          {digitalWrite(hardware[i].pin,LOW);   }                      // Hardware Ausschalten !!!!
               Lauf = 1;                                               // Programm darf nicht widerholt werden.
       } 
      }
   }
}