TODOPIC

Lenguajes de programación para PC => Visual Basic => Mensaje iniciado por: LABmouse en 29 de Mayo de 2007, 15:59:57

Título: En VB6 como detectar cuantos puertos COM estan disponibles en el PC??
Publicado por: LABmouse en 29 de Mayo de 2007, 15:59:57
Hola a todos, como se puede hacer en visual basic 6.0 para detectar los puertos COM que estan instalados en el PC, ocurre que estoy diseñando un modulo que convierte de USB a RF.

para ello usare el CHIP CP2102 que convierte de USB -> RS232.

(http://img119.imageshack.us/img119/7138/cp2102presswebfi9.jpg)

y a este le conecto el Modulo Xbee que convierte de RS232->RF
(http://img503.imageshack.us/img503/4121/550010blo1.jpg)

Entonces estoy programando en Visual Basic para hacer las pruebas.

(http://img108.imageshack.us/img108/949/detectarlc9.png)

Y quiero que el programa de Visual Basic detecte cuales puertos COM estan instalados en el PC. No los que estan libres, ni tampoco detectar el RF, solo detectar cuales puertos COM estan instalados, para que asi el usuario pueda seleccionar cual de esos es el que corresponde al RF.

Gracias!
Título: Re: En VB6 como detectar cuantos puertos COM estan disponibles en el PC??
Publicado por: LABmouse en 29 de Mayo de 2007, 16:05:04
Es como esto:

Si miramos en el administrador de dispositivos, aparecen los puertos COM disponibles en el PC (marcados en rojo). Algo asi es lo que intento hacer.

(http://img70.imageshack.us/img70/4056/puertosne1.png)


Gracias!

Título: Re: En VB6 como detectar cuantos puertos COM estan disponibles en el PC??
Publicado por: Nocturno en 29 de Mayo de 2007, 16:08:51
SerialPort.GetPortNames (Método) 

Obtiene una matriz con los nombres de los puertos serie del equipo actual.

Visual Basic (Declaración)
Public Shared Function GetPortNames As String()

Código: Visual Basic
  1. Imports System
  2. Imports System.IO.Ports
  3.  
  4.  
  5.  
  6. Module SerialPortExample
  7.  
  8.     Sub Main()
  9.         ' Get a list of serial port names.
  10.        Dim ports As String() = SerialPort.GetPortNames()
  11.  
  12.         Console.WriteLine("The following serial ports were found:")
  13.  
  14.         ' Display each port name to the console.
  15.        Dim port As String
  16.         For Each port In ports
  17.             Console.WriteLine(port)
  18.         Next port
  19.  
  20.         Console.ReadLine()
  21.  
  22.     End Sub
  23. End Module
Título: Re: En VB6 como detectar cuantos puertos COM estan disponibles en el PC??
Publicado por: LABmouse en 29 de Mayo de 2007, 16:21:28
Perfecto Nocturno, ya la pruebo y comento como ma va.

Gracias!!!
Título: Re: En VB6 como detectar cuantos puertos COM estan disponibles en el PC??
Publicado por: PalitroqueZ en 29 de Mayo de 2007, 16:32:38
¡impresionante Manolo!

¿esa es una api de una dll externa? ó ¿ya viene referenciada en el propio VB?

Título: Re: En VB6 como detectar cuantos puertos COM estan disponibles en el PC??
Publicado por: Nocturno en 29 de Mayo de 2007, 16:39:44
Es una gozada este VB nuevo. Viene dentro de Systems.io
Título: Re: En VB6 como detectar cuantos puertos COM estan disponibles en el PC??
Publicado por: c4_esp_VR en 29 de Mayo de 2007, 17:05:36
Otra forma de hacerlo es mediante el módulo FT232BM y un módulo de radio de easy radio.

Es muy sencillo de hacer, vamos que tardas 2 días en hacerlo, en mi caso hice dos módulos de RF por usb e implementé un chat en C++, los módulos de RF con la caña ya que sin antena y alimentados del propio usb se comunicaba con mi vecino que vive en el segundo y yo en el cuarto y teniendo en cuenta las "malas ondas" :P :P :P :P que hay con el vecino del tercero y las interferencias que tiene que haber...pues alcanza la polla  :D :D :D :D

Aqui os dejo una fotitos de los dós componentes que he utilizado.
Título: Re: En VB6 como detectar cuantos puertos COM estan disponibles en el PC??
Publicado por: LABmouse en 29 de Mayo de 2007, 17:43:02
Pero no me funciona. :( Sera que la estoy usando mal?? Como se usa?

c4_esp_VR, ta bonito ese modulo RF!!  :-)
Título: Re: En VB6 como detectar cuantos puertos COM estan disponibles en el PC??
Publicado por: c4_esp_VR en 29 de Mayo de 2007, 19:06:06
Has intentado a hacerlo en un programita sólo, es decir a hacer el típico chorraprograma para verificar que eso sale...

Con el código que te ha puesto Nocturno recojido de las MSDN te debería de funcionar o no...

Lo acabo de probar en un exe estandar y no funciona porque las librerias que tiene añadidas mi VB no las tiene ya que creo que esas librerías sólo estan en los compiladores de .net o 2005 de todas maneras que te las pase alguien o te las bajas y lo pruebas, eso es al menor el porqué a mi no me funciona  :D :D :D :D :D

Un saludete.
Título: Re: En VB6 como detectar cuantos puertos COM estan disponibles en el PC??
Publicado por: LABmouse en 29 de Mayo de 2007, 19:41:37
Eso era lo que presentia, mire en google, y si me mostraba que era MSDN pero yo tengo VB6.0 y como que no es compatible.
Título: Re: En VB6 como detectar cuantos puertos COM estan disponibles en el PC??
Publicado por: Nocturno en 30 de Mayo de 2007, 01:31:46
Yo tengo instalado el Visual Basic 2005 Express Edition, que es de descarga gratuita desde la web de Microsoft.
Tuve instalado el VB6.0 y la verdad es que el nuevo le da unas pocas vueltas, así que te recomiendo te actualices.
Título: Re: En VB6 como detectar cuantos puertos COM estan disponibles en el PC??
Publicado por: PalitroqueZ en 30 de Mayo de 2007, 15:33:01
Yo tengo instalado el Visual Basic 2005 Express Edition, que es de descarga gratuita desde la web de Microsoft.
Tuve instalado el VB6.0 y la verdad es que el nuevo le da unas pocas vueltas, así que te recomiendo te actualices.

ah ya me sonaba extraño, pensé que el código se ejecutaba en la versión 6.0
Título: Re: En VB6 como detectar cuantos puertos COM estan disponibles en el PC??
Publicado por: odukec en 03 de Junio de 2007, 23:43:10
Hola

Creo que esto te puede ayudar:

creas un modulo clase e insertas el siguiente codigo, claro como para hacerlo mas comodo..

Código: [Seleccionar]
Public Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Public Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type


Public Const FILE_SHARE_READ = &H1
Public Const FILE_SHARE_WRITE = &H2
Public Const OPEN_EXISTING = 3
Public Const FILE_ATTRIBUTE_NORMAL = &H80
 
'// Retorna TRUE si el puerto existe o esta disponible, FAlse en otro caso
Public Function COMAvailable(COMNum As Integer) As Boolean
    Dim hCOM As Long
    Dim ret As Long
    Dim sec As SECURITY_ATTRIBUTES


    hCOM = CreateFile("\.\COM" & COMNum & "", 0, FILE_SHARE_READ + _
        FILE_SHARE_WRITE, sec, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
    If hCOM = -1 Then
        COMAvailable = False
    Else
        COMAvailable = True
        ret = CloseHandle(hCOM)
    End If
End Function

y luego para comprobar un puerto este seria un ejemplo que rellena un combobox con los puertos disponibles:

Código: [Seleccionar]
    For i = 1 To 16
        If COMAvailable(i) Then
            cboComm.AddItem "COMM" & i
        End If
    Next

Saludos
Título: Re: En VB6 como detectar cuantos puertos COM estan disponibles en el PC??
Publicado por: LABmouse en 03 de Junio de 2007, 23:48:58
odukec Gracias!!!!!!!!!!!, ahora me falta arreglar el disco Duro de mi PC y lo pruebo, Muchas Gracias!!!
Título: Re: En VB6 como detectar cuantos puertos COM estan disponibles en el PC??
Publicado por: PalitroqueZ en 04 de Junio de 2007, 16:47:00
un 'truco' para detectar el puerto que interesa, es que el programa los detecte todos, y que deseche los que no estan siempre, y por supuesto que ese que aparezca como nuevo, es que necesitas, de hecho es el que crea la clase.

digo esto porque puede dase el caso que tengas muchos puertos disponibles ¿y cuál de todos es? ese mismo que se conecte en ese instante,

otra idea sería hurgar en la clase (o donde se crea los puertos) y tratar de modificarlo para que nos dé un puerto conocido de antemano y que el programa tenga la certeza cual es.
Título: Re: En VB6 como detectar cuantos puertos COM estan disponibles en el PC??
Publicado por: LABmouse en 04 de Junio de 2007, 17:08:20
Si es cierto!!! La mejor forma seria la siguiente :

El programa pide que desconecte el dispositivo. y lee los puertos actuales.

El programa pide que conecte el dispositivo. El programa mira cual es el nuevo que se conecto y listo!!!! Ya sabe cual es el de la aplicación.

Estoy trabajando pero en arreglar mi disco duro. Apenas tenga algo, intento esa parte.
Título: Re: En VB6 como detectar cuantos puertos COM estan disponibles en el PC??
Publicado por: PalitroqueZ en 04 de Junio de 2007, 17:13:43
ya que estas en esa parte, hay una duda que me surge:

con la api que te mencioné y creo que con el programa de arriba haces la detección, pero... ¿son los puertos en caliente? o ¿son los instalados en la máquina?

pregunto, porque cuando usaba el snoopy pro, éste me mostraba todos los puertos instalados estando y no estando conectados el/los dispositivo(s).

tendras que probarlo y nos cuentas.

Título: Re: En VB6 como detectar cuantos puertos COM estan disponibles en el PC??
Publicado por: LABmouse en 04 de Junio de 2007, 21:47:01
Amigo pedro, cuando tu me mostraste lo del api, y al probarlo, note que este muestra todos los puertos que han sido instalados en el PC, me explico.

Cuando se tienen los conversores USB-RS232, ellos detectan cual numeracion es la que lleva en COM WINDOWS, siempre que instalas uno nuevo, incrementa el numero, hace unos dias, llegaba hasta COM12. Pero OJO esos COM solo están disponibles cuando conectas el dispositivo y el Windows le da el COM correspondiente a cuando le instalaste.

Cuando corrí la aplicación de Visual Basic, este me mostró desde COM1 hasta COM12, pero en el PC solo estaba COM1 (el de la board) y COM 6 que es el de mi USB-RF.

Debe haber una forma de ver solo los que estan disponibles.
Título: Re: En VB6 como detectar cuantos puertos COM estan disponibles en el PC??
Publicado por: c4_esp_VR en 05 de Junio de 2007, 03:35:09
Pues es perfecto si sabes el nº de puertos com que tienes en tu ordenador...pues sólo tienes que hacer un bucle que pase por todos preguntando si estan ocupados o no...con el método busy o si lo prefrieres tambien puedes conectarte a todos usando el método connected si te devuelve un false es que ya lo esta usando otro dispositivo y lo mismo pasa con busy si te devuelve un true es que ya está siendo utilizado por otro dispositivo.

Es lo unico que se me ocurre  :mrgreen: :mrgreen: :mrgreen: :mrgreen:

Un saludete.
Título: Re: En VB6 como detectar cuantos puertos COM estan disponibles en el PC??
Publicado por: odukec en 05 de Junio de 2007, 10:43:48
Hola

Pues con el codigo que postee anteriormente, se que puertos estan disponibles (no estan ocupados y existen), lo unico es que si tengo abierto un com en otro proceso, este no es detectado.

Saludos
Título: Re: En VB6 como detectar cuantos puertos COM estan disponibles en el PC??
Publicado por: LABmouse en 05 de Junio de 2007, 11:44:59
C4 no había intentado con el busy, apenas puedo pruebo, esa en convinacion con el código de odukec, seguro funciona para detectar cual es el COM que necesito.

Gracias!
Título: Re: En VB6 como detectar cuantos puertos COM estan disponibles en el PC??
Publicado por: migsantiago en 15 de Agosto de 2007, 17:57:57
Hola

Necesitaba hacer lo mismo en una aplicación y probé el método de Odukec en VB6, tuve problemas de compilación con unas variables public; no se dejaba compilar.

Hice unos cambios... ahora todo se puede compilar en una sola form.

Código: [Seleccionar]
'Programa que indica que puertos hay disponibles en la pc

Public i As Integer 'hace el rastreo de puertos

'------------------------------------------------------------------------------
'Variables y funciones usadas para detectar disponibilidad de puertos COM
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type
 
'Entrega True si el puerto está disponible y False en caso contrario
Private Function COMAvailable(COMNum As Integer) As Boolean
    Dim hCOM As Long
    Dim ret As Long
    Dim sec As SECURITY_ATTRIBUTES

    hCOM = CreateFile("\.\COM" & COMNum & "", 0, &H1 + _
        &H2, sec, 3, &H80, 0)
    If hCOM = -1 Then
        COMAvailable = False
    Else
        COMAvailable = True
        ret = CloseHandle(hCOM)
    End If
End Function
'------------------------------------------------------------------------------


Private Sub Command1_Click()
    Combo1.Clear 'limpia combo1
    For i = 1 To 16 'busca del com1 al com16 (MSCOMM vb6 solo admite hasta 16)
        If COMAvailable(i) Then 'checa puerto por puerto
            Combo1.AddItem "COM " & i 'si existe lo agrega a la lista
        End If
    Next
End Sub

Pueden encontrar los archivos del proyecto en

http://todopicsan.4shared.com

Incluso funciona bajo winxp y usando puertos com virtuales (usb-232, tibbo, etc.). El detalle es que hay que poner los puertos virtuales justo después del último com instalado; por ejemplo, si hay com1, el virtual debe ser com2. Intenté poner un com16 y no lo detectó.

Gracias Odukec
Título: Re: En VB6 como detectar cuantos puertos COM estan disponibles en el PC??
Publicado por: LABmouse en 15 de Agosto de 2007, 18:03:38
Gracias migsantiago!!   :-/