Timeouts
von B. Kainka, Lernpaket MSR mit dem PC
Bei jedem Empfangsversuch muss man damit rechnen, dass die erwarteten Zeichen nicht eintreffen, z. B., weil ein Gerät nicht angeschlossen wurde oder eine andere Störung vorliegt. Ein empfangendes Programm darf aber in dieser Situation nicht endlos warten, sondern es muss eine definierte Abbruchbedingung geben. Für diesen Zweck stellt Windows Sende- und Empfangs-Timeouts bereit. Die Struktur COMMTimeOuts enthält fünf einzelne Einstellungen.
typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout;
DWORD ReadTotalTimeoutMultiplier;
DWORD ReadTotalTimeoutConstant;
DWORD WriteTotalTimeoutMultiplier;
DWORD WriteTotalTimeoutConstant;
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;
ReadIntervalTimeout stellt die maximale Wartezeit zwischen zwei Empfangsbytes ein. Ein Nullwert bedeutet, dass keine TimeOuts verwendet werden.
| Ganzen Artikel lesen... |  |
ReadTotalTimeoutMultiplier ist ein Multiplikator für die gesamte Timeoutzeit, wobei der eingestellte Wert mit der Anzahl der angeforderten Bytes multipliziert wird.
ReadTotalTimeoutConstant ist eine konstante Wartezeit, die zum Produkt aus ReadTotalTimeoutMultiplier und Zeichenmenge hinzuaddiert wird. Für den Fall des Empfangs von Einzelzeichen ist dies die einzige relevante Einstellung.
WriteTotalTimeoutMultiplier ist ein Multiplikator für die gesamte Timeoutzeit, wobei der eingestellte Wert mit der Anzahl der zu sendenden Bytes multipliziert wird.
WriteTotalTimeoutConstant ist eine Konstante, die zum Produkt aus WriteTotalTimeoutMultiplier und der Anzahl der mit einer WriteFile-Operation zu sendenden Bytes hinzuaddiert wird.
Da hier meist nur einzelne Bytes empfangen werden und auch ReadString einzelne Bytes empfängt und zusammensetzt, braucht nur eine konstante Timeout-Zeit eingestellt zu werden. Man hat dann flexible Möglichkeiten, auf langsam antwortende Geräte und auch auf sporadisch eintreffende Daten zu reagieren.
procedure TIMEOUTS (TOut: Integer);
var TimeOut:TCOMMTIMEOUTS;
begin
TimeOut.ReadIntervalTimeout:=1;
TimeOut.ReadTotalTimeoutMultiplier:=1;
TimeOut.ReadTotalTimeoutConstant:=TOut;
TimeOut.WriteTotalTimeoutMultiplier:=10;
TimeOut.WriteTotalTimeoutConstant:=TOut;
SetCommTimeouts(PortHandle,TimeOut);
end;
Listing 2: Die Timeouts

Lernen Sie die ganze Vielfalt vom Franzis Buch- und Softwareverlag kennen