mySerial.available() bringt Programm zum aufhängen.

moin,
in meinem Programm() frage ich ein paar mal “if (mySerial.available())” ob Daten zum Auslesen verfügbar sind. Wenn Daten ausgelesen wurden, bleibt nachher das Programm hängen.
kann das sein das “mySerial.available()” , das mit Interrupt arbeitet (nehme ich an), irgendwas deaktiviert , das das Weiterlaufen meines Programms verhindert.
wie kann man das beheben.
Anbei mein Programm
danke im Voraus

#include <RFID.h>
#include<Drehrichtung.h>
#include <LiquidCrystal.h>
#include <SoftwareSerial.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 7);
SoftwareSerial mySerial(10, 12); // RX, TX
RFID  RFID(6);
Motor Motor (A0, A1, A2);
enum State_enum {Abfrage, Rfid_Sw_Hw, Rfid, Motorsensoren, Ir};
byte zustand = Abfrage ;
int Sw;
int Hw;
bool a, b, c;

void setup()
{
  Serial.begin(115200);
  lcd.begin(16, 2);
  mySerial.begin(1200);
}
void loop()
{
  States();
}

int States() {
  switch (zustand) {
    case Abfrage:
    if ( mySerial.available())
      {
        lcd.setCursor(14, 0);
        lcd.print("Ir");
        lcd.setCursor(14, 1);
        lcd.print(telegramm());
      }
      Sw = RFID.Get_Hw_Version();
      Hw = RFID.Get_Hw_Version();
      a=digitalRead(A0);
      b=digitalRead(A1);
      c=digitalRead(A2);      
      if ((Sw > 0 && Hw > 0))
        zustand = Rfid_Sw_Hw;
      else if (a||b||c) 
        zustand = Motorsensoren;    
      Serial.println("Abfrage");
      break;

    case Rfid_Sw_Hw:
      Serial.println("Rfid_Sw_Hw");
      lcd.begin(16, 2);
      lcd.setCursor(0, 0);
      lcd.print("HW:");
      lcd.setCursor(0, 1);
      lcd.print("SW:");
      lcd.setCursor(3, 0);
      lcd.print(Hw, HEX);
      lcd.setCursor(3, 1);
      lcd.print("ACv");
      lcd.print(Sw, HEX);
      zustand = Rfid;
      delay(1);
      break;

    case Rfid:
      PrintBlocks();
      break;

    case Motorsensoren:
      Serial.println("Motor");
      lcd.setCursor(3, 0);
      lcd.print("H1");
      lcd.setCursor(6, 0);
      lcd.print("H2");
      lcd.setCursor(9, 0);
      lcd.print("H3");
      Print_Motor_Infos();
      a=digitalRead(A0);
      b=digitalRead(A1);
      c=digitalRead(A2);
      if (!(a||b||c))
      zustand=Abfrage;
      break;
  }
}

Das Auslesen selbst fehlt natürlich

Die kannst mal AltSoftSerial probieren. Das arbeitet mit einem Timer, wodurch es wesentlich zuverlässiger ist:
https://www.pjrc.com/teensy/td_libs_AltSoftSerial.html

Serenifly:
Das Auslesen selbst fehlt natürlich

Die kannst mal AltSoftSerial probieren. Das arbeitet mit einem Timer, wodurch es wesentlich zuverlässiger ist:
AltSoftSerial Library, for an extra serial port

wie kann man denn mit dem AltSoftSerial angeben, welcher pin man verwendet?

Les die die Seite genauer durch. Durch den Timer sind die Pins fest vorgegeben. Die Pin Belegung steht unter dem ersten Bild

  • ergänze Serial.Print Ausgaben zum Debuggen, damit du weist wie weit dein Programm kommt
  • was macht telegramm() ?

kann das sein das "mySerial.available()" , das mit Interrupt arbeitet (nehme ich an), irgendwas deaktiviert , das das Weiterlaufen meines Programms verhindert.

Wie kommst du auf die Idee?
Weil dein Programm perfekt ist?

Ich bin jetzt nicht so wirklich der Fan von Soft/Alt Serial und vergleichbaren...
Aber SoftwareSerial::available() hat bei mir noch nie versagt.
Ja, ich denke, wenn das defekt wäre, dann hätten wir hier das schon öfter gehört.

wie kann man das beheben.

KA, sehe ja noch nicht mal das Problem!

Anbei mein Programm

Welches leider so nicht testbar ist.

Übliche Stellen, wo sich der Fehler versteckt:

  1. nicht in dem, was gezeigt wird.
  2. in dem Bereich, welcher geheim gehalten wird.
  3. meistens da, wo er nicht vermutet wird. (denn sonst hättest du ihn ja schon)
  4. meistens sitzt die am schwersten zu korrigierende Fehlerquelle vor dem Monitor
  5. der Weg in die Hölle ist mit falschen Annahmen gepflastert

Immer wieder gerne gesehen:

  1. Testbares Programm
  2. Reduziert auf ein Minimum
    Oft stellt sich dabei schon raus, dass der Fehler dort steckt, wo man NIE danach gesucht hätte