Programación General > Visual Basic para principiantes

 Envio De Datos Basic

<< < (2/2)

Nebire:
Bueno eso lo puedes hacer recorriendo todos los puertos y detectando cual te da error para descartarlo, a partir de ello tomas una lista. No obstante tampoco es necesario disponer de la lista si sólo vas a ocupar uno, sin embargo siempre será interesante poder conocer las opciones disponibles...

Un posible código podría ser algo como lo siguiente. Nota que hay cosas sin asignar (por ejemplo Settings) y que hay otras que se pueden suprimir (por ejemplo asignación y reasignación del objeto error), además no lo he probado es un código rápido y pudiera necesitar corregirse, en cualquier caso deberás adaptarlo a tus necesidades. en principio lo pruebas y paso a paso  (tecla f8) para comprobar que funciona correctamente y ya lo modificarás como te parezca conveniente.


--- Código: Text --- 'en un módulo coloca esta línea:Public puertos() As Integer ' en el formulario pondrías esto, que responde a un botón, tu posiblemente deberías ponerlo en el load del formulario o en el main de un módulo si arrancas desde módulo.Private Sub Command1_Click()    Call Examinar_PuertosEnd Sub ' las siguientes funciones las puedes colocar indistintamente en el formulario o en un módulo, irían mejor en un módulo, separado del código de manejo de los controles, pero si lo cambias a un módulo, está 1ª rutina debes hacerla de pribate a public, para que la llamada: 'call Examinar_Puertos' pueda localizarla.Private Function Examinar_Puertos()    puertos = Detectar_Puertos ' contiene la matriz de los 16 puertos con valores true-false (1-0)    puertos = filtrar_Puertos  ' filtramos para obtener sólo los true    If puertos(0) &#60;&#62; 0 Then       ' se podrían poner en un listbox para cambiar si un puerto arrojara problemas       '   o si eso ocurre se podría volver a ejecutar nuevamente la rutina de detección de puertos        MSComm1.CommPort = puertos(1) ' tomamos el primero de los hallados, es lo más consecuente        MSComm1.PortOpen = True       'MSComm1.Settings= ' establecemos las características que deseemos y qeu sean acorde a nuestro hardware       ' otras acciones    Else        MsgBox &#34;No se encontraron puertos disponibles&#34;    End IfEnd Function ' intenta 'ver' que puertos hay disponiblesPrivate Function Detectar_Puertos() As Integer()    Dim puertosExistentes(1 To 16) As Integer    Dim nError As Long        Dim PrevioError As ErrObject    Set PrevioError = Err   ' guardamos el error previo (si se desea, si no, se puede obviar)    Err.Number = 0 ' reseteamos cualquier posible error previo...        On Local Error GoTo ErrorPuerto   ' si se encuentra un errror salta a la etiqueta indicada        For k = 1 To 16                MSComm1.CommPort = k     ' aquí esperamos recibir un error        'MSComm1.PortOpen = False        If nError = 0 Then            MSComm1.PortOpen = True   ' aquí esperamos recibir un error                        If nError = 0 Then                puertosExistentes(k) = 1 ' es ok no generó error                MSComm1.PortOpen = False  ' si no se pudo abrir dará error de no está abierto            Else                nError = 0   ' reseteamos error para detedtarlo en el próximo ciclo            End If        Else           nError = 0  ' reseteamos error para detedtarlo en el próximo ciclo        End If    Next        Err = PrevioError   ' si asignamos el error previo a la entrada, se lo devolvemos        Detectar_Puertos = puertosExistentes    Exit Function    ErrorPuerto:    nError = Err.Number    ' errores 8002, 8005, 8012  ' no está disponible...        MsgBox &#34;.se detectó otro error en el puerto &#34; & k & &#34; el mensaje devuelto fue: &#34; & Err.Description & vbCrLf & _        &#34;    ... al cerrar este mensaje se continúa explorando.&#34;, vbExclamation, &#34;Explorando puertos ...&#34;        Resume Next  ' no salgo, contínuo con la sigte. línea que dió errorEnd Function ' filtra la matriz de puertos ahora sólo contendrá los disponibles.'  su contenido ahora es el nº de puertoPrivate Function filtrar_Puertos() As Integer()    Dim p() As Integer    Dim x As Integer  ' contador de puertos 'válidos'    ReDim p(0 To 0)   ' p(0) se usa para saber cuantos se encontraron... asegura no devolve una matriz vacía    For k = 1 To 16        If puertos(k) = 1 Then            x = x + 1            ReDim Preserve p(0 To x)            p(x) = k        End If    Next        p(0) = x    filtrar_Puertos = pEnd Function   

estebanreinoso83:
Amigo Nebire acabo de probar tu programa y en verdad funciona porque escanea los puertos y solo me da error en los puertos que no estan habilitados, hasta ahi todo bien solo que en la parte:
[CODE] If puertos(0) > 0 Then
      ' se podrían poner en un listbox para cambiar si un puerto arrojara problemas
      '   o si eso ocurre se podría volver a ejecutar nuevamente la rutina de detección de puertos
       MSComm1.CommPort = puertos(1) ' tomamos el primero de los hallados, es lo más consecuente
       MSComm1.PortOpen = True
      'MSComm1.Settings= ' establecemos las características que deseemos y qeu sean acorde a nuestro hardware
      ' otras acciones

Me gustaria que el programa no habilite el primer puerto encontrado sino que me muestre a mi los puertos válidos y me de la posibilidad de escojer el puerto que yo desee.

Perdon la insistencia y las molestias pero soy bastante ignorante en cuanto a basic y me gustaria que me des esta mano final.
Gracias de antemano
Esteban

Nebire:

--- Citar ---Me gustaria que el programa no habilite el primer puerto encontrado sino que me muestre a mi los puertos válidos y me de la posibilidad de escojer el puerto que yo desee.
--- Fin de la cita ---

El código te da una matriz con los puertos 'capaces' , ya te indico que podrías ponerlos en una lista (control listbox o control combobox) y una vez que arranque el programa (o en un formulario aparte) pulsar un botón para activar el puerto que se elija. Yo te he puesto el 1º como un indicativo de que ya está ahí la respuesta, la 'saca' está llena cualquiera en su interior puedes elegirlo.


Bueno compañero, el resto debes hacerlo tú empleando tus conocimientos y esforzándote. De otro modo sería una tarea. Yo ya te he ayudado el resto corre de tu cuenta.

Debes entender que no se puede dar todo mascado, tu debes ser el que se involucre en obtener el resultado, los que respondemos solo hacemos de guía y aunque a veces se den partes de código completo o casi completo y más o menos funcional se hace sólo por que a veces es más sencillo mostrar un código que explicar y redactar que algo se hace de esta o aquella manera si alfinal no estás seguro de que se vaya a entender bien.

En el resto debes poner el esfuerzo de tu parte...

estebanreinoso83:
Amigo Nebire

Perdona que vuelva a molestar pero la verdad e intentado solucionar la parte de codigo que me falta y no he podido, creo q la falta de tiempo tambien me afecta mucho, pues trabajo y viajo bastante y caso no dispongo de tiempo libre, ademas tengo que entregar pronto el proyecto sino me hago pedazos.
Podrias aunq sea darme una pista de como conseguir la ultima parte del codigo? solo eso de presentar los puertos en una listbox y como puedo escojer uno de ellos.

Gracias
Esteban

Nebire:
En el mensaje anterior te puse todo el código, las modificaciones a realizar son mínimas. El siguiente código es una copia de una función que te puse en el mensaje anterior.

--- Código: Text --- Private Function Examinar_Puertos()   puertos = Detectar_Puertos ' contiene la matriz de los 16 puertos con valores true-false (1-0)   puertos = filtrar_Puertos  ' filtramos para obtener sólo los true   If puertos(0) &#60;&#62; 0 Then      ' se podrían poner en un listbox para cambiar si un puerto arrojara problemas      '   o si eso ocurre se podría volver a ejecutar nuevamente la rutina de detección de puertos       MSComm1.CommPort = puertos(1) ' tomamos el primero de los hallados, es lo más consecuente       MSComm1.PortOpen = True      'MSComm1.Settings= ' establecemos las características que deseemos y qeu sean acorde a nuestro hardware      ' otras acciones   Else       MsgBox &#34;No se encontraron puertos disponibles&#34;   End IfEnd Function  
Entonces la parte a retocar es lo que hay dentro de la comprobación de la matriz:

--- Código: Text ---     ' se añade esta línea    list1..clear  ' vaciamos el contenido previo     If puertos(0) &#60;&#62; 0 Then   '......... aquí van los cambios       Else         MsgBox &#34;No se encontraron puertos disponibles&#34;    End If   '......... se añade esta línea también   commandConectar.enabled= false  ' de entrada se desactiva hasta que se pulse en el listbox, (si es que hay alguno    list1.enabled=list1.listcount&#60;&#62;-1 ' el listbox sólo debe estar activado si tiene contenido.   
Lo que hay que hacer es poner un bucle que introduzca los puertos de la matriz en el listbox.

--- Código: Text ---           for k=0 to ubound(puertos)          list1.additem(puertos(k))  ' se añaden al listbox     next  
El cambio que hemos hecho hasta el momento,  es llenar el listbox. El código que antes había donde se ha insertado éste es el código que se debe poner en el evento click del botón 'conectar al puerto seleccionado'. El puerto seleccionado será el que esté seleccionado en el listbox, de entrada quedamos sería más correcto dejar el botón desactivado y sólo activarlo en caso de que se seleccione uno en el listbox, esto implica que si no hubiera puertos disponibles el listbox estaría vacío y por tanto no se podría pulsar el botón de 'conectar usando el puerto seleccionado', porque no hay ninguno disponible.

en el evento click del listbox:


--- Código: Text ---      commandConectar.enabled= (list1.listindex&#60;&#62; -1)  y finalmente en el evento click del botón para conectar, se coloca lo que hemos sacado del condicional anterior alterando para usar el puerto seleccionado en el listbox:

--- Código: Text ---     '  esta línea es la que era antes, ahora la modificamos para que tome la selección del listbox     'MSComm1.CommPort = puertos(1) ' tomamos el primero de los hallados, es lo más consecuente      '.....esta línea siguiente se usa sólo para comprobación, quitar cuando verifiques que funciona bien      dim usar as vbmsgboxresult      usar = msgbox (&#34;Seguro que quiere usar el puerto Nº -&#34; & list1.list(list1.listindex) & &#34;- ? &#34;, vbyesno, &#34;Que puero libre usamos...&#34;)     if usar= vbno then exit sub       ' esta es la línea modificada      MSComm1.CommPort = list1.list(list1.listindex)        MSComm1.PortOpen = True      'MSComm1.Settings= ' establecemos las características que deseemos y quu sean acorde a nuestro hardware      ' otras acciones       ' una vez usado el puerto deseado hay que desactivar el listbox y el botón, o no según convenga de acuerdo a lo que vayas  a hacer.... Si vas a tal sitio y has decidido usar la carretera norte, las demás deben quedar desactivadas o puede ocurrir que te pierdas.... por la confusión....     list1.enabled=false  ' cuando se haga un chequeo de puertos el listbox se activa si hay puertos diponibles.     commandConectar.enabled=false  



En verdad todo esto es muy sencillo, así no entiendo como puedes entregar un proyecto sin conocer estas simplezas. Si no sabes resolver esto, creo que no mereces lo que sea que esperas obtener al entregar dicho proyecto. Pués que pasará cuando realmente surja algo realmente complejo ???

Navegación

[0] Índice de Mensajes

[*] Página Anterior

Ir a la versión completa