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 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