Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
COM - PC Datenaustausch, was verlangsamt das Programm?
csharpstarter
myCSharp.de - Member



Dabei seit:
Beiträge: 272

Themenstarter:

COM - PC Datenaustausch, was verlangsamt das Programm?

beantworten | zitieren | melden

Hallo,
habe einmal eine grundsätzliche Frage...
Ich habe eine Funktion, die über eine COM-Schnittstelle daten bekommt(Siehe CODE)
Gucke ich mir den Verkehr der Daten von PC -> µC und umgekehrt an, erfolgt die Ausgabe der Werte wesentlich schneller als in meinem geschriebenen Programm,...
Mit folgendem Code ist die Ausgabe in der Listbox wesentlich langsamer als im HyperTerminal, woran kann es liegen, was ist schuld?

Hoffe ihr habt Hilfe für mich!
Danke im Voraus!


    //Funktion: Empfang von µC
    private void PortSeriell_DataReceived(object sender, SerialDataReceivedEventArgs e)
    {
      wert = Convert.ToString(PortSeriell.ReadTo(";")); //PC liest Werte bis Zeichen ;
      wertbefehl = wert;                                //Umspeichern in wertbefehl

      //Startet der Wert mit : dann handelt es sich um einen Befehl
      if (wert.StartsWith(":"))
      {
        wertbefehl = wert.Trim(':'); //: wird weggeschnitten
        Give2lbx1(wertbefehl);       //Übergabe an Funktion
      }

     //Startet der Wert mit # dann handelt es sich um eine Position
      if (wert.StartsWith("#"))
      {
        wert = wert.Trim('#');        //# wird weggeschnitten
        Positionscheck1(wert);        //Übergabe an Funktion
      }
    }


    //Ausgabefunktion der empfangenen Werte
    private void Give2lbx1(string ausgabewert)
    {
      if (lbxAction.InvokeRequired)
      {
        Give2lbx stext = new Give2lbx(Give2lbx1);
        Invoke(stext, new object[] { ausgabewert });
      }
      else
      {
        //Auswahl: welcher Befehl ist eingegangen?
        switch (ausgabewert)
        {
          case "b":
            bewegung = "fahren vorwärts";
            break;

          case "d":
            bewegung = "fahren vorwärts STOPP";
            break;

          case "f":
            bewegung = "fahren rückwärts";
            break;

          case "h":
            bewegung = "fahren rückwärts STOPP";
            break;

          case "j":
            befehl[4] = 0; //unwichtig....
            bewegung = "Kamera vorwärts";
            break;

          case "l":
            befehl[5] = 0;
            bewegung = "Kamera vorwärts STOPP";
            break;

          case "p":
            befehl[7] = 0;
            bewegung = "Kamera rückwärts STOPP";
            break;

          case "n":
            befehl[6] = 0;
            bewegung = "Kamera rückwärts";
            break;

          case "r":
            befehl[8] = 0;
            bewegung = "Kamera rechts";
            break;

          case "t":
            befehl[9] = 0;
            bewegung = "Kamera rechts STOPP";
            break;

          case "v":
            befehl[10] = 0;
            bewegung = "Kamera links";
            break;

          case "x":
            befehl[11] = 0;
            bewegung = "Kamera links STOPP";
            break;
        }
        lbxAction.Items.Add(ausgabewert.ToString() + " von µC erhalten - " + bewegung);
        lbStatusMC.Text = bewegung;
      }
    }


 //Wird Position von µC erhalten, wird sie gleich wieder an diesen gesendet!
 private void Positionscheck1(string positionswert)
    {
        char[] position = new char[6]; //char-Array wird zum Senden an den µC angelegt

        position[0] = '#';
        position[5] = ';';

        for (int i = 1; i < 5; i++)
        {
          position[i] = positionswert[i - 1]; //Zusammenfügen zu einem char-Array
        }

        PortSeriell.Write(position, 0, 6);  //Zurücksenden an den µC
        string ausgabetext = new string(position);
        //Ausgabe der empfangenen und gesendeten Position
        lbxAction.Items.Add(positionswert + " von µC erhalten! ");
        lbxAction.Items.Add(ausgabetext + " an µC gesendet! ");
    }
private Nachricht | Beiträge des Benutzers
eurofreddy
myCSharp.de - Member



Dabei seit:
Beiträge: 24

COM-Daten empfangen

beantworten | zitieren | melden

Hallo,

ich tipp mal auf die delegate Funktion. Wieso brauchst du die eigentlich ? Hast ja nicht mit Thread's gearbeitet ?!

du solltest einen Empfangsthread programmieren der die Schnittstelle für den Empfang von Daten schnell wieder frei macht. Um das ganze zu testen kannst du ja mal einen Counter nach dem Empfangen setzen und die zwei Funktionsaufrufe auskommentieren, wenn deine Einstellungen für die COM-Schnittstelle dann stimmen muss es genau so schnell sein wie im Hyperterminal.

Gruß Euro
private Nachricht | Beiträge des Benutzers
norman_timo
myCSharp.de - Member

Avatar #avatar-1775.jpeg


Dabei seit:
Beiträge: 4.506
Herkunft: Wald-Michelbach (Odw)

beantworten | zitieren | melden

Hallo eurofreddy,
Zitat
ich tipp mal auf die delegate Funktion. Wieso brauchst du die eigentlich ? Hast ja nicht mit Thread's gearbeitet ?!

das ist für mich so aus dem Programmausschnitt nicht ersichtlich. Aber es ist meines Erachtens hier definitiv nicht verkehrt, daas Ganze Thread-Safe zu gestalten.

Hallo csharpstarter,

ich würde blind tippen, dass es an dem Invoke liegt. Probiere mal das mit einem BeginInvoke zu ersetzen. Ansonsten wartet die Ausgabe jedes mal auf Windows, bis es endlich mal bereit ist in dem Kontext das Fenster zu aktualieseren.

Grüße
Norman-Timo
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
private Nachricht | Beiträge des Benutzers
eurofreddy
myCSharp.de - Member



Dabei seit:
Beiträge: 24

beantworten | zitieren | melden

Hallo norman_timo,

für mich stellt sich immer noch die Frage warum er mit Delegate-Funktionen arbeitet, wenn er keine Thread's benutzt ?! Zumindest sehe ich davon nix :-)

Gruß Euro.
private Nachricht | Beiträge des Benutzers
csharpstarter
myCSharp.de - Member



Dabei seit:
Beiträge: 272

Themenstarter:

beantworten | zitieren | melden

Also mal grundsätzlich,

pro sekunde bekomme ich 10 Positionen von dem µC
Werte kommen mit #
weiters kommen pro Sekunde ca. 5 Befehle...
Werte mit :

Wie würdet ihr das Lösen?
private Nachricht | Beiträge des Benutzers
Andreas.May
myCSharp.de - Member

Avatar #avatar-2474.gif


Dabei seit:
Beiträge: 915

beantworten | zitieren | melden

Hrm, ich glaube das es nicht unbedingt nur am delegate liegt.

Die Frage die ich mir stelle wie lange braucht dieser Abschnitt?


PortSeriell.Write(position, 0, 6);

Und was macht befehl[4],befehl[5] usw..?
Führt das Kommandos aus?
Wie vernichtet stand Andreas unter den flammenden Augen seiner Kunden.
Ihm war's, als stünde des Schicksals dunkle Wetterwolke über seinem Haupte X(
private Nachricht | Beiträge des Benutzers
svenson
myCSharp.de - Member



Dabei seit:
Beiträge: 8.746
Herkunft: Berlin

beantworten | zitieren | melden

Ich vermute auch stark, dass das Invoke der Verursacher sein könnte.
private Nachricht | Beiträge des Benutzers
norman_timo
myCSharp.de - Member

Avatar #avatar-1775.jpeg


Dabei seit:
Beiträge: 4.506
Herkunft: Wald-Michelbach (Odw)

beantworten | zitieren | melden

Hallo csharpstarter,
Zitat
Wie würdet ihr das Lösen?

also wenn svenson die selbe Vermutung hat wie ich, dann potenziere ich den Wahrheitsgrad meiner Aussage und frage einfach mal:

hast Du schon den Austausch mit BeginInvoke probiert?

@svenson:
Oder meinst Du, dass man hier generell auf das Thread-Safe Modell verzichten solle?

Grüße
Norman-Timo
A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”
private Nachricht | Beiträge des Benutzers