Zum Inhalt springen

COM Port - Empfangene Bytes auslesen


Rain

Empfohlene Beiträge

Hallo miteinander!

Ich versuche schon seit xx Stunden über den folgenden Code in einer while schleife zu pollen ob Bytes empfangen worden sind. Wenn dies Anzahl der empfangenen Bytes gleich der Länge ist die ich als Antwort erwarte soll diese Antwort ausgewertet werden. Über das Terminalprogramm kann man sehen, dass definitiv Werte gesendet werden. (auch in der richtigen Länge)


HANDLE hRS232;

DCB	RS232Setting;

COMMTIMEOUTS	RS232Timeout;

boolean RS232IsOpened = false;

char key;


.. MAIN ...

while(true){


	while(_kbhit()){

		key = _getch();


			if(key == 'e'){

			...sende Ende Command ....

			}

		}

	Sleep(100);

	if(GetNumOfBytesInBuffer() == 4){

		cout<<"4 byte im Empfangsbuffer"<<endl;

	}


}

.... MAIN ENDE ...



int GetNumOfBytesInBuffer(void)

{

COMSTAT		sComStat;

DWORD		dwErrorFlags;


	if(!RS232IsOpened)				{ return -1; }


	//dwErrorFlags=0;


	if(!ClearCommError(hRS232, &dwErrorFlags, &sComStat)){


		return 0;


	}


return ((int) sComStat.cbInQue);


int RS232Open(unsigned int PortNr,int BaudRate, int NumOfStopBits, int NumOfDataBits)

{

	wchar_t RS232DeviceName[10];


	/* Some rudimentary Error Checks*/

	if(PortNr > UPPER_PORTNR_BOUND)		{ return -1; }

	if(RS232IsOpened)			{ return -1; }

	if(NumOfDataBits > 8)			{ return -1; }


	/* lets copy the desired PortNr to the identifier string*/

	swprintf (RS232DeviceName,TEXT("\\\\.\\COM%i"), PortNr);

	hRS232 = CreateFile(RS232DeviceName,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);

	if(hRS232 == INVALID_HANDLE_VALUE)	{ 

		switch (GetLastError())	{

			case ERROR_FILE_NOT_FOUND:	

printf("The specified COM Port does not exist!");

				break;

			case ERROR_ACCESS_DENIED:	

printf("The specified COM Port is already in use!");

				break;				

		} 

		return -1; 

	}


	else{


		SetupComm(hRS232, 1024, 1024);


		if(!GetCommState (hRS232, &RS232Setting)){

			printf("%i", GetLastError());

			return -1;

		}


		/* Initialise the Array RS232Setting with 0 */

		RS232Setting.DCBlength = sizeof(DCB);

		RS232Setting.BaudRate = BaudRate;

		RS232Setting.Parity = NOPARITY;

		RS232Setting.StopBits = ONESTOPBIT;	

		RS232Setting.ByteSize = 8;


		/* Flags */ 

		RS232Setting.fBinary = TRUE;

		RS232Setting.fOutxCtsFlow = FALSE;

		RS232Setting.fOutxDsrFlow = FALSE;

		RS232Setting.fDtrControl = FALSE;

		RS232Setting.fRtsControl = RTS_CONTROL_DISABLE;

		RS232Setting.fDsrSensitivity = FALSE;

		RS232Setting.fOutX = FALSE;

		RS232Setting.fInX = FALSE;


		/* Now configure the Device according to the DCB Memset */

		if(SetCommState(hRS232, &RS232Setting) == 0){

			printf("%i",GetLastError());

			CloseHandle(hRS232);

			return -1;

		}


		/*Set Comm Port Timeout's */

		RS232Timeout.ReadIntervalTimeout		=55;

		RS232Timeout.ReadTotalTimeoutConstant		=150;

		RS232Timeout.ReadTotalTimeoutMultiplier		=100;

		RS232Timeout.WriteTotalTimeoutConstant		=75; 

		RS232Timeout.WriteTotalTimeoutMultiplier	=10; 


		if(!SetCommTimeouts(hRS232, &RS232Timeout)){

			CloseHandle(hRS232);

			return -1;

		}


		PurgeComm(hRS232,PURGE_RXABORT|PURGE_RXCLEAR);


		RS232IsOpened = true;

		return 0;

	}

}


Kann hier jemand erkennen wo das Problem liegt? Da ich mit der seriellen Schnitstelle unter Win noch fast keine Erfahrung habe bin ich mir auch nicht sicher ob das überhaupt der richtige Weg um zu pollen.

Was funktioniert ist wenn ich etwas auf RS232 schreibe und dann sofort mit READ lese kann ich die Antwortnachricht problemlos lesen.

Was aber überhaupt nicht funktioniert ist dieses pollen um zu prüfen ob bytes empfangen wurde.

Verwende Win XP und MS Visual C++ 2005 Express

Würde mich über jede Hilfe / jeden Tipp sehr freuen

lg

rain

Link zu diesem Kommentar
Auf anderen Seiten teilen

Kann hier jemand erkennen wo das Problem liegt? Da ich mit der seriellen Schnitstelle unter Win noch fast keine Erfahrung habe bin ich mir auch nicht sicher ob das überhaupt der richtige Weg um zu pollen.
Ich vermute, dass es das nicht ist. Ich weiß nicht, ob ClearCommError für den Fall, dass gar kein Fehler aufgetreten ist, überhaupt etwas sinnvolles tut. Dazu kommt, dass du den DCB gar nicht auf Abbruch im Fehlerfall eingestellt hast.

Welche Funktion schlägt denn genau fehl, und was liefert GetLastError?

Und warum pollst du überhaupt? Auf Multitaskingbetriebssystemen ist Polling meist die schlechtere Wahl. Warte doch einfach mit ReadFile, und klemm deinen eigenen Puffer dahinter.

Link zu diesem Kommentar
Auf anderen Seiten teilen

danke für den reply

Das Problem ist dass ich keine Möglichkeit finde wie ich prüfen kann ob sich Bytes im Empfangsbuffer befinden!?

Ich will das programm so einfach als möglich halten, daher versuche ich es mit polling.

@Klotzkopp

Was meinst du mit

Dazu kommt, dass du den DCB gar nicht auf Abbruch im Fehlerfall eingestellt hast.

vielen dank im Voraus

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das Problem ist dass ich keine Möglichkeit finde wie ich prüfen kann ob sich Bytes im Empfangsbuffer befinden!?
Ich verstehe nicht, warum du das überhaupt prüfen musst. Lies die Daten aus, und gut ist.

Ich will das programm so einfach als möglich halten, daher versuche ich es mit polling.
Ich weiß nicht, wie du darauf kommst, dass es mit Polling einfacher sein soll als ohne.

Wenn du es dir so einfach wie möglich machen willst, dann nimm eine Klasse, die sich darum kümmert.

Was meinst du mit

Dazu kommt, dass du den DCB gar nicht auf Abbruch im Fehlerfall eingestellt hast.

Bitte verfolge diesen Ansatz nicht weiter. Ich glaube, das führt zu nichts. Aber wenn du es wirklich wissen willst: Das steht in der MSDN Library bei ClearCommError.
Link zu diesem Kommentar
Auf anderen Seiten teilen

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...