Veröffentlicht 24. September 200717 j 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!
24. September 200717 j 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"?
24. September 200717 j Am Besten zeigst du mal etwas Code, ansonsten wird das eher ein Rätselraten hier.
25. September 200717 j Autor 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
25. September 200717 j 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
25. September 200717 j Autor Also in dwError steht 'ERROR_INVALID_PARAMETER'. :uppsHabs ganz fergessen mit Code-Tags, sorry.
25. September 200717 j Und derselbe Code funtioniert, wenn sCom im Code gesetzt wird? Gib doch bitte mal sCom und dessen Länge in einer MessageBox aus.
25. September 200717 j Autor 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!
25. September 200717 j Autor Ich habe mein Fehler gefunden, war mein Fehler, hab die dBaud nicht sauber zurückgegeben:upps, vielen danke für deine Hilfe trotzdem:D
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.