Laden...

COM - PC Datenaustausch, was verlangsamt das Programm?

Erstellt von csharpstarter vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.200 Views
C
csharpstarter Themenstarter:in
272 Beiträge seit 2007
vor 16 Jahren
COM - PC Datenaustausch, was verlangsamt das Programm?

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! ");
    }

E
24 Beiträge seit 2006
vor 16 Jahren
COM-Daten empfangen

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

4.506 Beiträge seit 2004
vor 16 Jahren

Hallo eurofreddy,

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!”

E
24 Beiträge seit 2006
vor 16 Jahren

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.

C
csharpstarter Themenstarter:in
272 Beiträge seit 2007
vor 16 Jahren

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?

915 Beiträge seit 2006
vor 16 Jahren

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(

S
8.746 Beiträge seit 2005
vor 16 Jahren

Ich vermute auch stark, dass das Invoke der Verursacher sein könnte.

4.506 Beiträge seit 2004
vor 16 Jahren

Hallo csharpstarter,

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!”