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


von Gast (Gast)


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?

von Chris .. (dechavue)


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

von Ralf (Gast)


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

von Gast (Gast)


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
        }

von Severino R. (severino)


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
}

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.