Page 1 of 1

Enumerar los puertos serie

Posted: Thu Aug 10, 2017 9:56 am
by groiss
Buenos días.
¿Existe alguna forma de poder conocer los puertos serie disponibles en un equipo, sin tener que recurrir a las llamadas a opencomm()?
He probado con la pequeña función que he puesto más abajo, pero no me devuelve nada

Code: Select all

STATIC FUNCTION puertocom()
LOCAL  oDatos
LOCAL    oLoc:= CreateObject("wbemScripting.SwbemLocator")
LOCAL    oSrv:= oLoc:ConnectServer()
LOCAL  oPuertos:= oSrv:ExecQuery("Select * from Win32_SerialPort")

FOR Each oDatos in oPuertos
    MSGInfo(cValtoChar(odatos:name),"Nombre del Puerto")
NEXT


RETURN Nil
 
Muchas gracias
José Luis

Re: Enumerar los puertos serie

Posted: Fri Aug 11, 2017 2:11 pm
by karinha

Code: Select all

/*
   Function to test for Serial ports and their acceptable speeds.  May run
   differently under different versions of Windows.

   Ned Robertson -- 5/30/2001
*/

#include 'Fivewin.ch'
#include 'fileio.ch'

STATIC nComm

//----------------------------------------------------------------//

Function CommTest ()

LOCAL cF := 'commTest.log', cP, cR, j, i
LOCAL aSpd := { '9600', ; // Ol' Faithful
               '14400', ; // Common modem speed
               '19200', ; // Double Ol' Faithful - popular in telephony
               '28800', ; // Common modem speed
               '33600', ; // semi-common modem speed
               '38400', ; // Quadruple Ol' Faithful - popular in telephony
               '57600', ; // Common modem speed
              '115200'  } // Upper limit of serial port

FErase( cF )

FOR i = 1 TO 4

   cP := LTrim( Str( i ) )

   IF Empty( CommOpen( cP, aSpd[ 1 ] ) )

      CloseComm( nComm )

      FOR j = 1 TO Len( aSpd )

         cR := CommOpen( cP, aSpd[ j ] )

         IF Empty( cR )

            LogFile( cF, { 'Successful Open of COM' + cP + ' at ' + aSpd[ j ] } )

         ELSE

            LogFile( cF, { cR } )

         ENDIF

         CloseComm( nComm )

      NEXT

   ELSE

      LogFile( cF, { 'No port found at COM' + cP } )

   ENDIF

NEXT

   ? "Mira: " + cF

Return NIl

//----------------------------------------------------------------//

Function CommOpen ( cPort, cSpeed )

LOCAL cDcb, cRv := '', cS := 'COM' + cPort + ':' + cSpeed + ',n,8,1'

nComm := OpenComm( 'COM' + cPort, 1024 , 128 )

IF nComm >= 0                     // We have a valid port...

   IF BuildCommDcb( cS, @cDcb ) // Set Speed, etc

      #ifdef __CLIPPER__
         IF SetCommState( cDcb )
      #else   
         IF SetCommState( nComm, cDcb )
      #endif   

         cRv := ''

      ELSE

         cRv := 'Failed to SetCommState on COM' + cPort + ' at ' + cSpeed

      ENDIF

   ELSE

      cRv := 'Failed to BuildCommDCB on COM' + cPort + ' at ' + cSpeed

   ENDIF

ELSE

   cRv := 'Failed to find COM' + cPort

ENDIF

Return cRv

//----------------------------------------------------------------//
 

Re: Enumerar los puertos serie

Posted: Fri Aug 11, 2017 3:40 pm
by karinha
Mira también \samples

TESTCOM?.PRG

saludos.

Re: Enumerar los puertos serie

Posted: Sun Aug 13, 2017 5:18 pm
by groiss
Muchas gracias, pero así es como lo tengo hecho por el momento, pero me obliga a recorrer del COM1 al COM9, y lo que pretendía era obtener directamente los puertos que tenía disponible el equipo.
Un saludo y mi agradecimiento.

Re: Enumerar los puertos serie

Posted: Thu Aug 17, 2017 1:50 pm
by Salvador
Haber si te sirve esto

Code: Select all

/****************************************************
*
* Devuelve un array con los puertos com disponibles en el equipo
* Si no encuentra ninguno devuelve un array vacio
*/
function AvailableComPorts()
local aPorts := {}
local nCom, hFile, cPort

for nCom := 1 to 255
     cPort := "\\.\COM"+ hb_ntos( nCom ) 
     if( ( hFile := FOpen( cPort, FO_READWRITE ) ) != -1 )
      Aadd( aPorts, Padr( "COM"+ hb_ntos( nCom ), 6 ) )
      FClose( hFile )
   endif
next 
return aPorts
 

Re: Enumerar los puertos serie

Posted: Thu Aug 17, 2017 5:18 pm
by groiss
Salvador, muchas gracias, es otra forma de hacerlo, como la de karinha ya la tenía implementada y funciona perfectamente, pero buscaba una forma más elegante, que es la que he puesto, pero por algún extraño motivo no reporta ningun puerto, los haya o no, salvo q ue en algo este equivocado. Creo que si funcionase sería la forma mas correcta, preguntando al sistema los recursos disponibles.
Un saludo
José Luis