Zum Inhalt springen

c++ serielle schnittstelle einstellen


kathi008

Empfohlene Beiträge

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ;)

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...