BlueTooth vs Com Port

CodeFatal

Erfahrenes Mitglied
Hallo,

ich habe eine MFC-Dialogfeldbasierende Software geschrieben, welche ein Gerät mit FTDI Chipsatz über USB anspricht.
Für das Gerät wird von Windows ein Com Port angelegt.
Die Software durchsucht den Rechner nach offenen Com Ports und kommuniziert kurz mit dem Gerät, ob es sich um das richtige handelt.
Es werden ohne Probleme auch Ports >10 angesprochen.
Software funktioniert nach Deinstallation von BlueTooth oder nachträglicher Installation von BlueTooth einwandfrei.
Soweit so gut.

Das Problem:
- Jungfräulicher Rechner
- BlueTooth Dongle installiert (z.B. BlueSolei oder integrierter Dongle in Rechner von Großer Supermarktkette (Axxx)) -> Benutzt Port 3-19
- FTDI Gerät angeklemmt -> Benutzt Port 20 (die davor sind ja nicht mehr frei;))
- Software starten
- Port 3 lässt sich öffnen
- Daten können gesendet werden - zumindest kommt die Write-Funktion zurück
- Beim Versuch daten zu lesen, wird ReadFile leider nicht mehr verlassen und Programm hängt bis zum Rechnerneustart.

Kennt jemand das Problem? Laut MSDN sollte die ReadFile verlassen werden.
Ob ein BlueTooth Dongle wirklich eingesteckt ist oder nicht, spielt keine Rolle.

Mein Code
Code:
	DCB dcbold,dcbnew;
	BOOL bResult= FALSE;
	unsigned long  nwrite=0;
	unsigned long  nread=0;
	unsigned char buf[MSG_LENGTH];
	HANDLE hComPort;//handel auf den ComPort

	if(WriteReadTd.hCom)//Ist bereits ein Port geöffnet
		CloseHandle(WriteReadTd.hCom);//Port schließen
	WriteReadTd.hCom = NULL;

	//ComPort öffnen
	hComPort = CreateFile ( Com,
		GENERIC_WRITE | GENERIC_READ,
		0,
		NULL,
		OPEN_EXISTING,
		0,
		NULL);

	if(!hComPort)return E_FAIL;
	if(hComPort == INVALID_HANDLE_VALUE)return E_FAIL;

	DWORD err = 0;
	COMMTIMEOUTS  ctmoOld,ctmoNew;
	//Timeouts werden so gesetzt, das nur das zurück gegeben wird, was auch wirklich benötigt wird
	GetCommTimeouts(hComPort,&ctmoOld);
	ctmoNew = ctmoOld;
	ctmoNew.ReadIntervalTimeout = MAXDWORD;
	ctmoNew.ReadTotalTimeoutConstant = 0;
	ctmoNew.ReadTotalTimeoutMultiplier = 0;
	ctmoNew.WriteTotalTimeoutMultiplier = 0;
	ctmoNew.WriteTotalTimeoutConstant = 500;
	if(!SetCommTimeouts(hComPort, &ctmoNew)) // COM-Einstellungen speichern
		err = GetLastError();

	ZeroMemory(&dcbnew,sizeof(DCB));
	ZeroMemory(&dcbold,sizeof(DCB));
	dcbnew.DCBlength = sizeof(DCB);// setzen der Blocklaenge, muss erfolgen
	dcbold.DCBlength = sizeof(DCB);// setzen der Blocklaenge, muss erfolgen
	GetCommState (hComPort, &dcbold); // COM-Einstellungen laden
	dcbnew = dcbold;
	dcbnew.BaudRate = Baud; 
	dcbnew.ByteSize = ByteSize;
	dcbnew.Parity = Parity;
	dcbnew.StopBits = StopBits; 
	if(!SetCommState (hComPort, &dcbnew)) // COM-Einstellungen speichern
		err = GetLastError();

	if(!hComPort)
	{
		SetCommTimeouts(hComPort, &ctmoOld); // COM-Einstellungen speichern
		SetCommState (hComPort, &dcbold); // COM-Einstellungen speichern
		return E_FAIL;
	}
	if(hComPort == INVALID_HANDLE_VALUE)
	{
		SetCommTimeouts(hComPort, &ctmoOld); // COM-Einstellungen speichern
		SetCommState (hComPort, &dcbold); // COM-Einstellungen speichern
		return E_FAIL;
	}

	//Dongel finden
	SMsg msg;

	ZeroMemory(buf,sizeof(char)*MSG_LENGTH);
             buf[0] = BIST_DU_MEINS; // Gerät wird antworten wenn es richtig ist

	bResult = WriteFile(WriteReadTd.hCom,(LPVOID)buf,MSG_LENGTH,&nwrite,NULL);
	if(!bResult || nwrite != MSG_LENGTH)
	{
		SetCommTimeouts(hComPort, &ctmoOld); // COM-Einstellungen speichern
		SetCommState (hComPort, &dcbold); // COM-Einstellungen speichern
		CloseHandle(hComPort);//Port schließen
		WriteReadTd.hCom = NULL;

		return E_FAIL;
	}
	
...//Wartezeiten etc abwarten, die von Hardware vorgegeben werden.

             bResult = ReadFile(WriteReadTd.hCom, &buf, readmsg-re, &nread, NULL);
	if(!bResult || nwrite != MSG_LENGTH)
	{
		SetCommTimeouts(hComPort, &ctmoOld); // COM-Einstellungen speichern
		SetCommState (hComPort, &dcbold); // COM-Einstellungen speichern
		CloseHandle(hComPort);//Port schließen
		WriteReadTd.hCom = NULL;

		return E_FAIL;
	}
//Geräte Antwort analysieren
...


	return S_OK;

VS 2003 und VS 2008 getestet
OS: XP, Vista, Win 7
Problem nur bei BlueTooth Ports

Danke für eure Hilfe.
 
Zurück