kathi008 Geschrieben 24. September 2007 Geschrieben 24. September 2007 Hallo zusammen! Hab folgendes Problemm: Ich hab ein Windowsprogramm, dass Daten von der seriellen Schnittstelle einliest. Die serielle Schnittstelle wird über USB-Emuliert, d.h. es kann mal COM3 oder COM11 usw. sein. Mein Problemm: Wenn ich die COM fest im Programm angebe, funktioniert es wunderbar. Sobald aber ich die COM über Einstellungsdialog ändern will, sagt das Programm es kann die Schnittstelle nicht öffnen(Obwohl es diesselbe COM ist, und es wird richtig vom Dialog zurückgegeben). Wie löse ich das Problemm????? Mein Programm ist in C++, MFC und ich lese mit ReadFile, wenn jemand hier noch in C++ programmiert, bitte HILFE! Zitieren
Klotzkopp Geschrieben 24. September 2007 Geschrieben 24. September 2007 Mein Programm ist in C++, MFC und ich lese mit ReadFile, wenn jemand hier noch in C++ programmiert, bitte HILFE!Dann schiebe ich dich zuerst einmal ins richtige Forum. Was heißt hier überhaupt "noch"? Zitieren
Guybrush Threepwood Geschrieben 24. September 2007 Geschrieben 24. September 2007 Am Besten zeigst du mal etwas Code, ansonsten wird das eher ein Rätselraten hier. Zitieren
kathi008 Geschrieben 25. September 2007 Autor Geschrieben 25. September 2007 Hallo zusammen! Ich habe ins .net- Forum geschrieben, weil ich in .net programiere, allerdings in C++. Und hier etwas Code: serialPort = new CSerial(); if(serialPort -> Open(sCom, dSpeed)) { portOpen = TRUE; AfxBeginThread(ThreadFunc,this);//Aufruf des Lesethreads } else { portOpen = FALSE; AfxMessageBox("Das Öffnen des COM- Portes ist fehlgeschlangen!"); } BOOL CSerial::Open( CString sPort, DWORD dBaud ) { if( m_bOpened ) return( true ); DCB dcb; //Der Verbindungshandle m_hIDComDev = CreateFile( sPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL ); if( m_hIDComDev == INVALID_HANDLE_VALUE ) return FALSE;//Oeffnen des Portes fehlgeschlagen memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) ); memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) ); COMMTIMEOUTS CommTimeOuts; CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF; CommTimeOuts.ReadTotalTimeoutMultiplier = 0; CommTimeOuts.ReadTotalTimeoutConstant = 0; CommTimeOuts.WriteTotalTimeoutMultiplier = 0; CommTimeOuts.WriteTotalTimeoutConstant = 5000; SetCommTimeouts( m_hIDComDev, &CommTimeOuts ); //Events fuer lesen uns Schreiben m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); m_OverlappedWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ); //Holen der aktuellen Einstellungen des Portes dcb.DCBlength = sizeof( DCB ); GetCommState( m_hIDComDev, &dcb ); //Aendern der Einstellungen auf die gewuenschten Parameter dcb.BaudRate = dBaud; dcb.ByteSize = 8; if( !SetCommState( m_hIDComDev, &dcb ) ||//Wenn Setzten der Paramerter der Einstellung fehlgeschlagen !SetupComm( m_hIDComDev, 10000, 10000 ) ||//Wenn Cash-Speicher reservierung fehlgeschlagen m_OverlappedRead.hEvent == NULL ||//Wenn LesenEvent nicht vorhanden m_OverlappedWrite.hEvent == NULL )//Wenn SchreibeEvent nicht vorhanden { DWORD dwError = GetLastError(); if( m_OverlappedRead.hEvent != NULL ) CloseHandle( m_OverlappedRead.hEvent );//Loeschen der beiden Events if( m_OverlappedWrite.hEvent != NULL ) CloseHandle( m_OverlappedWrite.hEvent ); CloseHandle( m_hIDComDev );//Verbindung schliessen return( FALSE );//Hier bricht das Programm ab } m_bOpened = TRUE; return m_bOpened; } Den Code für den serialPort habe ich von meinem Vorgänger übernommen. Nach Debuggen sieht es so aus als ob das Programm den Cash-Speicher nicht reservieren kann, aber nur, wenn ich den Port aus dem Programmfenster ändere, bei fest eingegebenen Werten funktioniert das ohne Probleme, warum? danke im voraus :beagolisc Zitieren
Klotzkopp Geschrieben 25. September 2007 Geschrieben 25. September 2007 Ich habe ins .net- Forum geschrieben, weil ich in .net programiere, allerdings in C++.Das ist kein .NET, das ist reines C++ mit MFC. Du benutzt vielleicht Visual Studio .NET, aber dein Code hat mit .NET nichts zu tun. Und hier etwas Code: ... DWORD dwError = GetLastError(); Und? Welchen Wert hat dwError? Das ist doch der interessante Teil, wenn SetupComm fehlschlägt. Übrigens: Code-Tags erhöhen die Lesbarkeit Zitieren
kathi008 Geschrieben 25. September 2007 Autor Geschrieben 25. September 2007 Also in dwError steht 'ERROR_INVALID_PARAMETER'. :uppsHabs ganz fergessen mit Code-Tags, sorry. Zitieren
Klotzkopp Geschrieben 25. September 2007 Geschrieben 25. September 2007 Und derselbe Code funtioniert, wenn sCom im Code gesetzt wird? Gib doch bitte mal sCom und dessen Länge in einer MessageBox aus. Zitieren
kathi008 Geschrieben 25. September 2007 Autor Geschrieben 25. September 2007 ja, wenn es im Code gesetzt ist funktioniert es, und der MessageBox zeigt in beiden Fällen z.b. 'COM3, Länge 4'. Mich wundert es auch, warum es nicht funktioniert, bin verzweifelt! Zitieren
Klotzkopp Geschrieben 25. September 2007 Geschrieben 25. September 2007 Zeig doch mal, wie du den String im Programm setzt. Zitieren
kathi008 Geschrieben 25. September 2007 Autor Geschrieben 25. September 2007 Ich habe mein Fehler gefunden, war mein Fehler, hab die dBaud nicht sauber zurückgegeben:upps, vielen danke für deine Hilfe trotzdem:D 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.