mikrocontroller.net

Forum: PC-Programmierung COM1 blockierendes Lesen und Schreiben


Autor: digit (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wie ich ergoogelt habe, gibt es dazu die Funktion

"SetCommTimeouts"

mit

“COMMTIMEOUTS timeouts;
timeouts.ReadIntervalTimeout = ??
timeouts.ReadTotalTimeoutMultiplier = ??
timeouts.ReadTotalTimeoutConstant = ??
timeouts.WriteTotalTimeoutMultiplier = ??
timeouts.WriteTotalTimeoutConstant = ??
”

wie soll ich sie setzen, damit Lesen und Schreiben blockiert?
Der Hintergrund ist einfach, dass ich ein COM1 Gerät pollen muss
und wenn die Abfragen nicht blockieren, kommt das Gerät nicht mit.

Danke

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
digit schrieb:
> wie soll ich sie setzen, damit Lesen und Schreiben blockiert?
> Der Hintergrund ist einfach, dass ich ein COM1 Gerät pollen muss
> und wenn die Abfragen nicht blockieren, kommt das Gerät nicht mit.

Das Versteht ich nicht, senden blockiert doch bei seriel im normalfall 
immer. Es kann also nur sein das du ein Timeout beim lesen bekommst. 
Aber das hat ja nicht damit zu tun das das gerät nicht hinterher kommt.

Kann es sein das du für das Gerät das Hardware oder Software Handshake 
verwenden musst damit du mitbekommst ob das Gerät bereit ist?

Autor: digit (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
auf der Gegenseite sitzt ein einfacher MAX232, nur Rx und Tx
werden verwendet. Wenn das PC Programm nun in einer while Schleife
ständig WriteFile aufruft, dann wird doch das Byte auch gesendet?
Ansonsten müsste von irgendwo eine Rückmeldung kommen .. hey
mein Buffer ist voll, Sender warte bitte. Bei I2C ist dieses
letzte Feature in "clock stretching" implementiert. Der UART
kann nichts stretchen, da wird pünktlich in der Bitmitte abgetastet.
Wenn ich so recht überlege, kann es bei UART ohne handshaking
gar kein blockierendes Schreiben geben ...

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
digit schrieb:
> Wenn ich so recht überlege, kann es bei UART ohne handshaking
> gar kein blockierendes Schreiben geben
Doch, die Wartezeit ist aber nur duch die übertragungsrate vorgegeben. 
Es blockiert also so lange bis alle Daten in einem Puffer oder sogar von 
der Schnittstelle gesendet sind. Ob jemand auf die Daten warten ist 
dabei egal. Es blockert also immer gleich lang.

Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Blockierendes UART ? Das ist natuerlich unbrauchbarer Muell. Dafuer gibt 
es ja Treiber, die mit Interrupt arbeiten.

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A...aha Soooo. schrieb:
> Blockierendes UART ? Das ist natuerlich unbrauchbarer Muell. Dafuer gibt
> es ja Treiber, die mit Interrupt arbeiten.

was hat das denn damit zu tun, der Aufruf kann ja blockieren aber intern 
kann es über den interrupt ablaufen. Wenn ich eh ein Thread habe der 
sich nur um die Schnittstelle kümmernt warum sollte er dann nicht im 
read blockieren?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
digit schrieb:

> Ansonsten müsste von irgendwo eine Rückmeldung kommen .. hey
> mein Buffer ist voll, Sender warte bitte.

Genau das passiert ja, wenn dein Thread blockiert. Die Schnittstelle 
sagt dem System, daß der Puffer voll ist und dieses blockiert daraufhin 
deinen schreibenden Thread, bis wieder Platz ist.

> Wenn ich so recht überlege, kann es bei UART ohne handshaking
> gar kein blockierendes Schreiben geben ...

Doch kann es schon, aber das interessiert sich dann eben nicht dafür, ob 
der Empfänger mitkommt, sondern nur dafür, ob die eigene Schnittstelle 
mitkommt.

> Wenn ich eh ein Thread habe der sich nur um die Schnittstelle kümmernt
> warum sollte er dann nicht im read blockieren?

Man könnte auch umgekehrt fragen: Warum extra einen Thread machen, wenn 
man auch einfach nonblocking arbeiten kann?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus schrieb:
> Man könnte auch umgekehrt fragen: Warum extra einen Thread machen, wenn
> man auch einfach nonblocking arbeiten kann?

wenn man etwas senden und danach auf eine Bestätitung wartet ist es 
wesentlich einfacher wenn das ganze in einem Programm abschnitt erfolgt. 
Wenn jetzt aber die Daten im Interupt ankommen, dann muss ich ja noch 
den Thread informieren das jetzt die Bestätiung der Daten vorliegt die 
er gerade gesendet hat.

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.