//funktion zum starten (freigeben) des empfangs! unsigned int __fastcall comlesen(void) { commlesen *testthread=new commlesen(true); // angehalten init(); // alles reset!!! puffer clear und schreibezeiger, lesezeiger auf 1. speicherplatz testthread->Priority=tpNormal; testthread->Resume(); // Starten des Thread! if (testthread->Suspended) Application->MessageBoxA("Thread läuft nicht! 1","Fehler!",MB_OK); while(status==255); // warten auf thread! testthread->Suspend(); testthread->Terminate(); testthread->~commlesen(); if (!PurgeComm(hseriel,PURGE_RXCLEAR)) // puffer der com leeren! Application->MessageBoxA("kein Puffer clear!","Fehler!",MB_OK); return(schreibeindex-leseindex); } // Thread für den Daten empfang void __fastcall commlesen::Execute() { while(!Terminated) { if (timeout==0) timeout=15; a=timeout; // altes timeout while(status==255) // lesen erlauben! { if (!ReadFile (hseriel, &rx,1,&iBytesReceived,&o)) { DWORD error = GetLastError(); if (ERROR_IO_PENDING != error) Application->MessageBoxA("read Fehler!","Fehler!",MB_OK); } tab=WaitForSingleObject( o.hEvent, timeout ) ; if (tab== WAIT_FAILED) Application->MessageBoxA("wait Fehler!","Fehler!",MB_OK); if( WAIT_OBJECT_0 == tab) { // Daten sind da if (timeout==a) timeout=30; // erstes zeichen da? dann neues timeout *schreibeindex=rx; // daten in den puffer schreibeindex++; // zeiger +1 *schreibeindex='\0'; if (wert>1 && timeout== zeittimer2) Application->MessageBoxA("Timeout zu groß","Fehler!",MB_OK); } else { // Timeout ist gekommen!!! if (timeout==a) { // Application->MessageBoxA(" Timeout, keine Daten Empfangen!","Fehler!",MB_OK); // altes timeout status=30; } else { // daten liegen for status=20; // timeout 20ms } } } } }