Newsgroup: it.comp.programmare.win32
Titolo: Porta seriale con VC++ 6.0

Mi sapete dire come posso fare con VC++ 6.0 per sapere quante e quali
porte seriali sono disponibili sul pc in modo da poter sceglierne una
da usare con CreateFile(..........).
Grazie, ciao.

tibe02 ha scritto:

be', a parte la soluzione banale di provare ad aprirle tutte dalla 1
all'N-esima :D
ci sarebbero le SetupDi.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/DevInst_d/hh/DevInst_d/devindg_2c21d0c2-edc9-44d6-b21a-ee489c60fa59.xml.asp?frame=true
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 all'N-esima :D
magari potresti trovare l'ultima facendo una ricerca binaria partendo da
"COM100" :PPP


da usare con CreateFile(..........).
Scusa la mancanza di commenti... ;)
//////////////////////////////////////////////////////////////////////////////////////
// The following define is from ntddser.h in the DDK. It is also
// needed for serial port enumeration.
#ifndef GUID_CLASS_COMPORT
DEFINE_GUID
(GUID_CLASS_COMPORT,0x86e0d1e0L,0x8089,0x11d0,0x9c,0xe4,0x08,0x00,0x3e,0x30,0x1f,0x73);
#endif
int MyPorteSerialiPresentiSulPc [256];
//////////////////////////////////////////////////////////////////////////////////////
static void MyAzzeraSerialArray (void)
{
int ii;
for (ii=0;ii<256;ii++)
   MyPorteSerialiPresentiSulPc [ii] = 0;
}
//////////////////////////////////////////////////////////////////////////////////////
BOOL MyEnumSerialPortsWdm (void)
{
GUID *guidDev;
BOOL bOk,bRet = TRUE;
SP_DEVICE_INTERFACE_DATA ifcData;
DWORD dwDetDataSize,ii,err;
char fname [256];
HDEVINFO hDevInfo;
SP_DEVICE_INTERFACE_DETAIL_DATA *pDetData;
SP_DEVINFO_DATA devdata = { sizeof (SP_DEVINFO_DATA) };
char *p2;
MyAzzeraSerialArray ();
hDevInfo = INVALID_HANDLE_VALUE;
pDetData = NULL;
guidDev = (GUID*) &GUID_CLASS_COMPORT;
hDevInfo = SetupDiGetClassDevs
(guidDev,NULL,hWndMain,DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (hDevInfo == INVALID_HANDLE_VALUE)
   return FALSE;
bOk = TRUE;
dwDetDataSize = sizeof (SP_DEVICE_INTERFACE_DETAIL_DATA) + 256;
pDetData = (SP_DEVICE_INTERFACE_DETAIL_DATA*) new char
[dwDetDataSize];
if (pDetData == NULL)
   return FALSE;
ii = 0;
while (1)
   {
   ifcData.cbSize = sizeof (SP_DEVICE_INTERFACE_DATA);
   bOk = SetupDiEnumDeviceInterfaces
(hDevInfo,NULL,guidDev,ii,&ifcData);
   if (bOk == FALSE)
      {
      err = GetLastError ();
      if (err != ERROR_NO_MORE_ITEMS)
         {
         bRet = FALSE;
         break;
         }
      else
         break;
      }
   pDetData->cbSize = sizeof (SP_DEVICE_INTERFACE_DETAIL_DATA);
   bOk = SetupDiGetDeviceInterfaceDetail
(hDevInfo,&ifcData,pDetData,dwDetDataSize,NULL,&devdata);
   if (bOk == FALSE)
      {
      bRet = FALSE;
      break;
      }
   bOk = SetupDiGetDeviceRegistryProperty
(hDevInfo,&devdata,SPDRP_FRIENDLYNAME,NULL,
                  (PBYTE) fname,sizeof (fname),NULL);
   if (bOk == FALSE)
      {
      bRet = FALSE;
      break;
      }
   if ((p2 = strstr (fname," (COM")) != NULL)
      {
      p2 += 5;
      MyPorteSerialiPresentiSulPc [atoi (p2)] = 1;
      }
   ii++;
   }
delete pDetData;
SetupDiDestroyDeviceInfoList (hDevInfo);
if (bRet == FALSE)
   MyAzzeraSerialArray ();
return bRet;
}

 da usare con CreateFile(..........).
Per esempio:
http://www.codeproject.com/system/listports.asp
Tuttavia mi resta un po' oscura la tua domanda, di solito si ha esigenza 
di accedere ad una specifica porta (quella dove c'è collegato un 
dispositivo) e non una porta scelta fra quelle disponibili...

emmeesse ha scritto:

Il mio problema è che devo collegare un dipositivo tramite USB ad una
virtual comm port e quindi devo capire a quale numero di COM è
abbinato.

 partendo da "COM100" :PPP
Non è detto che le COM siano consecutive, anzi, nel caso di dongle USB 
o aggeggi simili (ex: cavi di collegamento ai telefonini) è molto 
probabile che le porte continuino a incrementare il loro indice a ogni 
ricollegamento del device o, a volte, ogni volta che lo ricolleghi a 
una porta/hub diverso.
-- 
Valter Minute
(the reply address of this message is invalid)
(l'indirizzo di reply di questo messaggio non è valido)

Valter Minute ha scritto:

è per questo motivo che tutte le volte devo controllare le COM
disponibili, per capire a quale è abbinata.Se hai suggerimenti diversi
fammi sapere, ciao.