permanent 1 byte über den COM Port senden (ergänzt)



  • also geöffnet hab ich ihn mit

    hSerial = CreateFile( "COM4", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL );
    	if( INVALID_HANDLE_VALUE == hSerial )
    	{
    		MessageDlg("CreateFile fehlgeschlagen!", mtError, TMsgDlgButtons() << mbOK, 0);
    		return;
    	}
    
    	DCB dcb;
    	if( !GetCommState( hSerial, &dcb ) )
    	{
    		CloseHandle( hSerial );
    		MessageDlg("GetCommState fehlgeschlagen!", mtError, TMsgDlgButtons() << mbOK, 0);
    		return;
    	}
    
    	if( !BuildCommDCB( "2400,n,8,1", &dcb ) )
    	{
    		CloseHandle( hSerial );
    		MessageDlg("BuildCommDCB fehlgeschlagen!", mtError, TMsgDlgButtons() << mbOK, 0);
    		return;
    	}
    
    	if( !SetCommState( hSerial, &dcb ) )
    	{
    		CloseHandle( hSerial );
    		MessageDlg("SetCommState fehlgeschlagen!", mtError, TMsgDlgButtons() << mbOK, 0);
    		return;
    	}
    	COMMTIMEOUTS C;
    	C.ReadIntervalTimeout = 0;
    	C.ReadTotalTimeoutMultiplier = 1;
    	C.ReadTotalTimeoutConstant = 0;
    	C.WriteTotalTimeoutMultiplier = 1;
    	C.WriteTotalTimeoutConstant = 0;
    	if ( !SetCommTimeouts (hSerial, &C))
    	{
    		CloseHandle( hSerial );
    		MessageDlg("SetCommTimeouts fehlgeschlagen!", mtError, TMsgDlgButtons() << mbOK, 0);
    		return;
    	}
    

    schreiben tu ich mit einem thread über folgenden aufruf

    while(!Terminated) {
    		unsigned long Len;
    		if (Send != 0) {
    			if (!WriteFile(hSerial, &Send, 1, &Len, NULL))
    			{
    				AnsiString AS;
    				int E;
    				E = GetLastError();
    				AS.printf("SENDERROR %d", E);
    				OutputDebugString(AS.c_str());
    				Terminate();
    			}
    		}
    		char Buff[100];
    		Len = 0;
    		if (!ReadFile(hSerial, Buff, 99, &Len, NULL))
    		{
    			AnsiString AS;
    			int E;
    			E = GetLastError();
    			AS.printf("RECVERROR %d", E); // Hier brichts weg mit
    			OutputDebugString(AS.c_str()); // ERROR_OPERATION_ABORTED
    			Terminate();
    		}
    		if (Len > 0) {
    			Text = Buff;
    			Synchronize(&UpdateTarget);
    		}
    	}
    

    und abschmieren tut er mir nach einigen sekunden dauerfeuer mit fehlercode 995 (aka ERROR_OPERATION_ABORTED) im recv block

    ich bitte um hilfe, oder eventuell eine bessere lösung Q_Q

    EDIT: das problem ist das ich an einen IR sender/empfänger sende, ich versuche grad verzweifelt eine kommunikation zwischen einem asuro roboter und meinem rechner herzustellen ala hyperterminal und zwecks signaltest muss ich unbedingt so schnell wie möglich ein permanentes signal senden btw. empfangen



  • kenne mich zwar damit nicht so aus aber(weiss auch net genau was Terminate() für ne funktion hat), wenn du den Stream geöffnet hast kann:
    1. nichts von der anderen seite reingeschrieben werden(vlt nen PONG oda was auch immer)
    und
    2. kannst du die datei net lesen..



  • verzeihung, aber ich hab nicht wirklich verstanden was du mir damit sagen willst

    P.S. Terminate beendet den Thread uns setzt die variable "Terminated" auf true. (TThread klasse aus borland )

    1. nichts von der anderen seite reingeschrieben werden(vlt nen PONG oda was auch immer)

    das versteh ich leider nicht, kann sein das mein textverständnis noch schläft aber ich hab ja nen comport geöffnet und das senden klappt einige sekunden ganz gut

    und
    2. kannst du die datei net lesen..

    auch das funktioniert ....ich sollte hier nochmal erwähnen das ich über den com einen IR sender ansteuere und der mir praktisch immer eine kopie meiner abgesendeten daten empfängt, weil sender und empfängerdiode nicht ausreichen abgeschirmt werden können

    nur mit der fehlermeldung
    fehlercode 995 (aka ERROR_OPERATION_ABORTED)
    kann ich nix anfangen, da ich den com port nicht shared betreibe und laut hilfe er nur auftritt wenn ich cancelIO aufrufe und das geht auch laut hilfe nur wenn ich den port shared öffne und dann auch nur für den thread der cancelIO aufgerufen hat


Anmelden zum Antworten