Newsgroup: it.comp.lang.delphi
Titolo: Porte COM

Salve a tutti innanzitutto.
Devo utilizzare una COM virtuale per scaricare dati da un terminale portatile con uscita USB. 
Il mio problema è che se il terminale non è connesso la porta COM non esiste proprio quindi se provo ad aprirla (uso CPortLib in Delphi 10) non trovandola mi da giustamente un access violation. Allora prima di provare ad aprirla vado a vedere se effettivamente esiste utilizzando FileExists('COMx'), ma nonostante su Gestione Dispositivi non ci sia la COMx FileExists mi ritorna comunque True. E di conseguenza ho l'access violation.
Vi vengono in mente altri modi per testare l'esistenza della COM ?
 
Saluti,
Paolo


Facile Facile... la routine ritorna nel vettore Porte_Disponibili la 
lista delle seriali trovate (1, 2, 3, 4, etc..) e come ritorno della 
funzione il numero di quelle trovate. Ho impostato Max_Seriali a 100 in 
quanto è abbastanza improbabile che in un computer ci siano pià di 100 
porte com
 
Const
     Max_Seriali = 100;
Type
    TPorte_Disponibili  = Array[1..Max_Seriali] Of Byte;
 
Function Lista_Seriali_Disponibili(Var Porte_Disponibili : 
TPorte_Disponibili) : Byte;
Var
   I       : Byte;
   S       : String;
   N_Porte : Byte;
   Handle  : THandle;
Begin
   // ------------------------------
   // Nessuna porta trovata
   // ------------------------------
   N_Porte := 0;
 
   // ------------------------------
   // Ciclo per tutte le porte
   // ------------------------------
   For I := 1 To Max_Seriali Do
       Begin
         // ------------------------------------------------
         // Il nome del file deve essere del tipo '\\.\COMx'
         // ------------------------------------------------
         SysUtils.FmtStr(S, '\\.\COM%-d', [I] );
 
         // ------------------------------------------------
         // Tento di aprire la seriale
         // ------------------------------------------------
         Handle := CreateFile(PChar(S),
                              GENERIC_READ or GENERIC_WRITE,
                              0,
                              Nil,
                              OPEN_EXISTING,
                              FILE_ATTRIBUTE_NORMAL,
                              0);
 
         // ------------------------------------------------
         // Se l'handle e' uguale a INVALID_HANDLE_VALUE
         // non sono riuscito ad aprirla
         // (o perche' non esiste o perche' e' gia' in uso)
         // ------------------------------------------------
         If Handle <> INVALID_HANDLE_VALUE Then
            Begin
              // ------------------------------------------------
              // Incremento il numero di porte trovate
              // ------------------------------------------------
              Inc(N_Porte);
 
              // ------------------------------------------------
              // Memorizzo il numero della porta
              // ------------------------------------------------
              Porte_Disponibili[N_Porte] := I;
 
              // ------------------------------------------------
              // Chiudo la COM
              // ------------------------------------------------
              CloseHandle(Handle);
            End;
       End;
 
   Result := N_Porte;
End;
 

Il giorno giovedì 13 dicembre 2012 14:33:59 UTC+1, microges ha scritto:
 
Sei un grande, grazie!
Spero ti sia divertito con un pò di programmazione spicciola :)
 
Saluti e grazie ancora.