2010-07-28 10 views
0

Je vous écris pour ouvrir un port en utilisant cette fonction:ERROR_DEV_NOT_EXIST lorsque :: CreateFile dans C++ MFC?

HANDLE hFile = ::CreateFile(pszComName, GENERIC_READ|GENERIC_WRITE, 0, 0, OPEN_EXISTING, 0,0); 

// Check if we could open the device 
if (hFile == INVALID_HANDLE_VALUE) 
{ 
    DWORD hh= ::GetLastError(); 

       error.Format(_T("test - [%d]"),hh); 

     AfxMessageBox(error,MB_ICONSTOP); 
} 

Je ne peux pas ouvrir le code d'erreur port et le système que je reçois est 55: ERROR_DEV_NOT_EXIST 55 (0x37) de cette list

Que puis-je faire pour ouvrir le port? grâce

EDIT: Je Énumérer Ports comme ceci:

for (UINT i=1; i<256; i++) 
    { 

     CString sPort; 
     sPort.Format(_T("COM%d"), i); 

     HANDLE hPort = ::CreateFile(sPort, GENERIC_READ | GENERIC_WRITE, 0, 0,OPEN_EXISTING,0, 0); 
     if (hPort == INVALID_HANDLE_VALUE) 
     { 
     DWORD dwError = GetLastError(); 
     } 
     else 
     { 
     AfxMessageBox(_T("1 open")); 
     CloseHandle(hPort); 
     } 
    } 

J'ai aussi vérifié les formats suivants:

sPort1.Format (_T ("URT% d"), i);

sPort3.Format (_T ("\. \ COM% d"), i);

sPort4.Format (_T ("\\. \ COM% d"), i);

et sPort5.Format (_T ("\ COM% d"), i);

mais je ne pouvais pas trouver.

Répondre

3

Les noms des ports COM dans Windows CE/Mobile sont au format COMX: - la différence est le signe deux-points (par exemple COM1:).

Votre code devrait ressembler à ceci: CreateFile(L"COM1:",...)

Vous pouvez également vérifier le nom du port dans le registre. Si vous avez une connexion ActiveSync, utilisez un remote registry editor et passez au [HKLM\Drivers\Active] - l'une des sous-clés contiendra l'information du port que vous voulez (en supposant qu'elle se charge correctement).

+0

C'est un deux-points, pas un point-virgule ... –

+0

Correction - merci. – Shaihi

3

La chose évidente à vérifier est de savoir si le nom est correct. Pour un port COM, ce sera normalement quelque chose comme \\.\com1, mais en C ou C++ vous devez échapper toutes les barres obliques inverses, donc cela ressemblera à "\\\\.\\com1" si vous utilisez un littéral de chaîne.

+0

Comment puis-je connaître le nom correct? – Bart

+0

@sam: une façon consiste à énumérer les ports disponibles avec 'EnumPorts', de les mettre dans une liste et de faire en sorte que l'utilisateur sélectionne dans la liste afin qu'il n'y ait aucun moyen d'entrer un nom invalide. Même si les documents pour 'EnumPorts' ne parlent que des ports d'imprimante, les ports série sont inclus. –

+0

l'énumération ne m'a donné aucun résultat comme montrant la modification. – Bart