Announcement

Collapse
No announcement yet.

C#: Das leidige Problem mit den HW-Schnittstellen (RS-232), wer kann helfen?

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

  • C#: Das leidige Problem mit den HW-Schnittstellen (RS-232), wer kann helfen?

    Ich habe mir den Artikel von "John Hint" bezüglich:

    Serial Comm
    Use P/Invoke to Develop a .NET Base Class Library for Serial Device Communications

    Siehe unter folgendem Link:

    http://msdn.microsoft.com/msdnmag/issues/02/10/netserialcomm/default.aspx

    vorgenommen und einige Versuche mit C# angestellt. Es scheint Grundsätzlich alles zu funktionieren. Ich kann senden und empfangen über die serielle Schnittstelle.

    Nun habe ich aber 1 Problem:
    ----> Die empfangenen Daten kann ich wohl darstellen in einer RichtTextBox, wie in seinem Beispiel aufgeführt. Dies nutzt mir aber wenig, denn ich möchte die empfangenen Daten in Form von Bytes direkt in ein Array einlesen z.B. in folgend deklariertes Array:

    <PRE><B>
    byte[] ReceivedBytes;
    int ByteCount = 0;
    </B></PRE>

    für die Weiterverwendung in meiner Anwendung. Wird ein Byte empfangen, dann erfolgt automatisch ein Aufruf von folgender Prozedur in BaseTerm.cs

    <PRE><B>
    protected override void OnRxChar(byte c)
    { </B>
    // Setzt sich über die vordefinierte Prozedur in CommBase.cs "OnRxChar(byte c)"
    // hinweg (d.h. überschreiben), um die empfangenen Bytes selbst zu verarbeiten.
    // Wird durchlaufen, wenn Zeichen empfangen wurden beziehungsweise sich noch
    // im Empfangspuffer befinden bis dieser leer ist.
    </PRE>
    <PRE><B>
    string s;
    bool nl = false;
    ASCII v = (ASCII)c;
    if (settings.charsInLine > 0)
    {
    nl = (++lineCount >= settings.charsInLine);
    }
    if (settings.breakLineOnChar) // Ist ein Linebreak Charakter definiert?
    if (v == settings.lineBreakChar) // Test ob Linebreak Charaktet anliegend?
    nl = true; // Linebreak Charakter ist anliegend
    if (nl)
    lineCount = 0;
    if (settings.showAsHex)
    {
    s = c.ToString("X2"); // In hexadezimaler Darstellung anzeigen
    if (!nl)
    s += " ";
    }
    else // Darstellung als ASCII-Wert
    {
    if ((c < 0x20) || (c > 0x7E))
    {
    s = "<" + v.ToString() + ">"; // ASCII-Wert in <> Klammer setzen
    }
    else
    {
    s = new string((char)c, 1); // Darstellbarer ASCII-Wert
    }
    }
    frm.ShowChar(s, nl); // Empfangene Byte als String formatiert anzeigen
    } // End of protected override void OnRxChar(byte c)
    </B></PRE>

    Am Ende erfolgt der Aufruf für die Darstellung der Empfangenen Bytes durch den Aufruf von

    <B><PRE>
    frm.ShowChar(s, nl); // Empfangene Byte als String formatiert anzeigen
    </B></PRE>

    in TermForm.cs

    Jedesmal wenn ich den Versuch starte, das Byte c vom Aufruf
    <B><PRE>
    OnRxChar(byte c)
    {
    ...
    ReceivedBytes[ByteCount++] = c;
    ...
    }
    </PRE></B>
    für meine Zwecke zu speichern, erfolgt ein Ausnahmefehler. Ich denke <B><PRE> OnRxChar(byte c) </B></PRE> ist der richtige Ort um die empfangenen Bytes abzufangen, oder habe ich einen
    Überlegungsfehler gemacht! Wer kann mir bei diesem Problem vielleicht weiterhelfen oder wer hat eine mögliche Lösung?
    <PRE></PRE>

    Mit freundlichen Grüssen<PRE></PRE>
    Roger Ramuz

  • #2
    Hallo,<br>
    vielleicht hilft dir das weiter!<br>
    <a href="http://www.opennetcf.org/forums/topic.asp?TOPIC_ID=212" target="_blank">Open NETCF Forums</a><br>Es ist zwar für das Compact Framework aber vielleicht nützlich!<br><br>mfg Seb

    Comment


    • #3
      Hallo Sebastian

      Herzlichen Dank für Deinen Tipp. Ich werde diesen Link "Open NETCF Forums" bei Gelegenheit mal anschauen. Vielleicht nützt er mir was.

      Mit freundlichen Grüssen<PRE></PRE>
      R. Ramu

      Comment


      • #4
        Anhang: Folgende System Exception erhalte ich während einer Übertragung nach einem Speicherversuch:
        <PRE><B>
        {"Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt." } System.Exception
        </B></PRE>

        Mfg Roger Ramu

        Comment


        • #5
          <B>Ergänzung zum obigen Haupt-Artikel:</B><BR>
          <BR>
          Ich möchte noch zusätzlich erwähnen, dass ich kompilierten Assemblercode, welcher auf einem PC gespeichtert ist (also eine Datei im Binärcode) auf ein PDP-11 Uralt-Rechner übertragen möchte. Die Übertragung sollte demnach 1:1 erfolgen. Der PDP-11 Rechner fordert die benötigte Datei vom PC an und kann darauf diese Datei empfangen. <BR>

          MfG Roger Ramu

          Comment


          • #6
            Hallo Sebastian<BR><BR>
            Herzlichen Dank für Deinen Tipp. Ich werde diesen Link "Open NETCF Forums" bei Gelegenheit mal anschauen. Vielleicht nützt er mir was.<BR><BR>

            Mit freundlichen Grüssen<BR>

            R. Ramu

            Comment


            • #7
              <B>An ALLE Interessierte</B>

              Wer den Quellcode beziehungsweise das ganze Projekt für eigene Versuche haben möchte, kann diesen als ZIP-Datei bei mir via E-Mail anfordern.

              Mailto:[email protected]

              Dies mit der Hoffnung, Antworten mit Deinen Erfahrungen zu erhalten.

              MfG Roger Ramu

              Comment


              • #8
                <B>An ALLE Interessierten</B>
                <P>Wer den Quellcode beziehungsweise das ganze Projekt für eigene Versuche haben möchte, kann diesen als ZIP-Datei bei mir via E-Mail anfordern.

                <P><B>Mailto: </B>[email protected]

                <P>Dies mit der Hoffnung, Antworten mit Deinen Erfahrungen zu erhalten.

                <P>Mit freundlichen Grüssen

                <P><B>Roger Ramuz</B>
                &#10

                Comment


                • #9
                  Zu dem Problem mit der Exception:
                  Die Anweisung
                  <PRE>
                  byte[] ReceivedBytes;
                  </PRE>
                  allein reicht nicht, man muss noch irgendwo (im Konstruktor z.B.)
                  <PRE>
                  ReceivedBytes = new byte[500];
                  </PRE>
                  machen, dann sollte die Exception verschwinden.
                  Mfg
                  Frank Hohman

                  Comment


                  • #10
                    Danke Frank Hohmann
                    <BR><BR>
                    Ich glaube Du hast recht. Ich werde es es demnächst mal versuchen.
                    <BR><BR>
                    Mit freundlichen Grüssen<BR>
                    Roger Ramu

                    Comment


                    • #11
                      Frank Hohmann
                      <BR><BR>
                      Zu dem Problem mit der Exception: Die Anweisung
                      <BR><BR>
                      byte[] ReceivedBytes;
                      <BR><BR>
                      allein reicht nicht, man muss noch irgendwo (im Konstruktor z.B.)
                      <BR><BR>
                      ReceivedBytes = new byte[500];
                      <BR><BR>
                      habe ich ausprobiert und hat bestens funtioniert - besten Dank.
                      <BR><BR>
                      MfG<BR><BR>
                      Roger Ramu

                      Comment

                      Working...
                      X