Hola Piter.
Dejando a un lado las funciones api, creo que con esto podrías encontrar una solución más sencilla:
Añade a tu proyecto un componente
Microsoft Comm Control.
Esta función devolvería el número de puerto com más alto:
Private Function MaxComPort() As Integer
On Error GoTo Err_Chk
Dim int1 As Integer
For int1 = 1 To 16
MSComm1.CommPort = int1
MSComm1.PortOpen = True
MSComm1.PortOpen = False
Next int1
Exit_Chk:
MaxComPort = int1
Exit Function
Err_Chk:
If Err.Number = 8002 Then
int1 = int1 - 1
Resume Exit_Cont
Else
MsgBox Err.Description
End If
End Function
Otro método controlaría el estado del puerto:
Private Sub ChkPortSts()
On Error GoTo Err_Chk
Dim int1 As Integer
For int1 = 1 To MaxComPort()
MSComm1.CommPort = int1
MsComm1.PortOpen = True
Select Case MsComn1.CommEvent
Case 1
.
.
.
Case 2
.
.
.
Case 3
.
.
.
End Select
MsComm1.PortOpen = False
Next int1
Exit Sub
Err_Chk:
MsgBox Err.Description
End Sub
Los valores que tendrías que controlar para la propiedad CommEvent serían:
Los errores de comunicación incluyen los siguientes valores:
Constante Valor Descripción
comEventBreak 1001 Se ha recibido una señal de interrupción.
comEventFrame 1004 Error de trama. El hardware ha detectado un error de trama.
comEventOverrun 1006 Pérdida de información en puerto. El hardware no ha terminado de leer un carácter antes de llegar el siguiente y lo ha perdido.
comEventRxOver 1008 Desbordamiento del búfer de recepción. No hay espacio para más datos en el búfer de recepción.
comEventRxParity 1009 Error de paridad. El hardware ha detectado un error de paridad.
comEventTxFull 1010 Búfer de transmisión lleno. El búfer de transmisión estaba lleno cuando se ha intentado agregar un carácter a la cola de transmisión.
comEventDCB 1011 Error inesperado al recuperar el Bloque de control de dispositivos (DCB) para el puerto.
Los eventos de comunicación incluyen los valores siguientes:
Constante Valor Descripción
comEvSend 1 Hay menos caracteres en el búfer de transmisión de los que indica el número SThreshold.
comEvReceive 2 Número de caracteres RThreshold recibido. Este evento se genera continuamente hasta que se usa la propiedad Input para quitar datos del búfer de recepción.
comEvCTS 3 Cambio en la línea Preparado para enviar.
comEvDSR 4 Cambio en la línea Equipo de datos preparado. Este evento sólo se desencadena cuando la línea DSR cambia de 1 a 0.
comEvCD 5 Cambio en la línea Detección de portadora.
comEvRing 6 Detectada llamada. Algunos UART (transmisores-receptores asíncronos universales) no aceptan este evento.
comEvEOF 7 Carácter de fin de archivo (carácter ASCII 26) recibido.
Poco más te puedo decir porque no he realizado ningún tipo de prueba con estas historias (entre otras cosas porque no tengo un modem a mano con que probar, ni tengo ganas ni tiempo de buscarlo).
A ver si tu investigando en esta línea consigues lo que quieres...
Suerte.