Forum: PC-Programmierung serialport und .net (Bug oder was übersehen?)


von Thomas (Gast)


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

von Ralf (Gast)


Lesenswert?

Hi Thomas,

hast du den Hardware-Handshake deaktiviert? Passiert das direkt nach dem 
Öffnen des COM-Ports? Arbeitest du mit Events? Falls ja, sind die 
ständig am Feuern?

Ralf

von Thomas (Gast)


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

von Peter (Gast)


Lesenswert?

Was passiert wenn du das Hyperterminal mit den gleichen Parameter 
startest? Geht da auch die Systemlast hoch?

von Peter (Gast)


Lesenswert?

Da stimmt etwas nicht!!!!!!

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.

von Ralf (Gast)


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

von Thomas (Gast)


Lesenswert?

das ist richtig.

ich kann das Messgerät auch auf eine höhere Baudrate stellen
bei 19200 werden nur ca 30x pro sec übertragen.

das ändert aber nichts an der systemlast.

thomas

von Karl H. (kbuchegg)


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.

von Markus V. (Gast)


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

von Peter (Gast)


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.

von Markus V. (Gast)


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

von Johnny (Gast)


Lesenswert?

Ich würde auch mal auf die Events reagieren, bzw. die empfangenen Daten 
abholen und dann nochmals die CPU-Last prüfen. Bringt ja sonst eh alles 
nichts...

von Johnny (Gast)


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.

von Thomas (Gast)


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.

von Christian R. (supachris)


Lesenswert?

Oder einfach das Gerät bissl sinnvoller bauen, dass es nur auf Anfrage 
Daten sendet. Macht ja sonst kein Sinn, wenn eh keiner zuhört.

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.