Rain Geschrieben 26. November 2006 Geschrieben 26. November 2006 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 Zitieren
Klotzkopp Geschrieben 26. November 2006 Geschrieben 26. November 2006 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. Zitieren
Rain Geschrieben 26. November 2006 Autor Geschrieben 26. November 2006 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 Zitieren
Klotzkopp Geschrieben 26. November 2006 Geschrieben 26. November 2006 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. Zitieren
Empfohlene Beiträge
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.