Announcement

Collapse
No announcement yet.

hilfe zum empfangen über die Serielleschnittstelle

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • hilfe zum empfangen über die Serielleschnittstelle

    Hallo u. Guten Morgen ,
    ich bin neu in diesem Forum und auch ein absoluter beginner von C#!
    Ich kann zwar C aber eher im Mikrokontroller!
    Deswegen möchte ich mich schon im Vorfelt für meine Fragen endschuldigen !
    Zu meinem Problem ..
    Also ich möchte auf meinem PC folgende Structur über die SerielleSchnittstelle empfangen das geht auch. Mein Problemm ich empfange kriege meine Daten rein aber kann mit diesen Daten nichts anfangen da es sich um einen String handelt und ich nicht im stande bin aus dem string wider eine Structur anzufertigen !


    so siet meine Stuctur aus !
    [highlight=c#]
    public struct richart
    {
    public byte start; // 8 Bit auf dem Mikrokonntroller
    public byte adres; // 8 Bit auf dem Mikrokonntroller
    public byte comando; // 8 Bit auf dem Mikrokonntroller
    public int eine_nummer; // 8 Bit auf dem Mikrokonntroller
    public byte chksum; // 8 Bit auf dem Mikrokonntroller
    public byte ende; // 8 Bit auf dem Mikrokonntroller
    }

    private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
    {
    RxString = serialPort1.ReadExisting();
    ;
    }


    [/highlight]

    Danke für Eure Hilfe

    BigPier

  • #2
    Hallo,

    das Problem liegt vor allem darin, dass ein String unter NET mit Unicode arbeitet. Es gilt also nicht, dass 1 char gleich 1 byte ist. Du solltest deshalb eine andere Read-Methode benutzen, je nachdem passen Read(byte[]) oder ReadByte. Die erste Variante kannst Du vermutlich direkt auf Deine Bedürfnisse übertragen.
    Code:
    byte[] array = new byte[6];
    if (serialPort1.Read(array, 0, 6) == 6) {
       start = array[0];
       eine_nummer = (int)array[3];    //  vermutlich auch ohne (int)
    }
    Gruß Jürgen

    Übrigens gehören Bezeichner wie serialPort1 oder button7 verboten; da weißt nach spätestens zwei Wochen auch Du nicht mehr, wofür sie stehen.

    Comment


    • #3
      Danke für deine Antwort!
      Ich hab aber noch ein Problem das der Compiller meine Structur nicht erkennt sprich er unterstreicht reichart und giebt folgende fehlermeldung aus :

      Fehler 2 Für das nicht statische Feld, die Methode oder die Eigenschaft "WindowsFormsApplication1.Form1.richart.start" ist ein Objektverweis erforderlich.

      Was mach ich falsch ich hab doch die Structur so wie in meinemC# Buch beschrieben ist erstellt !

      Zu Deinem Tip bezüglich Namen hast du natürlich recht aber ich dachte hier im Forum ist es besser nachzufolziehen !!
      [highlight=c#]
      private void serialPort1_DataReceived(object sender,
      System.IO.Ports.SerialDataReceivedEventArgs e)
      {
      byte[] array = new byte[6];
      if (serialPort1.Read(array, 0, 6) == 6)
      {
      richart.start = array[0];//
      richart.eine_nummer = array[3];// vermutlich auch ohne (int)
      textBox1.Text = string.Format("{0:x2}", richart.start);
      textBox2.Text = string.Format("{0:x2}", richart.eine_nummer);
      }

      }
      [/highlight]

      Danke und bis später!

      Comment


      • #4
        Originally posted by BigPier View Post
        Ich hab aber noch ein Problem das der Compiller meine Structur nicht erkennt sprich er unterstreicht reichart und giebt folgende fehlermeldung aus :

        Fehler 2 Für das nicht statische Feld, die Methode oder die Eigenschaft "WindowsFormsApplication1.Form1.richart.start" ist ein Objektverweis erforderlich.
        Damit ist doch klar: reichart (oder richart) darf in Verbindung mit start nicht als Struktur verwendet werden, sondern benötigt ein eigenes Objekt:
        Code:
        richart art = new richart();
        ...
        art.start = array[0];
        Hier siehst Du auch gut die Vorteile der Richtlinien für Namen: Klassen, Strukturen und public Member werden groß geschrieben, private Member meistens klein.

        Gruß Jürgen

        Comment


        • #5
          Jürgen danke für deine Hilfe, ich bin leider noch nicht ganz vertraut mit dem Objekt orientiertem Programmieren ! Ich bitte um nachsicht ! ich werde mir auch gleich das mit den Richtlinien für Namen ansehen! Dennoch hab ich immer noch ein Problemm ich bekomme folgende Fehlermeldung

          Ungültiger threadübergreifender Vorgang: Der Zugriff auf das Steuerelement feld1 erfolgte von einem anderen Thread als dem Thread, für den es erstellt wurde.

          kann aber nichts damit anfangen da ich auf die besagten Textboxen nur von einer Stelle zugreife (Bahnhof)!

          Danke

          Gruß Pier

          Comment


          • #6
            Hallo Pier,

            Originally posted by BigPier View Post
            ich bin leider noch nicht ganz vertraut mit dem Objekt orientiertem Programmieren !
            Entschuldige, ich habe überlesen, dass Du "absoluter beginner" bist.

            Dennoch hab ich immer noch ein Problemm ich bekomme folgende Fehlermeldung

            Ungültiger threadübergreifender Vorgang...

            kann aber nichts damit anfangen da ich auf die besagten Textboxen nur von einer Stelle zugreife (Bahnhof)!
            Das verstehe ich auch nicht, da Du bisher überhaupt nichts von Textboxen geschrieben hast. Was machst Du denn noch so? Welcher Code führt zur Fehlermeldung? Hast Du mit Debugger gearbeitet, hast Du try-catch dafür verwendet? Jürgen

            PS. Als Einführung verweise ich vorsorglich auf openbook visual C#

            Comment


            • #7
              Folgender Code führt zur Fehlermeldung

              [highlight=c#]private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
              {

              richart test = new richart();
              if (serialPort1.Read(array, 0, 6) == 6)
              {
              test.start = array[0];
              test.eine_nummer = array[3]; // vermutlich auch ohne (int)

              textBox1.Text = string.Format("{0:x2}", test.start);
              textbox2.Text = string.Format("{0:x2}", test.eine_nummer);
              }

              }[/highlight]

              ich wollte mir die emfangenen Daten in eine textbox ausgeben
              sonst mach ich mit den Textboxen nichts !

              Danke Gruß Pier

              Comment


              • #8
                Dann habe ich den Verdacht, dass das Auslesen der Daten in einen separaten Thread oder BackgroundWorker erledigt werden soll. Jürgen

                Comment


                • #9
                  Der DataReceived Event wird in einem anderen Thread gefeuert.

                  Wenn du die GUI aus einem anderen Thread als dem GUI Thread updaten möchtest so mußt du das über die Invoke Methode des Controls machen.
                  Sieh dir mal Control.Invoke in der Hilfe an.

                  Comment


                  • #10
                    Danke Ralf, wieder etwas gelernt!
                    Originally posted by Ralf Jansen View Post
                    Der DataReceived Event wird in einem anderen Thread gefeuert.
                    Jürgen

                    Comment


                    • #11
                      Danke für Eure Hilfe !!

                      Comment

                      Working...
                      X