S
Hallo
Ich möchte gerne über die RS232 Schnittstelle die Timeout Zeiten konfigurieren können.
VC++ bietet da die Struktur COMMTIMEOUTS:
typedef struct _COMMTIMEOUTS {
DWORD ReadIntervalTimeout;
DWORD ReadTotalTimeoutMultiplier;
DWORD ReadTotalTimeoutConstant;
DWORD WriteTotalTimeoutMultiplier;
DWORD WriteTotalTimeoutConstant;
} COMMTIMEOUTS,*LPCOMMTIMEOUTS;
Die MSDN Hilfe/Erklärung habe ich schon x mal gelesen, aber ich verstehe es wohl einfach doch nicht, weil es nicht so funktioiniert, wie es sollte. Kann mir jemand, anhand eines Beispiels vielleicht, diese COMMTIMEOUTS erklären?
Hier mein Code:
bool RS232::deviceSetup(){
DCB myDcb;
COMMTIMEOUTS myTimeouts;
// hole aktuelle werte
if(!GetCommState(m_ComPortHnd,&myDcb)){
return false;
}
// konfiguration der schnittstellenparameter
myDcb.BaudRate = getBaudrate();
myDcb.ByteSize = 8;
myDcb.StopBits = ONESTOPBIT;
myDcb.Parity = NOPARITY;
// dcb setzen
if(!SetCommState(m_ComPortHnd,&myDcb)){
return false;
}
myTimeouts.ReadIntervalTimeout = 2000; // 2 sec.
myTimeouts.ReadTotalTimeoutMultiplier = 1;
myTimeouts.ReadTotalTimeoutConstant = 0;
myTimeouts.WriteTotalTimeoutMultiplier = 0xFFFFFFFF;
myTimeouts.WriteTotalTimeoutConstant = getTimeoutWrite();
// setze neue timeout werte
if(!SetCommTimeouts(m_ComPortHnd,&myTimeouts)){
return false;
}
return true;
}
Ich sende 2 Bytes und warte dann... nach ca. 4 Sekunden meldet sich die write Methode zurück (mit obiger Konfiguration) und meldet ein Timeout. Brovo, nach ca. 4 Sekunden?
Nochmals zur MSDN: Dort steht beim 'ReadIntervalTimeout', dass dieses die Delta-Zeit zwischen dem Empfang zweier Bytes ist.
Bei 'ReadTotalTimeoutMultiplier' steht, dass dieser Wert mit den Anzahl erwartetend Bytes mulipliziert wird. Woher man weiss, wieviele Bytes man erwartet steht wieder nirgends. Bei 'ReadTotalTimeoutConstant' steht, dass dieser Wert zum Produkt von 'ReadTotalTimeoutMultiplier' addiert wird.
Ich will doch aber ganz einfach ein Total-Timeout für's lesen realisieren. Ist das wirklich so schwer? Egal wo ich die 2000ms eintrage und mit 0 oder 1en kombiniere, ich erhalte nie die richtige Timeoutzeit. Wer kann helfen?
Nachtrag:
In der MSDN steht folgendes:
Remarks
If an application sets ReadIntervalTimeout and ReadTotalTimeoutMultiplier to MAXDWORD and sets ReadTotalTimeoutConstant to a value greater than zero and less than MAXDWORD, one of the following occurs when the ReadFile function is called:
+ If there are any characters in the input buffer, ReadFile returns immediately with the characters in the buffer.
+ If there are no characters in the input buffer, ReadFile waits until a character arrives and then returns immediately.
+ If no character arrives within the time specified by ReadTotalTimeoutConstant, ReadFile times out.
na also, dann würde der folgende Code das geüwnschte Ergebnis (fall 3) bringen
myTimeouts.ReadIntervalTimeout = MAXDOWRD;
myTimeouts.ReadTotalTimeoutMultiplier = MAXDOWRD;
myTimeouts.ReadTotalTimeoutConstant = 2000; // 2000 > 0 & 2000 < MAXDWORD
funktioniert dennoch nicht.