Enumerar los puertos serie

Enumerar los puertos serie

Postby groiss » Thu Aug 10, 2017 9:56 am

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  Expand view
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
groiss
 
Posts: 217
Joined: Tue Sep 01, 2009 7:55 am
Location: Plasencia - ESPAÑA

Re: Enumerar los puertos serie

Postby karinha » Fri Aug 11, 2017 2:11 pm

Code: Select all  Expand view

/*
   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

//----------------------------------------------------------------//
 
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7152
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Enumerar los puertos serie

Postby karinha » Fri Aug 11, 2017 3:40 pm

Mira también \samples

TESTCOM?.PRG

saludos.
João Santos - São Paulo - Brasil - Phone: +55(11)95150-7341
User avatar
karinha
 
Posts: 7152
Joined: Tue Dec 20, 2005 7:36 pm
Location: São Paulo - Brasil

Re: Enumerar los puertos serie

Postby groiss » Sun Aug 13, 2017 5:18 pm

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.
groiss
 
Posts: 217
Joined: Tue Sep 01, 2009 7:55 am
Location: Plasencia - ESPAÑA

Re: Enumerar los puertos serie

Postby Salvador » Thu Aug 17, 2017 1:50 pm

Haber si te sirve esto
Code: Select all  Expand view

/****************************************************
*
* 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
 
Saludos
Salvador
Salvador
 
Posts: 144
Joined: Sun Dec 18, 2005 3:18 pm
Location: España

Re: Enumerar los puertos serie

Postby groiss » Thu Aug 17, 2017 5:18 pm

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
groiss
 
Posts: 217
Joined: Tue Sep 01, 2009 7:55 am
Location: Plasencia - ESPAÑA


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: karinha and 13 guests