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
VS 2003 und VS 2008 getestet
OS: XP, Vista, Win 7
Problem nur bei BlueTooth Ports
Danke für eure Hilfe.
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.