Probleme mit COM-Port !
-
Ich hab ein Problem mit COM-Ports undzwar
ich fang von Transpondern IDs ab, dazu muss ich zu 4 Transponder gleichzeitig connecten. Die Transponder hängen dazu an den Com Ports, wenn ich aber zu mehr als 2 Schnittstellen gleichzeitig connecte bekomm ich einen Fehler.
Code:
//***************************** //** Initalisieren von Com 1 ** //***************************** DCB dcb1; ZeroMemory (&dcb1, sizeof(dcb1)); dcb1.DCBlength = sizeof(DCB); if (!GetCommState (hCom1, &dcb1)) { DWORD dwError = GetLastError(); Close (); SetLastError(dwError); } hCom1 = CreateFile ( "Com1",GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); dcb1.DCBlength = 10; //sizeof(DCB); GetCommState (hCom1, &dcb1); dcb1.BaudRate = 9600; dcb1.ByteSize = 8; dcb1.Parity = 1; dcb1.StopBits = ONESTOPBIT; SetCommState (hCom1, &dcb1); if (!GetCommTimeouts(hCom1, &timeouts_alt1)) { DWORD dwError = GetLastError(); Close (); SetLastError(dwError); } COMMTIMEOUTS timeouts1; timeouts1.ReadIntervalTimeout = 100 ; timeouts1.ReadTotalTimeoutMultiplier = 30 ; timeouts1.ReadTotalTimeoutConstant = 200; // Timeout ist 3000ms if (!SetCommTimeouts(hCom1, &timeouts1)) { DWORD dwError = GetLastError(); Close (); SetLastError(dwError); } if (hCom1 == INVALID_HANDLE_VALUE) { Application->NormalizeTopMosts(); Application->MessageBox("Com1 AUF meldet Störungen. Bitte starten Sie das Programm neu auf", "Achtung", MB_OK); Application->RestoreTopMosts(); } //***************************** //** Initalisieren von Com 2 ** //***************************** DCB dcb2; ZeroMemory (&dcb2, sizeof(dcb2)); dcb2.DCBlength = sizeof(DCB); if (!GetCommState (hCom2, &dcb2)) { DWORD dwError = GetLastError(); Close (); SetLastError(dwError); } hCom2 = CreateFile ( "Com2", GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); dcb2.DCBlength = sizeof(DCB); GetCommState (hCom2, &dcb2); dcb2.BaudRate = 9600; dcb2.ByteSize = 8; dcb2.Parity = 1; dcb2.StopBits = ONESTOPBIT; SetCommState (hCom2, &dcb2); if (!GetCommTimeouts(hCom2, &timeouts_alt2)) { DWORD dwError = GetLastError(); Close (); SetLastError(dwError); } COMMTIMEOUTS timeouts2; timeouts2.ReadIntervalTimeout = 100 ; timeouts2.ReadTotalTimeoutMultiplier = 30 ; timeouts2.ReadTotalTimeoutConstant = 200; // Timeout ist 3000ms if (!SetCommTimeouts(hCom2, &timeouts2)) { DWORD dwError = GetLastError(); Close (); SetLastError(dwError); } if (hCom2 == INVALID_HANDLE_VALUE) { Application->NormalizeTopMosts(); Application->MessageBox("Com2 meldet Störungen. Bitte starten Sie das Programm neu", "Achtung", MB_OK); Application->RestoreTopMosts(); } //***************************** //** Initalisieren von Com 3 ** //***************************** /* DCB dcb3; ZeroMemory (&dcb3, sizeof(dcb3)); dcb3.DCBlength = sizeof(DCB); if (!GetCommState (hCom3, &dcb3)) { DWORD dwError = GetLastError(); Close (); SetLastError(dwError); } hCom3 = CreateFile ( "Com3", GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); dcb3.DCBlength = sizeof(DCB); GetCommState (hCom3, &dcb3); dcb3.BaudRate = 9600; dcb3.ByteSize = 8; dcb3.Parity = 1; dcb3.StopBits = ONESTOPBIT; SetCommState (hCom3, &dcb3); if (!GetCommTimeouts(hCom3, &timeouts_alt3)) { DWORD dwError = GetLastError(); Close (); SetLastError(dwError); } COMMTIMEOUTS timeouts3; timeouts3.ReadIntervalTimeout = 100 ; timeouts3.ReadTotalTimeoutMultiplier = 30 ; timeouts3.ReadTotalTimeoutConstant = 200; // Timeout ist 3000ms if (!SetCommTimeouts(hCom3, &timeouts3)) { DWORD dwError = GetLastError(); Close (); SetLastError(dwError); } if (hCom3 == INVALID_HANDLE_VALUE) { Application->NormalizeTopMosts(); Application->MessageBox("Com3 meldet Störungen. Bitte starten Sie das Programm neu", "Achtung", MB_OK); Application->RestoreTopMosts(); } */ //***************************** //** Initalisieren von Com 4 ** //***************************** DCB dcb4; ZeroMemory (&dcb4, sizeof(dcb4)); dcb4.DCBlength = sizeof(DCB); if (!GetCommState (hCom4, &dcb4)) { DWORD dwError = GetLastError(); Close (); SetLastError(dwError); } hCom4 = CreateFile ( "Com4", GENERIC_WRITE | GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL); dcb4.DCBlength = sizeof(DCB); GetCommState (hCom4, &dcb4); dcb4.BaudRate = 9600; dcb4.ByteSize = 8; dcb4.Parity = 1; dcb4.StopBits = ONESTOPBIT; SetCommState (hCom4, &dcb4); if (!GetCommTimeouts(hCom4, &timeouts_alt4)) { DWORD dwError = GetLastError(); Close (); SetLastError(dwError); } COMMTIMEOUTS timeouts4; timeouts4.ReadIntervalTimeout = 100 ; timeouts4.ReadTotalTimeoutMultiplier = 30 ; timeouts4.ReadTotalTimeoutConstant = 200; // Timeout ist 3000ms if (!SetCommTimeouts(hCom4, &timeouts4)) { DWORD dwError = GetLastError(); Close (); SetLastError(dwError); } if (hCom4 == INVALID_HANDLE_VALUE) { Application->NormalizeTopMosts(); Application->MessageBox("Com4 meldet Störungen. Bitte starten Sie das Programm neu", "Achtung", MB_OK); Application->RestoreTopMosts(); } }Das ist das initialisieren der Ports .
So jetzt bekomm ich in INVALID_HANDLE_VALUE nen Fehler, weiß jemand warum oder wie ich den umgehen könnte. Ich denke die Stören sich einfach gegenseitig.
Und sonst mal so als Frage hat der Borland Builder nicht ein Modul mit dem man vielleicht auf die COM Ports connetcen kann, das dann irgenwie die Steuerung übernimmt ?
Danke schon mal ...
MUKUMUKU
-
Für die serielle Schnittstelle Rate ich Dir dringend eine fertige Klasse zu verwenden! Oder schau zumindest den Source an, damit Du weisst wie man es macht:
http://www.codeproject.com/system/serial.asp
-
Lern erstmal for-Schleifen.

-
GetLastError gibt den Fehler des letzten Api-Aufrufs zuvor zurück. Ruf GetLastError also direkt nach CreateFile auf, um den Grund für das Scheitern beim Öffnen zu erfahren. Vermutlich sind bei Dir nicht mehr als 2 Comports installiert.
-
[quote="SCNR"]Lern erstmal for-Schleifen. :D[/quote] LOL
