Probleme mit Disconnect vom Comport



  • Hallo.

    Ich beschäftige mich gerade mit der Comport-Programmierung.

    Eigentlich funktioniert alles bis auf eine Kleinigkeit.
    Ich kann einen Comport per CreateFile öffnen.
    Zeitgleich öffne ich einen Thread, der in regelmäßigen Abständen nach neuen Informationen Scannt.

    Wenn ich jetzt aber den Comport schließe, schnellt die CPU Last auf 100% warum?

    Schließe ich den Comport falsch? Oder den Thread?

    Hier mal der Code fürs öffnen und schließen:

    hComm = hThread = 0;
    
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
       if (hComm)
       {
          if (hThread)
              while (!CloseHandle(hThread));
    
          while (!CloseHandle(hComm));
    
          Connect1->ImageIndex--;
          Button1->ImageIndex--;
          Button1->Caption = "Verbinden";
          Connect1->Caption = Button1->Caption;
          hComm = hThread = 0;
       }
       else
       {
          hComm = CreateFile (ComboBox12->Caption.c_str(),//"\\\\.\\COM2",
                              GENERIC_READ | GENERIC_WRITE,
                              0,
                              0,
                              CREATE_NEW,
                              FILE_ATTRIBUTE_NORMAL,
                              NULL);
          if (hComm != 0)
          {
             COMMTIMEOUTS timeouts;
             timeouts.ReadIntervalTimeout         = 50;
             timeouts.ReadTotalTimeoutMultiplier  = 50;
             timeouts.ReadTotalTimeoutConstant    = 50;
             timeouts.WriteTotalTimeoutMultiplier = 50;
             timeouts.WriteTotalTimeoutConstant   = 50;
    
             if (!SetCommTimeouts(hComm, &timeouts))
             {
    
             }
    
             LPDCB state = new DCB;
             state->DCBlength         = sizeof(DCB);
             state->BaudRate          = 9600;
             state->fBinary           = 1;
             state->fParity           = 0;
             state->fOutxCtsFlow      = 0;
             state->fOutxDsrFlow      = 0;
             state->fDtrControl       = 1;
             state->fDsrSensitivity   = 0;
             state->fTXContinueOnXoff = 0;
             state->fOutX             = 0;
             state->fInX              = 0;
             state->fErrorChar        = 0;
             state->fNull             = 0;
             state->fRtsControl       = 0;
             state->fAbortOnError     = 0;
             state->fDummy2           = 0;
             //state->wReserved         = 0; da meckert der Compiler
             state->XonLim            = 2048;
             state->XoffLim           = 512;
             state->ByteSize          = 8;
             state->Parity            = 0;
             state->StopBits          = 0;
             state->XonChar           = 17;
             state->XoffChar          = 19;
             state->ErrorChar         = 0;
             state->EofChar           = 0;
             state->EvtChar           = 0;
             state->wReserved1        = 0;
    
             SetCommState(hComm, state);
             delete state;
    
             hThread = CreateThread(
                                    NULL,
                                    0,
                                    Thread,
                                    (LPVOID)1,
                                    0,
                                    0);
             if (hThread == 0)
             {
                while (!CloseHandle(hThread));
                hComm = hThread = 0;
             }
          }
          else
             hComm = hThread = 0;
       } 
    }
    

    Und hier der Code für den Thread:

    DWORD WINAPI Thread(LPVOID Data)
    {
       unsigned char chRead;
    
       DWORD dwRead;
       while (true)
       {
          do
          {
             ReadFile(hComm, &chRead, 1, &dwRead, NULL);
          }
          while (dwRead != 1 || chRead!=255);
       }
     return (DWORD)Data;
    }
    

    Ich hoffe mir kann geholfen werden ....

    Viele Liebe Grüße



  • Eine Sache ist mir aufgefallen.

    Wenn ich den Thread schließe aber den Comport nicht, empfange ich fröhlich munter weitere Informationen...

    Ich nehme also an, ich schließe den Thread falsch .... oder nicht?



  • CloseHandle schließt nur das Handle, nicht den Thread. Das in einer Schleife zu tun, ist Unsinn.

    Was willst du da eigentlich tun? Willst du auf das Ende des Threads warten? Warum startest du dann überhaupt einen?



  • Ich kenn mich leider mehr schlecht als recht mit c++ aus...

    Ich möchte einen Thread (oder auch ohne wenn es da einen Weg gibt) basteln, der in regelmäßigen abständen schaut, ob neue Informationen über dem Comport kommen ...

    Es würde zwar wenig Sinnmachen ... aber ich stell mal ne doofe Frage 🙂
    Wenn der Thread ne do while (true) schleife besitzt, dann kann ich den Thread nicht von außen beenden?

    Wie kann ich trotzdem eine Möglichkeit finden, wo ich wenn der Port offen ist, in regelmäßigen abständen schaue, ob neue Informationen da sind??

    Viele Liebe Grüße!!


Anmelden zum Antworten