Komische Daten auf RS232 / V24 empfangen

chefsalat-

Mitglied
Hallo zusammen,
meine Ausgangssituation:
Über RS232 versuche ich, ein Gerät anzusprechen. Den Com-Port öffnen und Daten hinsenden klappt soweit auch schon ganz gut.
Die Daten, die das Gerät als Antwort an mich schickt kann ich auch empfangen.
Zur Kontrolle der Daten auf der Leitung habe ich einen zweiten Rechner als Lauscher an das Com-Kabel gehängt. Der zeichnet mir alle Daten auf der Leitung auf und zeigt sie mir als Hex-Werte an. Das klappt soweit auch ganz gut. (Daten werden richtig gesendet. Gerät antwortet richtig.)
Nur mein Problem.
Die Daten, die ich empfange sind teilweise etwas anders.

Ich schicke:
{00} {00} {00} {00} {33} {33} {33} {33} {00} {FF} (Werte stehen in einem char-Array drin)

Ich sollte empfangen:
{7A} {85} {05} {FA} {EE} {11} {0F} {F0} {00} {FF} {4C} {B3} {00} {FF} {00} {FF}

Ich empfange aber (char-Array zur besseren Ansicht mit %x ausgegeben):
{7A} {FFFFFF85} {5} {FFFFFFFA} {FFFFFEE} {11} {F} {FFFFFFF0} {0} {FFFFFFFF} {4C} {FFFFFFB3} {0} {FFFFFFFF} {0} {FFFFFFFF}

Mein "Lausch-Rechner" zeigt mir an, dass nur die normalen Daten über die Leitung gehen, also:
{7A} {85} {05} {FA} {EE} {11} {0F} {F0} {00} {FF} {4C} {B3} {00} {FF} {00} {FF}

Vielleicht hilft es ja, die Werte habe ich zusätzlich noch in "int" umgewandelt. Dann sieht das so aus (diese Werte brauch ich nicht, nur zur veranschaulichung):
{122} {-123} {5} {-6} {-18} {17} {15} {-16} {0} {-1} {76} {-77} {0} {-1} {0} {-1}

Die Anzahl der empfangenen Daten stimmt.

Wie bekomm ich es hin, das ich z.b. anstatt {FFFFFF85} folgendes bekomm: {85}
Wie kann ich also die führenden FFFFFF abschneiden?
Nur dadurch kann ich mit den Werten weiterarbeiten.



Mein zweites Problem:
Mit dem Originalprogramm kommen immer die folgenden Daten zurück:
{7A} {85} {05} {FA} {EE} {11} {0F} {F0} {00} {FF} {4C} {B3} {00} {FF} {00} {FF} (siehe auch oben)
Mit meinem nachgeschriebenen Programm kommen trotz gleicher Nachricht, die ich an das Gerät schicke, laut "Lausch-Rechner" andere Daten vom Gerät zurück, wie vom Originalprogramm.
Es sind immer nur 2 Stellen anders. Anstatt {FA} {EE} kommen:
{98} {EE} oder {F0} {EE} oder {FA} {CC} oder {FA} {62} oder {E4} {EE}

Weiß jemand, an was das liegen könnte, das immer nur der 4. bzw. 5. empfangene Wert unterschiedlich sind. Eigentlich muss das Gerät immer mit der gleichen Nachricht antworten, da ich am Gerät selber ja nichts verändert habe.


Kann mir jemand helfen
Besten Dank schon mal im Vorraus.

Gruß chefsalat-
 
Zum ersten Problem:
Das Abschneiden ist noch relativ problemlos, allerdings scheint bei deiner Einlese- bzw. Umwandlungsroutine etwas nicht zu stimmen, wenn solche Werte entstehen.
C++:
int x = 0xFFFFFF85;
int y = x & 0xFF; // FFFFFF abschneiden

Zum zweiten Problem:
Lässt sich ohne Glaskugel nur schwer eruieren :)
Evt. zeigst du mal relevante Teile deines Einleseprogrammes. Musst du bei der seriellen Kommunikation nicht auch noch ein bestimmtes Protokoll beachten, in dessen Rahmen die eigentlichen Nutzdaten übertragen werden?

Gruß
MCoder
 
Super. Das erste Problem ist behoben. Vielen Dank mal dafür.

Zum Zweiten Problem.
Ja, das Protokoll beachte ich schon.
Ich muss, um das Gerät anzusprechen folgendes hinschicken:
{00} {00} {00} {00} {33} {33} {33} {33} und dann für Kanal 0 am Gerät {00} plus das 1.Komplement, also {FF}. Bzw für den zweiten Kanal am Gerät {01] plus das 1. Komplement, also {FE}.

Das Gerät antwortet dann sofort darauf. Sollte es den Befehl nicht verstanden haben, antwortet es nicht und verwirft einfach das empfangene Kommando.

Es gibt auch noch andere Kommandos für das Gerät (Status setzen, was einschalten, was ausschalten, ...). Aber ich versuche erst einmal das einfachste Kommando. Wenn da alles klappt, wie es soll, werde ich mich an die schwereren Kommandos ranmachen. Da muss dann noch mehr berechnet werden.

Hier noch mein Einlesecode:

C++:
int ComPort::readData1(char *buffer){
	BOOL fWaitingOnRead = FALSE;
	OVERLAPPED osReader = {0};
	char chRead;
	int i = 0;
	int ihex;
	dwRead = 0;

	printf("##################################################\n");
	printf("#   comport.cpp: Lese Daten...\n");
	osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

	if (osReader.hEvent == NULL){
		printf("#   FEHLER: comport.cpp: Konnte OVERLAPPED Event nicht erstellen.\n");
		//Abbruch
		printf("###################################################\n");
		return -1;
	}

	if (!fWaitingOnRead) {
		while (ReadFile(hComm, &chRead, 1, &dwRead, &osReader)){ //wurde ein Zeichen gelesen
			if(dwRead != 1){ //Wenn nicht, dann Abbruch
				printf("#   FEHLER: comport.cpp: Es konnte nichts gelesen werden.\n");
				break;
			}
			else{ //ansonsten
				buffer[i++] = chRead; //wenn ja, dann Zeichen in Buffer schreiben
				ihex = chRead; //Char-Werte in Hex-Werte (int) wandeln.
				ihex = ihex & 0xFF; // evtl. führende FF abschneiden
				printf("#   comport.cpp: %x = %i\n",ihex, ihex);
			}
		}
		printf("#   comport.cpp: Lesen der Daten beendet.\n");
		printf("##################################################\n");
		return i;
	}
	printf("#   comport.cpp: Normales Ende vom Lesen. Irgendwas hat nicht geklappt.\n");
	printf("##################################################\n");
	return 0;
}

Ein paar Teile hab ich im Internet gefunden: MSDN, google, ...

Gruß chefsalat-
 
Zuletzt bearbeitet von einem Moderator:
Möglicherweise macht der asynchrone Betrieb Probleme. Ist das für deine Anwendung erforderlich? Ansonsten kannst du mal versuchen, das Flag FILE_FLAG_OVERLAPPED bei "CreateFile()" und danach die ganze OVERLAPPED-Geschichte wegzulassen. Dein Code zum Lesen scheint ok zu sein.

Gruß
MCoder
 
So, mittlerweile habe ich herausgefunden, was das Problem war.
Das Anzeigeprogramm hat an dieser einen Stelle manchmal einen falschen Wert angezeigt. Vielleicht lag es an dem Lauschkabel.
Auf jeden Fall sind die Werte doch richtig angekommen.
Die Overlapped-Geschichte hab ich jetzt mal weggelassen.
Es funktionierte aber auch mit overlapped...

Vielen Dank MCoder!!

Gruß chefsalat-
 
Das Programm sieht gut aus (Screenshot), aber leider kann ich es durch mangelnde Admin-Rechte nicht installieren. Ich schau es mir mal daheim an.
Danke

Gruß chefsalat-
 
Zurück