TODOPIC
Lenguajes de programación para PC => Visual Basic => Mensaje iniciado por: PalitroqueZ 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:
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
-
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.
-
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
-
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.
-
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:
-
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
-
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.
-
Voy a tomar en cuenta sus consejos PICmouse e IOIO y voy hacer unos ensayos nuevamente :)
Salu2
Pedro
-
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
-
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??? :?
-
como resuelven el echo de que cuando conectas un usb a serie te cambie el numero del com?
-
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??
-
seria cosa de ir abriendo uno por uno los puertos disponibles, mandar algo y si llega la respuesta esperada ya lo tenes
-
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
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 (http://www.4shared.com/file/9344169/6c424cd8/conec_USB.html) 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