C# SerialPort.Write nur alle 40ms

Gast #3679598
Lesenswert?

Hallo,

ich möchte mit C# Daten an die Serielle-Schnitstelle senden und von 
dieser empfangen. Prinzipell funktioniert senden und empfangen auch 
problemlos.
Ich habe eine Funktion SendFrame(...) diese sendet die in den Argumentan 
angegeben daten mit der Write-Funktion als Byte-Array und liest die 
Antwort der Hardware mit der Read-Funktion als Byte-Array zurück. Die 
Hardware sendet die Antwort binnen 2ms ab.
Ich möchte nun mit einer for-Schleife 16 Frames senden und die Antwort 
lesen.

Wenn ich mit dem Oszi auf die Datenleitungen schau, dann sehe ich das 
alle 40ms ein Frame gesendet wird und die antwort prompt innerhalb der 
2ms folgt.
Die Frage die sich mir jetzt stellt ist, woher kommt die 40ms Delay? Ich 
habe in meinem Programm nirgends eine Sleep oder sonstige Delay-Funktion 
eingebaut.

Kann es evtl. an der USB/COM-Brücke (FT232) liegen?
Gast #3679615
Lesenswert?

Moin,

die FTDIs benutzen den bulk data transfer mode vom USB. der ist leider 
als nicht Zeitkritisch eingestuft und wird als letztes durchgeführt, 
wenn noch andere Operationen am Bus anstehen.

da bist du mit 40ms gut dran ;)


grüße
Gast #3679633
Lesenswert?

nachtrag.

von FTDI gibts ein Tool zum auslesen vom eeprom. schau da mal nach, was 
für eine Buffergröße USB seitig benutzt wird (wenn das geht) und schreib 
den voll. vielleicht wirds dann schneller.

ich hab leider grad keinen Adapter zur Hand um zu schauen wo's steht und 
ob man den überhaupt einstellen kann.

Wenn das morgen noch keiner geschrieben hat, schau ich mal


Grüße
Gast #3680109
Lesenswert?

Hi ich weis nicht genau, ob es meine Antwort jetzt stimmt, aber könnte 
es sein, dass dein Betriebssystem dem Prozess/Thread während dem senden 
immer mal wieder die Rechenzeit entzieht? Oder verhinderst du das 
unterbrechen?
Gast #3680146
Lesenswert?

Marc O'Patrick schrieb:
> Hi ich weis nicht genau, ob es meine Antwort jetzt stimmt, aber könnte
> es sein, dass dein Betriebssystem dem Prozess/Thread während dem senden
> immer mal wieder die Rechenzeit entzieht? Oder verhinderst du das
> unterbrechen?

Klar kann das sein, aber da macht nur weinige ms aus, (außer das System 
läuft auf 100% cpu last)
Gast #3681361
Lesenswert?

Danke für die Antworten...

ich habe nun mittels der Stopwatch-Klasse mal die einzelen Codezeilen 
angesehen und festgestellt, dass ich noch von der Verwendung der 
Mainboard-Seriellen-Schnittstelle (kein USB-Teil) folgende Anweisung 
hatte:

mySerial.RtsEnable = true; // RS485 Driver to Listen-Mode

Diese macht eine Laufzeit von 20ms. Warum auch immer. Zweimal diese 
Anwesung erklärt die 40ms.

Ich muss jetzt mal probieren, ob dieses Delay auch auf der 
Mainbord-Schnittstelle auftriff.

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