Arduino <-----> GUI langsam?

Hey hey,

vielleicht hat jemand Erfahrungen oder eine Idee, wie ich mein Problem lösen kann.

Habe eine GUI erstellt und möchte nun ein Datenaustausch zwischen mein Atmega328p und dem Programm herstellen.
Funktioniert soweit einwandfrei. Zum testen ist es auf jeweils 1 Byte senden und 1 Byte empfangen beschränkt.

Senden vom PC erfolgt sehr gut und ohne Probleme.
Nur das Empfangen ist extrem langsam. Taste drücken ---- 2sec --- und dann ist es erst auf dem PC sichtbar umgesetzt.

Settings: baud 9600
prolific USB-to-Serial Comm Port
Atmega328p 16Mhz

Quellcode(Testprogramm) :

int aktoren[]= {5, 6, 7};

byte toGUI=0;
int zustand[8];
byte GUI;

int tsens1= 0;
int tsens2= 1;

int temp1= 0;
int temp2= 0;


void setup() {
  
  Serial.begin(9600);
  for(int x=0; x<3; x++) {
    pinMode(aktoren[x], OUTPUT);
    digitalWrite(aktoren[x], HIGH);
  }
  pinMode(9, INPUT);
  digitalWrite(9, HIGH);
  
}

void loop() {
  
  if( Serial.available()>0) {
    
      GUI = Serial.read();
    }
    
    if(!digitalRead(9)) {
      bitSet(toGUI, 2);
    }
    else {
      bitClear(toGUI, 2);
    }
    
 temp();
 relays();
 
 Serial.write(toGUI);
}



void temp() {
  
  temp1 = analogRead(tsens1);
   temp2 = analogRead(tsens2);
  
  if(temp1 >= 10) {
    bitSet(toGUI, 0);
  }
  else {
    bitClear(toGUI, 0);
  }
  
  if(temp2 >= 10) {
    bitSet(toGUI, 1);
  }
  else {
    bitClear(toGUI, 1);
  }
}



void relays() {
  
 for(int i= 0; i<8; i++) {
    zustand[i] = bitRead(GUI, i);
    
  }
 for(int i= 0; i<3; i++) { 
    if(zustand[i] == 1) {
     digitalWrite(aktoren[i], LOW);
    } 
   else{
    digitalWrite(aktoren[i], HIGH);
   }
 }
}

[EDIT] Du solltest CODE-Tags für den Sketch verwenden und nicht QUOTE Tags. Uwe [/EDIT]

piaggi0:
Nur das Empfangen ist extrem langsam. Taste drücken ---- 2sec --- und dann ist es erst auf dem PC sichtbar umgesetzt.

Settings: baud 9600

Mit welcher Datenrate sendet der PC Bytes an den Arduino?

An Deiner loop-Funktion fällt mir auf, dass sie mit Höchstgeschwindigkeit Bytes an den PC sendet, also bei 9600 Baud immer 960 Zeichen pro Sekunde.

Verarbeitet Dein PC auch 960 Bytes pro Sekunde?
Oder verarbeitet Dein PC die Bytes langsamer als sie vom Arduino eintreffen und baut eine lange Warteschlange in seinem seriellen Eingangspuffer auf?

Falls die PC GUI weniger als 10 Bytes pro Sekunde an den Arduino sendet:
Lasse den Arduino mal probeweise langsamer zurück senden, z.B. nur 10 Bytes pro Sekunde, etwa indem Du testweise ein "delay(100)" mit in die loop einbaust.

Oder falls die PC GUI mehr als 10 Bytes pro Sekunde an den Arduino sendet, lasse den Arduino in der loop immer nur dann etwas an den PC zurücksenden, wenn auch vorher der PC ein Byte an den Arduino gesendet hat.

Ergibt das einen Unterschied, wenn der Arduino weniger Zeichen pro Sekunde sendet?

Vielleicht wäre es sinnvoll, wenn Du uns den GUI-Code auch zeigen würdest. Meine Vermutung ist, dass Du dort (auf dem PC) die Daten der seriellen Schnittstelle in einem Puffer empfängst und das lesende Programm kriegt dann nur von Zeit zu Zeit etwas davon mit. Aber ohne den Sourcecode ist das natürlich nur geraten.

Vielen Dank für die Antworten.

Es lag nun wirklich an der Verarbeitungszeit des GUI, ein delay in der loop() hat das Problem gelöst.

Nun funktioniert alles super, wäre doch nun das aber nicht :~

Habe ein Relaisboard dran, nur bei dem Relais wo die Pumpe angeschlossen ist hängt sich der Chip beim abschalten auf und ich muss ihn resetten.

piaggi0:
Habe ein Relaisboard dran, nur bei dem Relais wo die Pumpe angeschlossen ist hängt sich der Chip beim abschalten auf und ich muss ihn resetten.

Und das ist eine 230V Pumpe, und wenn du statt dessen eine Glühbirne schaltest, gehts gut ?
Da wirst du hier viele "Finger weg" Ratschläge kriegen anstelle von Leitungsführung, Entstörkondensatoren und "Snubber" - Tips. Starte besser einen neuen Faden.