ich habe mir ein kleines, serielles Menü gebastelt was immer bei einer seriellen Verbindung ausgegeben wird.
Trennt man die Verbindung und stellt sie wieder her dann legt es von neuem los.
Allerdings stürtzt mir der µC irgendwann sporadisch ab.
Im Code-Block ist nur der relevante Teil, das Menü, in der Loop:
void loop(){
Menue=0;
bool ser=Serial;
char input[2]; byte i=0;
if(!ser)Menue=0;
if(ser){
Serial.begin(9600);
if(!Menue)Menue=1;
if(Menue==1){
Serial.println(F("Begrüßungszeile 1"));
Serial.println(F("Begrüßungszeile 2"));
Serial.println(F("---------------------------"));
Serial.println(F("Bitte geben Sie die Stunde,"));
Serial.println(F("Minute und Sekunde ein (HHMMSS)"));
Menue=2;
}
if(Menue==3){
Serial.print(F("Stunde wurde gesetzt: "));Serial.println(Stunde);
Menue=4;
}
if(Menue==5){
Serial.print(F("Minute wurde gesetzt: "));Serial.println(Minute);
Menue=6;
}
if(Menue==7){
Serial.print(F("Sekunde wurde gesetzt: "));Serial.println(Sekunde);
Serial.println();
T3=0;
while(Serial.available())i=Serial.read();
Menue=0;
}
if(Serial.available()){
while(Serial.available()&&i<2){input[i++]=Serial.read();}
if(Menue==2){Stunde=atoi(input);Menue=3;}
if(Menue==4){Minute=atoi(input);Menue=5;}
if(Menue==6){Sekunde=atoi(input);Menue=7;}
}
Serial.end();
}
}
Kann es sein, das die ständigen Abfragen von Serial in der Loop den µC zum Absturtz bringen?
Unter anderem läuft noch eine IR-Decodierung welche via TWI zu einem anderen µC gesendet werden.
Wieso machst du Serial.begin() und Serial.end() in loop()? Das hat da nichts verloren. Einmal begin() in setup() und gut ist
Die serielle Einlese-Routine ist auch etwas merkwürdig. Normal nimmt man LF oder CR als Endzeichen. Dann liest man alles bis dahin in ein char Array ein, terminierst dieses und bearbeitet dann den String. So kann man z.B. "12:34:56" ein einem Stück übertragen. Und das ohne auf irgendwas zu warten
const int SERIAL_BUFFER_SIZE = 10;
char serialBuffer[SERIAL_BUFFER_SIZE];
void setup()
{
Serial.begin(9600);
}
void loop()
{
if (readSerial(Serial) == true)
{
byte hours = atoi(strtok(serialBuffer, ":"));
byte minutes = atoi(strtok(NULL, ":"));
byte seconds = atoi(strtok(NULL, ":"));
Serial.println(hours);
Serial.println(minutes);
Serial.println(seconds);
Serial.println();
}
}
bool readSerial(Stream& stream)
{
static byte index;
while (stream.available())
{
char c = stream.read();
if (c >= 32 && index < SERIAL_BUFFER_SIZE - 1)
{
serialBuffer[index++] = c;
}
else if ((c == '\n' || c == '\r') && index > 0)
{
serialBuffer[index] = '\0';
index = 0;
return true;
}
}
return false;
}
readSerial() liefert true wenn der String komplett eingelesen wurde. So kann man mit einem Zustandsautomaten z.B. eine Eingabe-Aufforderung senden und dann solange in einem "Warte"-Zustand verweilen bis die Antwort da ist.
ich habe mir ein kleines, serielles Menü gebastelt was immer bei einer seriellen Verbindung ausgegeben wird.
Trennt man die Verbindung und stellt sie wieder her dann legt es von neuem los.
Allerdings stürtzt mir der µC irgendwann sporadisch ab.
Im Code-Block ist nur der relevante Teil, das Menü, in der Loop:
void loop(){
Menue=0;
bool ser=Serial;
char input[2]; byte i=0;
if(!ser)Menue=0;
if(ser){
Serial.begin(9600);
if(!Menue)Menue=1;
if(Menue==1){
Serial.println(F("Begrüßungszeile 1"));
Serial.println(F("Begrüßungszeile 2"));
Serial.println(F("---------------------------"));
Serial.println(F("Bitte geben Sie die Stunde,"));
Serial.println(F("Minute und Sekunde ein (HHMMSS)"));
Menue=2;
}
if(Menue==3){
Serial.print(F("Stunde wurde gesetzt: "));Serial.println(Stunde);
Menue=4;
}
if(Menue==5){
Serial.print(F("Minute wurde gesetzt: "));Serial.println(Minute);
Menue=6;
}
if(Menue==7){
Serial.print(F("Sekunde wurde gesetzt: "));Serial.println(Sekunde);
Serial.println();
T3=0;
while(Serial.available())i=Serial.read();
Menue=0;
}
if(Serial.available()){
while(Serial.available()&&i<2){input[i++]=Serial.read();}
if(Menue==2){Stunde=atoi(input);Menue=3;}
if(Menue==4){Minute=atoi(input);Menue=5;}
if(Menue==6){Sekunde=atoi(input);Menue=7;}
}
Serial.end();
}
}
Kann es sein, das die ständigen Abfragen von Serial in der Loop den µC zum Absturtz bringen?
Nein, ich hätte da eher den Affenkram in Verdacht, dass Dein Sketch ständig Serial.end() und Serial.begin() aufruft.
Gerade beim 32U4 Controller, wo Serial über eine USB CDC Serial Treiberverbindung zum PC läuft, kann ein Serial.begin(9600); nicht in quasi Nullzeit ablaufen, sondern beansprucht eine gewisse Zeit, während der komplexe Vorgänge zwischen dem 32U4 und dem CDC-Serial-Treiber auf dem PC ablaufen.
Gerade dann, wenn Du noch weitere interruptgesteuerte Funktionen wie den Empfang von IR-Signalen auf dem Controller laufen hast, würde ich dringend auf eine Programmlogik verzichten, die im Sketch ständig Serial.end() und Serial.begin() im stetigen Wechsel ausführt. Das wäre eher mein Verdacht, dass das ständige Serial.end() und Serial.begin() zusammen mit den Interrupts vom IR-Empfang das System zum Hängen bringt.
An so was dachte ich auch schon. Anfangs hatte ich auch Serial.begin() nur im Setup drin und kein Serial.end().
Habe das ganze nun mit Serial.available gelöst. Nach dem man die serielle Verbindung mit dem seriellen Monitor aufgebaut hat muss man nur irgend ein oder irgend welche Zeichen senden wodurch das Menü dann aktiviert und angezeigt wird. Ist das Menü durch muss man es entsprechend wieder aktivieren.