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