www.mikrocontroller.net

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


Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus V. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus V. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht 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.

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.