Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

COM Port - Empfangene Bytes auslesen

Empfohlene Antworten

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

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.

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

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.