mit Serial.read eine Funktion aufrufen und nur einmal ausführen

Hallo,

ich möchte gerne mit Serial.read eine selbstgeschriebene Funktion aufrufen und nur einmal ausführen.
Bisher habe ich es nur geschafft, in void loop diese Funktion immer wieder aufzurufen. Brauche ich einen Interrupt dafür?

int PWM = 100;
int PWMMax = 0;
int Daten;
boolean Abfahren = false;

float U;
float I;
float P = I*U;
float Pmax = 0;

void setup()
{
  Serial.begin(9600);
}

void Kennlinie(void)
{
  for (PWM=1010; PWM>0; PWM=PWM-10){
  U = analogRead(0);
  I = analogRead(2);
  P= U*I;
  if (P > Pmax){Pmax = P;
                    PWMMax = PWM;}                 
  }
  Serial.print("Pmax = ");
  Serial.print(Pmax);
  Serial.print("      ");
  Serial.print("PWMMax =");
  Serial.print(PWMMax); 
  Abfahren = false; 
}

void loop()
{  
  if (Serial.available() > 0){ // überprüfe eingehende Daten
    Daten = Serial.read(); // auslesen der Seriellen Schnittstelle
  } 
  if (Daten == 'k'){
    Abfahren=true;} // Kennlinie abfahren mit k
  if (Abfahren){Kennlinie();}

Das ist kein Sketch, das ist nur eine Funktion. Poste immer vollständigen Code, dieser Schnipsel nützt uns für die Beantwortung Deiner Frage gar nichts.

Brauche ich einen Interrupt dafür?

Nein. Wenn ich Deine Frage nicht vollkommen falsch verstanden habe, dann musst Du "nur" den Eingang der seriellen Schnittstelle parsen und ggfs. die von Dir gewünschte Funktion aufrufen.

  if (Daten == 'k'){
    Abfahren=true;} // Kennlinie abfahren mit k

Da ist dein Fehler:

Daten bleibt == 'k' wenn kein weiterer Buschstabe kommt, damit startest du wieder deine Funktion.
( Den Merker "Abfahren" kannst du dir sparen und statt dessen gleich in loop Daten = 0 setzen, oder so.

void loop()
{  
  if (Serial.available() > 0)
  {
    char c = Serial.read(); 
 
    if(c == 'k')
       kennlinie();
  }
}

Hallo,
hier "RunAction" von "guntherb"
http://forum.arduino.cc/index.php?PHPSESSID=78ab2ggrstgofkr85om05hbmi5&topic=212782.msg1560071#msg1560071
Gruß und Spaß
Andreas

Danke Serenify,

dein Code funktioniert. Auf den ersten Blick war mir nicht klar was ich falsch mache.
Aber es ist die Klammersetzung :smiley:

void loop()
{  
  if (Serial.available() > 0)
  {
    char c = Serial.read(); 
 
    if(c == 'k')
       kennlinie();
  }
}

Wie oben gesagt, du hast dir immer den Zustand der letzten Eingabe abgespeichert. Dadurch wurde das natürlich mehrmals ausgeführt.