Geräte an COM Port ausgeschaltet, Probleme mit Exception handling
-
Hallo,
ich habe ein Problem mit Exception Handling.
Ich spreche mit meinem Programm an den COM Ports angeschlossene Geräte an. Bei eingeschalteten Geräten gibt es keine Probleme, jedoch "hängt" sich das Programm auf, wenn die Geräte ausgeschaltet sind.
Geschrieben wurde/wird das Programm übrigends mit dem Borland C++ Builder 6.so öffne ich den Port:
int open_com() { DCB dcb; hCom = CreateFile ("COM1", GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); dcb.DCBlength = sizeof(DCB); GetCommState (hCom, &dcb); dcb.BaudRate = 9600; dcb.ByteSize = 8; dcb.Parity = NOPARITY; dcb.StopBits = ONESTOPBIT; SetCommState (hCom, &dcb); return 0; }so sende ich Daten:
int send(char input) { DWORD iBWritten; unsigned char ucMsg; ucMsg = input; WriteFile (hCom, &ucMsg, 1, &iBWritten, NULL); return (0); }so werden sie aufgerufen:
open_com(); // Port öffnen sv_befehl = " \n exit\n"; befehl_laenge = strlen(sv_befehl); for (int i=0; i < befehl_laenge; i++) { send(sv_befehl[i]); }Wie kann ich verhindern, dass sich das Programm aufhängt?
Mein Gedanke war, das hängen mit einer Exception abzufangen.
Wo wäre es klug die zu integrierten?beim öffnen des Ports dachte ich an
try { SetCommState (hCom, &dcb); } catch (Exception &E) { }und beim senden:
int send(char input) { DWORD iBWritten; unsigned char ucMsg; ucMsg = input; try { WriteFile (hCom, &ucMsg, 1, &iBWritten, NULL); } catch (Exception &E) { } return 0;Jedoch funktioniert das leider nicht. Kann mir jemand einen Tipp geben, wo es hängt (...leider noch Anfänger).
Danke.
gruß,
M.F.
-
Hallo
Das Auffangen von Exeptions bringt nur etwas, wenn Exceptions geworfen werden (siehe throw).
Was bei GetCommState/SetCommState nicht der Fall ist.
Dort must du den Rückgabewert überprüfen (was man bei allen WinAPI-Funktionen machen sollte) :If the function fails, the return value is zero. To get extended error information, call GetLastError.
Darauf hin kannst du deine Fehlerbearbeitung aufbauen.
bis bald
akari
-
M.Frank schrieb:
Wie kann ich verhindern, dass sich das Programm aufhängt?
da gibt's gleich mehrere möglichkeiten...
1. SetCommTimeouts() --> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devio/base/setcommtimeouts.asp
2. asynchrones i/o --> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/synchronization_and_overlapped_input_and_output.asp
3. read/write in separaten threads
such dir was aus
-
@akari: axo, das throw habe ich vergessen. Morgen mal schaun, wie das richtig gehört.
@net: Super Tipps, werde die morgen auch gleich mal versuchen zu implementieren.
Danke.
gruß,
M.F.