serialport und .net (Bug oder was übersehen?)

Gast #1161554
Lesenswert?

Hallo,
Ich habe folgenden Effekt, den ich nicht nachvollziehen kann:

Ich habe ein Messgerät, das 60 mal pro sec seinen Messwert über die 
serielle Schnittstelle rausschickt. Jedes mal 60 Zeichen. Also eine ganz 
schöne Menge.

in VB.net habe ich den serialport nur geöffnet.

 SerialPort1.PortName = "COM2"
 SerialPort1.BaudRate = 19200
 SerialPort1.DataBits = 7
 SerialPort1.Parity = IO.Ports.Parity.Even
 SerialPort1.StopBits = IO.Ports.StopBits.One
 SerialPort1.Open()


mehr nicht.

Sobald ich diesen Code ausführe, steigt meine Systemlast von 2% sofort 
auf 75-80%. ziehe ich das serielle Kabel ab, sinkt die Last wieder auf 
2%.
Stecke ich das Kabel wieder an, dann geht die Last wieder hoch.

Ist das normal oder habe ich was übersehen?

Mein PC ist schon eine flotte Kisten mit 2 GB Ram.
Wenn ich den Port nicht mit dem Microsoft.serialport öffne, sondern über 
API mit CreateFile, dann tritt dieser Effekt nicht auf.

Vieleicht hat ja jemand eine Idee dazu.
Thomas
Gast #1161571
Lesenswert?

hallo,

ich verwende keine Events (vorerst)

der oben angeführte Code ist alles.
ich öffne nur den Port und schon schnellt die systemlast rauf.

Es gibt auch keinen Handshake. die serielle Leitung hat nur 3 Drähte 
(RX,TX und Ground (2,3,5)

thomas
Gast #1161605
Lesenswert?

> 60mal 60Zeichen mit 7Bit sind 25.000bit/sekunde. Das kann nie mit
> 19200baud gehen, es kommt ja noch die Start und Stop und Parität dazu.
Stimmt, insgesamt sind das 36.000 Bits, da passt was nicht.

Ralf
#1161684
Lesenswert?

Thomas wrote:
> hallo,
>
> ich verwende keine Events (vorerst)
>
> der oben angeführte Code ist alles.
> ich öffne nur den Port und schon schnellt die systemlast rauf.
>

Ich würd mal sagen: Das ist wohl ziemlich normal.
Deine Daten, die über die Schnittstelle reinkommen, triggern im .Net 
Framework irgendwelche Aktionen. Selbst wenn dein Programm keine Events 
zum Abholen der Daten benutzt, muss es ja schliesslich im .Net Code 
geben, der sich die Daten von der Schnittstelle holt um dann 
rauszufinden, dass sie eh keinen (zumindest keinen Event) interessieren.
Und das ist dann der Code, der dir die Systemlast erzeugt.

Willkommen in der wunderbaren Welt von .Net, in der der Programmierer 
immer mehr die Kontrolle darüber verliert, was in der Maschine 
eigentlich so alles abgeht.
Gast #1161975
Lesenswert?

@Thomas:
IMO könnte das Problem daran liegen, daß Du den SerialPort nur öffnest 
aber nicht ausliest und dadurch das .NET-Framework zwingst, pro Sekunde 
1800 Zeichen (bei 19200 Baud) zu puffern. Es wird dafür gesorgt, daß 
keine Daten verloren gehen. Dabei wird laufend mehr Speicher allokiert 
und mit hoher Wahrscheinlichkeit auch laufend umkopiert, eine mögliche 
Erklärung für Deine CPU-Last. Hast Du nach ein paar Sekunden (Minuten) 
mal das Property BytesToRead ausgelesen?

Grüße
Markus
Gast #1161982
Lesenswert?

Ich kann mir kaum vorstellen, das das .net Framework selber daten 
buffert. Normalerweise sollten die .net funktionen fast 1 zu 1 auf die 
WindowsApi gehen.

Auch bei 1800 byte/sekunde sollte ein aktueller Rechner mit 2ghz nicht 
ins schwitzen kommen.

mal ein eine kleine Schleife die die Daten auch aussliest und sage ob 
sich dann etwas ändert.
Gast #1161998
Lesenswert?

> Ich kann mir kaum vorstellen, das das .net Framework selber daten
> buffert. Normalerweise sollten die .net funktionen fast 1 zu 1 auf die
> WindowsApi gehen.
Dann lies mal die Doku...

Markus
Gast #1174964
Lesenswert?

P.S. Übrigens erkennt Windows beim Bootvorgang ein dauernd sendendes 
Gerät schnell mal als serielle Maus. Das sollte noch bedacht werden, 
falls plötzlich der Mauszeiger umherspringt und alles angecklickt wird.
Gast #1175901
Lesenswert?

Hallo,
Also ich hab alles versucht, was das Serialport bietet, um die Daten zu 
lesen. es geht ja auch alles ohne Fehler, aber die systemlast bleibt.
verwende jetzt die Serialport-driver von National Instruments.

Jetzt ist meine Systemauslastung bei 8% . damit kann ich leben.

@Johnny
Ich weiß, schaut auch total verrückt aus, wenn wie durch Geisterhand 
Fenster auf und zugehen. Ich hoffe dann immmer das nichts gelöscht wird.
Aber sobald der PC das erste Mal eine "serielle Maus" erkannt hat, diese 
einfach in der systemsteuerung deaktivieren, dann tritt der Effekt nicht 
mehr auf.

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