www.mikrocontroller.net

Forum: PC-Programmierung .net: Event oder Interrupt bei serieller Schnittstelle


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich habe früher mit dem MSCOMM Steuerelement unter VB 6.0 
gearbeitet. Die Empfangsroutine des Steuerlements wurde bei jedem 
ankommeneden Byte aufgerufen. Unter .net wird nun einmalig ein Event 
ausgelöst und dann nichts mehr. Erst wenn ich alle angekommen Bytes 
gelesen habe, wird wieder ein neues Event ausgelöst.
Kennt jemand eine Möglichkeit wenn ein Byte ankommt ein Interrupt 
ausgelöst wird?

Autor: Chris ... (dechavue)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt kein Event, welches bei jedem Byte aufgerufen wird, aber sowas 
ist in wenigen Zeilen selbst gemacht:
SerialPort serport = new SerialPort();
port.DataReceived += serport_DataReceived;

//...

void serport_DataReceived(object sender, SerialDataReceivedEventArgs e) {
    SerialPort port = (SerialPort)sender;
    while (port.BytesToRead > 0) 
        ByteRecieved((byte)port.ReadByte());
}

private void ByteRecieved(byte data) {
    //...
}


greets

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Unter .net wird nun einmalig ein Event ausgelöst und dann nichts mehr.
> Erst wenn ich alle angekommen Bytes gelesen habe, wird wieder ein neues
> Event ausgelöst.
Gibts da nicht irgendeinen Threshold-Wert o.ä. welcher bestimmt, ab 
wievielen Zeichen im Buffer ein Receive-Event ausgelöst wird?

Ralf

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ReceivedBytesThreshold hatte ich auf 1 gesetzt.

so sah mein bisheriger Code aus:
        // Daten empfangen
        private void ReceiveData(object sender, SerialDataReceivedEventArgs e)
        {
            // Daten anzeigen?
            if (bShowRX_Data)
            {
                // Schnittstellenbuffer auslesen
                for (UInt16 i = 0; i <= cSerialInterface.BytesToRead; i++)
                {
                    // Daten zur Weiterverarbeitung übergeben
                    ShowData((byte) cSerialInterface.ReadByte());
                }
            }
            else
            {
                // Buffer leeren
                cSerialInterface.DiscardInBuffer();
            }
        }

Autor: Severino R. (severino)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gast wrote:
> ReceivedBytesThreshold hatte ich auf 1 gesetzt.
>
> so sah mein bisheriger Code aus:
       for (UInt16 i = 0; i <= cSerialInterface.BytesToRead; i++)
       {
          ..
       }

Nimmt BytesToRead nicht mit jedem ReadByte() ab?
i   BytesToRead
---------------
0    5
1    4
2    3
3    2
--> jetzt wird der Loop verlassen, obwohl noch 2 Bytes zu lesen sind.

Besser wäre wohl:
while (cSerialInterface.BytesToRead > 0)
{
  ..
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.