Cómo liberar o eliminar puertos COM en uso en Windows

Conectas un adaptador USB-serie, un Arduino o un módem, abres tu programa y descubres que el puerto que necesitas aparece como «en uso», o que el dispositivo se ha ido a COM27 cuando todos tus programas esperan COM3. No es un fallo del adaptador: es la forma en que Windows reserva los números de puerto COM. Esta guía explica por qué ocurre y cómo liberar o eliminar puertos COM en uso en Windows 10 y Windows 11, desde lo más sencillo (cambiar el número) hasta el borrado de las reservas fantasma.
Por qué Windows se «queda» con los números de COM
Cada vez que conectas por primera vez un dispositivo que crea un puerto serie (un adaptador USB-serie, un dispositivo Bluetooth, un módem, una placa de desarrollo), Windows le asigna un número de COM y lo apunta en una base de datos interna llamada COM Name Arbiter. Ese número queda reservado para ese dispositivo aunque lo desconectes, para que la próxima vez recupere el mismo nombre y tus programas sigan funcionando.
El efecto secundario es que, con el tiempo, se acumulan reservas de dispositivos que ya no tienes conectados. Y hay un detalle que multiplica el problema: los adaptadores baratos sin número de serie único reciben un puerto distinto en cada puerto USB del equipo. Si los cambias de conector, Windows cree que es otro dispositivo y le da un número nuevo. Después de unas semanas de pruebas, es fácil llegar a COM20 o más.
Paso 1: comprueba qué puertos existen de verdad
Abre el Administrador de dispositivos (devmgmt.msc) y despliega Puertos (COM y LPT). Para ver también los dispositivos que ya no están conectados, ve a Ver → Mostrar dispositivos ocultos: los puertos fantasma aparecen atenuados. Desde PowerShell tienes una vista más completa:
# Todos los dispositivos de la clase Puertos; Status "Unknown" = no conectado (fantasma)
Get-PnpDevice -Class Ports | Select-Object FriendlyName, Status, InstanceId
# Solo los puertos activos ahora mismo
[System.IO.Ports.SerialPort]::GetPortNames()
Get-ItemProperty 'HKLM:\HARDWARE\DEVICEMAP\SERIALCOMM'
La clave SERIALCOMM del registro lista únicamente los puertos que están activos en este momento, con la ruta interna del dispositivo como nombre del valor y el COMn como dato. Si un puerto aparece en el Administrador de dispositivos pero no ahí, es una reserva antigua.
Paso 2: averigua qué está usando el puerto
Si el mensaje que ves es «acceso denegado» o «el puerto está en uso» al abrirlo desde un programa, quizá no sea una reserva fantasma, sino otro programa que lo tiene abierto: el monitor serie del IDE de Arduino, PuTTY, un terminal serie o un servicio del fabricante. Un puerto serie solo admite un propietario a la vez.
- Cierra los programas que puedan usarlo y vuelve a probar.
- Abre el Monitor de recursos (
resmon), pestaña CPU, y en Identificadores asociados busca términos como Serial, USBSER o VCP (en adaptadores FTDI): verás qué proceso tiene el puerto abierto. - Desconecta y vuelve a conectar el dispositivo: libera cualquier identificador pendiente.
Para reiniciar un dispositivo sin desconectarlo físicamente, desde PowerShell como administrador:
$p = Get-PnpDevice -Class Ports -PresentOnly | Where-Object FriendlyName -like '*COM3*'
$p | Disable-PnpDevice -Confirm:$false
$p | Enable-PnpDevice -Confirm:$false
Paso 3: cambia el número de COM del dispositivo
Muchas veces basta con asignar a tu dispositivo el número que quieres:
- En el Administrador de dispositivos, haz clic derecho en el puerto → Propiedades.
- Pestaña Configuración del puerto → Opciones avanzadas.
- En Número de puerto COM, elige el que necesitas.
Windows marca con «(en uso)» los números reservados por otros dispositivos. Si el que aparece en uso corresponde a un dispositivo fantasma, puedes seleccionarlo igualmente: Windows te avisa de que otro dispositivo lo está usando y te deja continuar. Lo único que ocurre es que, si ese otro dispositivo regresa, tendrá que recibir otro número.
Paso 4: elimina los puertos fantasma
La limpieza habitual es desinstalar las entradas atenuadas:
- En el Administrador de dispositivos, activa Ver → Mostrar dispositivos ocultos.
- Despliega Puertos (COM y LPT).
- Haz clic derecho en cada entrada atenuada que ya no uses → Desinstalar dispositivo.
Si hay muchas, puedes hacerlo con pnputil (disponible desde Windows 10 versión 2004). Revisa primero la lista, porque los comandos eliminan lo que les indiques:
# Lista de puertos desconectados
pnputil /enum-devices /class Ports /disconnected
# Elimina uno concreto (usa el ID de instancia que mostró el comando anterior)
pnputil /remove-device "USB\VID_0403&PID_6001\A50285BI"
Un ejemplo para eliminar todos los puertos fantasma de golpe desde PowerShell, que solo debes ejecutar cuando hayas revisado qué dispositivos aparecen:
Get-PnpDevice -Class Ports | Where-Object Status -eq 'Unknown' |
ForEach-Object { pnputil /remove-device $_.InstanceId }
Paso 5: puertos Bluetooth y virtuales
Los puertos de dispositivos Bluetooth emparejados y los de software de puertos virtuales (como emuladores de pares de COM) también reservan números. Para los de Bluetooth, ve a Configuración → Bluetooth y dispositivos → Dispositivos → Más configuración de Bluetooth y abre la pestaña Puertos COM: ahí puedes quitar los puertos de salida y de entrada que ya no necesites. Para los virtuales, elimina el par desde la propia aplicación que los creó y después desinstala los restos en el Administrador de dispositivos.
Paso 6: restablecer la base de reservas (último recurso)
Si, tras desinstalar los fantasmas, los números siguen apareciendo como en uso, el último recurso es limpiar la base de datos del árbitro de nombres. Windows guarda las reservas como un mapa de bits en un valor binario llamado ComDB, dentro de la clave HKLM\SYSTEM\CurrentControlSet\Control\COM Name Arbiter (según la versión de Windows, el valor está en esa clave o en su subclave Devices). Cada bit representa un número de puerto: el bit 0 del primer byte es COM1, el bit 1 es COM2, y así hasta COM256.
Haz una copia antes de tocar nada: en el Editor del Registro, clic derecho en la clave → Exportar. Después:
- Desconecta todos los dispositivos que creen puertos COM y desinstala los fantasmas como en el paso 4.
- Abre el valor
ComDBy pon a cero los bytes de los puertos que quieres liberar. Para el número n, el byte es(n-1) / 8(empezando en 0) y el bit es(n-1) % 8. Por ejemplo, COM3 es el bit 2 del primer byte, que vale04en hexadecimal; un valor07significa COM1, COM2 y COM3 reservados, y dejarlo en03libera COM3. - Reinicia el equipo y vuelve a conectar tus dispositivos.
Es un cambio delicado: si pones a cero un puerto que sí está en uso, Windows podría asignar ese número a otro dispositivo y generar conflictos. Utilízalo únicamente cuando los pasos anteriores no hayan funcionado y siempre con la copia del registro hecha.
Cómo evitar que vuelva a pasar
- Usa siempre el mismo puerto USB para cada adaptador, sobre todo si no tienen número de serie único.
- Fija el número de COM en las propiedades del dispositivo una vez que funcione, para que tus programas encuentren el puerto siempre en el mismo sitio.
- Prefiere adaptadores con número de serie único (los de chips conocidos de buena calidad): Windows recuerda el puerto aunque cambies de conector.
- Limpia de vez en cuando los dispositivos fantasma si haces muchas pruebas con placas de desarrollo.
Problemas relacionados
Mi programa no encuentra COM10 o superiores
Algunos programas antiguos solo aceptan nombres hasta COM9. Para los números superiores, la forma correcta de abrir el puerto en código es la ruta completa \\.\COM10. Si tu aplicación no lo admite, asigna al dispositivo un número bajo con el paso 3.
El puerto aparece con un signo de exclamación
Es un problema de controlador, no de reserva. Abre las propiedades del dispositivo, comprueba el estado y reinstala el controlador del fabricante del adaptador. Si usas un chip de los más habituales, el controlador está en la web de su fabricante.
No puedo cambiar el número aunque el otro dispositivo no existe
Prueba a cerrar el Administrador de dispositivos, ejecutarlo como administrador y repetir la operación. Si sigue sin dejarte, usa el restablecimiento del paso 6.
Automatiza la comprobación
Si gestionas varios equipos de laboratorio o de producción con dispositivos serie, puedes revisar el estado de los puertos con un pequeño script y recorrer una lista de equipos con los bucles de PowerShell. Para repasar el resto de comandos útiles de administración, tienes los 10 comandos de PowerShell imprescindibles. Y si la limpieza de dispositivos antiguos forma parte de un mantenimiento más amplio, mira cómo acelerar el arranque de Windows 11, donde revisamos controladores y servicios que ralentizan el sistema.
Puertos COM físicos de la placa base
No todos los puertos son de adaptadores USB. Los equipos industriales y algunas placas base incluyen puertos serie físicos (normalmente COM1 y COM2) que el firmware presenta a Windows y que no se pueden eliminar desde el sistema: si aparecen en el Administrador de dispositivos sin el icono atenuado, existen de verdad. Si no los usas, puedes deshabilitarlos desde la configuración UEFI del equipo para que Windows no los reserve. Para ver cuáles son reales, ejecuta Get-CimInstance Win32_SerialPort | Select-Object DeviceID, Name, Status: lista los puertos serie que el sistema reconoce como activos ahora mismo.
Conclusión
Los puertos COM «en uso» casi nunca son un fallo, sino reservas que Windows conserva para dispositivos que ya no están conectados. Empieza por lo más simple: comprobar si otro programa lo ocupa, cambiar el número de puerto del dispositivo y desinstalar los fantasmas desde el Administrador de dispositivos. Deja la edición de ComDB para el final, con copia del registro y con cuidado. Y para que no se repita, conecta cada adaptador siempre al mismo puerto USB.