.net: Event oder Interrupt bei serieller Schnittstelle

Gast #1189922
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?
#1190142
Lesenswert?

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

4
//...
5

6
void serport_DataReceived(object sender, SerialDataReceivedEventArgs e) {
7
    SerialPort port = (SerialPort)sender;
8
    while (port.BytesToRead > 0) 
9
        ByteRecieved((byte)port.ReadByte());
10
}
11

12
private void ByteRecieved(byte data) {
13
    //...
14
}


greets
Gast #1190161
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
Gast #1190190
Lesenswert?

ReceivedBytesThreshold hatte ich auf 1 gesetzt.

so sah mein bisheriger Code aus:
1
        // Daten empfangen
2
        private void ReceiveData(object sender, SerialDataReceivedEventArgs e)
3
        {
4
            // Daten anzeigen?
5
            if (bShowRX_Data)
6
            {
7
                // Schnittstellenbuffer auslesen
8
                for (UInt16 i = 0; i <= cSerialInterface.BytesToRead; i++)
9
                {
10
                    // Daten zur Weiterverarbeitung übergeben
11
                    ShowData((byte) cSerialInterface.ReadByte());
12
                }
13
            }
14
            else
15
            {
16
                // Buffer leeren
17
                cSerialInterface.DiscardInBuffer();
18
            }
19
        }
#1190367
Lesenswert?

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

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:
1
while (cSerialInterface.BytesToRead > 0)
2
{
3
  ..
4
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren