Autor Tema: como monitorear el estado de un COMx  (Leído 9197 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado PalitroqueZ

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
como monitorear el estado de un COMx
« en: 17 de Enero de 2007, 13:58:06 »
Estuve dudando sobre si podía hacer esta pregunta a este tiempo, pero ahí vá.

Quisiera añadir un código de detección para saber cuando está conectado un circuito a puerto COMx, el código que se me ocurrio fué este:

Código: [Seleccionar]
Private Sub Form_Load()
    MSComm1.CommPort = 4
    MSComm1.OutBufferSize = 1 'tamaño del dato a transmitir
   
    Timer1.Interval = 50
    Timer1.Enabled = True
End Sub

///////////////////
Private Sub Form_Unload(Cancel As Integer)
If MSComm1.PortOpen = True Then
    MSComm1.PortOpen = False
End If
End Sub

///////////////////////////////////////////////////
Private Sub Timer1_Timer()
On Error GoTo paca
If MSComm1.PortOpen = True Then
Exit Sub
Else
MSComm1.PortOpen = True
revisar
Exit Sub
End If
paca: Debug.Print Err.Number & ": " & Err.Description
     Select Case Err.Number
        Case 8002   'Número de puerto no válido
        revisar
        Case 8005 'el puerto ya está abierto
            revisar
        Case 8012 '8012 el dispositivo no está abierto
              revisar
    End Select
      Exit Sub
End Sub
///////////////////////////////////////////
Sub revisar()
If MSComm1.PortOpen = False Then
    lblestado.Caption = "Desconectado"
Else
    lblestado.Caption = "Conectado"
End If

End Sub

el timer escanea periodicamente abriendo el puerto, si ya está abierto tira un error , pero con el control de errores detengo la ejecución del código y se sale mostrando en una etiqueta que hay conexión (mediante el caso 8005)

pero el problema que se presenta, es que cuando desconecto el cable me sigue apareciendo que el puerto está abierto y ¿como? si ya el COM está libre, entonces si cambio el código las demas comprobaciones son las que presentan problemas (no conexión) , es decir, el puerto está abierto cuando: el cable está conectado y cuando no está conectado.

el caso en concreto que quiero hacer es: que en una etiqueta(label) me muestre los dos estados: conectado y desconectado en los casos de: con el cable enchufao, y con el cable no enchufao.


Salu2
Pedro
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: como monitorear el estado de un COMx
« Respuesta #1 en: 17 de Enero de 2007, 14:08:03 »
Palitroquez y no puedes agregar al circuito una linea CTS o RSTS y que el PC la active cuando se conecte?? esa la forma que uso. Yo trabajo en CCS y si le doy la instruccion de esperar un dato por RS232 se bloquea hasta que legue tal. y si no esta conectado el PC !!!!!!! :shock:. Se bloque a PIC y pues me tocaba usar el WDT.

Desconectado PalitroqueZ

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: como monitorear el estado de un COMx
« Respuesta #2 en: 17 de Enero de 2007, 14:20:03 »
Hola PICmouse, no había pensado en darle uso a esas lineas. pero no se si es posible, veras el COM que estoy usando es virtual y sólo es una emulación de un puerto físico que es por USB.


Salu2
Pedro
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: como monitorear el estado de un COMx
« Respuesta #3 en: 17 de Enero de 2007, 14:38:54 »
Palitroquez el programa que permite ver bien eso y ademas controlr las del PC, se llama Hercules lo puedes bajar de internet. si no lo encuentras me dices y te ayudo, ya que ese progama es gratuito.

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: como monitorear el estado de un COMx
« Respuesta #4 en: 17 de Enero de 2007, 14:40:28 »
aaa
perdon ya entendi la pregunta. Pues la verdad no se como es el codigo del PIC que permite controlar esas lineas. Preguntarle RedPic o a JIM. para ver como es posile, ya que ellos son los maestros en ese tema.  :mrgreen:

Desconectado IOIO

  • PIC10
  • *
  • Mensajes: 46
Re: como monitorear el estado de un COMx
« Respuesta #5 en: 18 de Enero de 2007, 13:53:18 »
Hola Palitroquez, quería aclararte una cosa con respecto a lo que afirmas sobre el puerto:
Que desconectes el cable rs232 no implica que el puerto no pueda permanecer abierto; cuando abres un puerto, de alguna manera estás habilitandolo para poder enviar y recibir información a través de él, que el cable este o no conectado permitirá que la información llegue  o no al equipo destino (el PIC). Pero que quede claro que puedes abrir el puerto sin tener nada conectado a él.
Creo entender que lo que tu deseas es poder detectar cuando el Pic está conectado a la PC, si es así te sugiero enviar desde la PC con determinada regularidad un caracter al puerto y que el Pic te conteste con otro (haría un eco) para que la aplicación en la PC se "diera cuenta"que el Pic esta conectado, obviamente debes esperar cierto tiempo y si nada llega como respuesta podras indicar que no está conectado el Pic.
Por otro lado te recuerdo que no es recomendable conectar y desconectar el cable RS232 mientras la PC y el Pic esten alimentados, dado que podrían averiarse los mismos.

Espero haberte ayudado en algo.
Saludos
Sergio
Desde Avellaneda, Buenos Aires. Argentina

Saludos,
Sergio

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: como monitorear el estado de un COMx
« Respuesta #6 en: 18 de Enero de 2007, 14:08:18 »
Pero lo que no se quiere es que el PC permanentemente este pendiente si llego la respuesta o "ECO" como le llamas.  Solo preguntar por el estado de RTS o CTS segun el caso es la mejor manera, de esta forma el PC no habre el puerto COM si no hay cable conectado. Ahora Respecto a conectar y desconectar en caliente, recuerda que el Puerto COM lo emulara un PIC18F2550, por lo que realmente es USB y este si esta hecho para conectar y desconectar cuantas veces quieras.

Sabes que creo que la mejor manera es que cuando el PIC se conecte a USB y ya este isto, envie una cadena de caracteres, de esta manera en el pC, esperas a que ocurra una "interrupcion" con la llegada de un dato por el COM y asi ya sabes que se conecto.

Desconectado PalitroqueZ

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: como monitorear el estado de un COMx
« Respuesta #7 en: 22 de Enero de 2007, 12:01:32 »
Voy a tomar en cuenta sus consejos PICmouse e IOIO y voy hacer unos ensayos nuevamente  :)

Salu2
Pedro

La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek

Desconectado psykhon

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 823
Re: como monitorear el estado de un COMx
« Respuesta #8 en: 22 de Enero de 2007, 12:12:47 »
como bien se explico el que un puerto este abierto solo indica que un porgrama se reservo el us del mismo y no que este activo de alguna manera. En cuanto a rts y cts, lo que te conviene es puentearlos en la ficha db9 cosa de no tener qie recargar en nada tu circuito, y si vas a usar este mecanismo vas a tener que habilitar el control de flujo por hardware para el com. yo en lo personal mandaria un mensaje a intervalos y que cuando haya algo conectado me responda
No, no se lo que estoy haciendo. Nadie sabe que estoy haciendo. Por eso se llama "Investigacion".

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: como monitorear el estado de un COMx
« Respuesta #9 en: 22 de Enero de 2007, 12:43:07 »
psykhon pero el problema es que no existe puesto DB9, en el PIC ni en el PC. La com se emulara por USB usando el PIC18F2550. La verdad esta interesante el tema, como controlar las demas lineas de una comunicacion serial con el PIC2550 emulando el puerto USB???   :?

Desconectado psykhon

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 823
Re: como monitorear el estado de un COMx
« Respuesta #10 en: 22 de Enero de 2007, 13:13:32 »
como resuelven el echo de que cuando conectas un usb a serie te cambie el numero del com?
No, no se lo que estoy haciendo. Nadie sabe que estoy haciendo. Por eso se llama "Investigacion".

Desconectado LABmouse

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3575
    • Juntos es mejor
Re: como monitorear el estado de un COMx
« Respuesta #11 en: 22 de Enero de 2007, 16:38:21 »
Si no estoy mal el  numero de COM que corresponderia el PIC ya lo da el WINDOWS. Lo que si habria que hacer es que el programa de Visual, detectara tambien en cual COM esta conectado, o es mejor manual??

Desconectado psykhon

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 823
Re: como monitorear el estado de un COMx
« Respuesta #12 en: 22 de Enero de 2007, 18:03:35 »
seria cosa de ir abriendo uno por uno los puertos disponibles, mandar algo y si llega la respuesta esperada ya lo tenes
No, no se lo que estoy haciendo. Nadie sabe que estoy haciendo. Por eso se llama "Investigacion".

Desconectado PalitroqueZ

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5474
    • Electrónica Didacta
Re: como monitorear el estado de un COMx
« Respuesta #13 en: 23 de Enero de 2007, 11:00:13 »
Amigos creo que resoví de una manera parcial el problema del monitoreo, sigo tomando en cuenta sus consejos sobre realizar un eco para averiguar el estado de la conexión, pero esto lo dejaré para una aplicación en particular.

se me ocurrió seguir probando el estado de una conexión pero solo en el software de la PC, sin enviar datos (independiente del código que exista en el PIC, el programa verá si existe o no el COMx). una solución que encontré fué abrir y cerrar el puerto dentro del escaneo periódico del control timer.

si logro abrir el puerto es porque existe el COMx, si me genera un error es porque podría no existir, en cualquiera de los casos en que no pueda abrir el COMx asumo que está desconectado y no se puede transmitir datos

ahí ocurren 2 cosas distintas:

cuando se intenta abrir el puerto y se deja abierto, como mencioné arriba, no hay manera de saber si el cable se desconectó, tal y cuál como dice el amigo IOIO.

el timer abre y cierra el puerto, si el puerto está cerrado, quiere decir que el COMx no existe, entonces cuando en el evento timer abra de nuevo el puerto, el VB tirará un error , especificamente el error 8015: No se puede establecer el estado de comunicación; puede que haya uno o más parámetros de comunicaciones no válidos ó 8002: Número de puerto no válido, es allí que mediante el control de errores puedo decir que el pic está desconectado del controlador HOST de la PC.

El código en VB
Código: [Seleccionar]
Option Explicit

Private Sub Command1_Click()
    Timer1.Enabled = False
    If MSComm1.PortOpen = False Then
      Exit Sub
    Else
        MSComm1.Output = "a"
    End If
    Timer1.Enabled = True
End Sub

Private Sub Form_Load()
    MSComm1.CommPort = 4
    MSComm1.OutBufferSize = 1 'tamaño del dato a transmitir
    'MSComm1.PortOpen = True
   
    Timer1.Interval = 50
    Timer1.Enabled = True
End Sub

Private Sub Form_Unload(Cancel As Integer)
    If MSComm1.PortOpen = True Then
        MSComm1.PortOpen = False
    End If
End Sub

Private Sub Timer1_Timer()
Dim a As String
On Error GoTo paca
DoEvents
If MSComm1.PortOpen = True Then
    DoEvents
    lblestado.Caption = "Conectado"
    Debug.Print "Conectado"
    MSComm1.PortOpen = False
    Exit Sub
Else
    DoEvents
    MSComm1.PortOpen = True
    Exit Sub
End If
paca: Debug.Print Err.Number & ": " & Err.Description
     Select Case Err.Number
        Case 8002   'Número de puerto no válido
            DoEvents
           lblestado.Caption = "Desconectado"
        Case 8005 'el puerto ya está abierto
            DoEvents
            lblestado.Caption = "puerto abierto"
        Case 8012 '8012 el dispositivo no está abierto
            DoEvents
            lblestado.Caption = "Desconectado"
        Case 8015
            DoEvents
            lblestado.Caption = "Desconectado"
    End Select
      Exit Sub
End Sub


un videito donde se muestra lo que sucede

si quisiera enviar datos al PIC, lo primero que tengo que hacer es detener el escaneo, mediante Timer1.Enabled = False y pego un código similar al del evento timer (para que ocurra solo una vez) dentro del evento donde quiero enviar datos, después que envie/reciba datos, arranco el escaneo Timer1.Enabled = True

es decir, mientras no esté haciendo operaciones de transmisiones por el USB, el timer estará encendido y solo se dentendrá cuando se realice un envio/recepción de datos.

como resuelven el echo de que cuando conectas un usb a serie te cambie el numero del com?
psykhon es una buena pregunta, porque los ensayos que he realizado, los hago sobre el mismo conector, y en uno de esos ensayos coloqué el cable en el conector USB de al lado, mi sorpresa fué que tuve que instalar de nuevo la clase CDC y me apareció un COM5, mientras que el conector de al lado es COM4

una solución que se me ocurre de momento es que el usuario tenga la opción de seleccionar el número del puerto y para ello deberá saber que número es el puerto virtual, mirando en administrador de dispositivos cuando se conecta el cable

salu2
Pedro
La propiedad privada es la mayor garantía de libertad.
Friedrich August von Hayek


 

anything