Im Zweifelsfall immer den Return code ansehen/auswerten:
1 | if (hCom == INVALID_HANDLE_VALUE)
|
2 | {
|
3 | LPVOID lpMsgBuf;
|
4 | FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
5 | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
|
6 | NULL, GetLastError (), MAKELANGID (LANG_NEUTRAL, SUBLANG_DEFAULT),
|
7 | (LPTSTR) &lpMsgBuf, 0, NULL);
|
8 | MessageBox (NULL, (LPCTSTR)lpMsgBuf, TEXT("ComThread: error: CreateFile()"),
|
9 | MB_OK | MB_ICONINFORMATION);
|
10 | LocalFree (lpMsgBuf);
|
11 | }
|
Und statt
1 | interface_parameter.BaudRate=baudrate;
|
2 | interface_parameter.StopBits=anz_stopbits;
|
diese Einstellungen verwenden (aus den headern):
1 | interface_parameter.BaudRate=CBR_9600;
|
2 | interface_parameter.StopBits=ONESTOPBIT;
|
Und die Timeouteinstellungen so setzen:
ReadIntervalTimeout ist die Warte-Zeit [ms] vom Beginn eines Bytes bis
zum Beginn des nächsten Bytes (kann aus den Einstellungen ByteSize,
Baudrate und StopBits abgeleitet werden).
ReadTotalTimeoutMultiplier (z.B. = 0) in [ms] wird mit Read-Buffer-Size
multipliziert.
ReadTotalTimeoutConstant (z.B. = 50), wird an ReadTotalTimeoutMultiplier
angehängt.
Die anderen Werte können 0 sein.
Das könnte noch fehlen:
1 | SetupComm (hCom, COM_BUFFER_SIZE, COM_BUFFER_SIZE); // irgendein Wert > 0
|
Hyperterm und ä. initialisieren die Ports (richtig) und die
Einstellungen bleiben nach dem Beenden dieser Programme im Kernel
erhalten. Deshalb funktioniert Dein Programm nach dem Starten von
Windows VOR dem Starten von Hyperterm o.ä. nicht.
Blackbird