Khi kết nối thiết bị COM mới hoặc thiết bị USB (modem USB, điện thoại, adapter Bluetooth, chuyển đổi serial-to-USB, v.v.), Windows phát hiện qua Plug-n-Play và gán số cổng COM trong khoảng 1 đến 255 (COM1, COM2, COM3...). Nếu thiết bị kết nối lại, số cổng COM đã dành riêng (Communication hoặc Serial) sẽ được gán cho nó. Thiết bị mới nhận số cổng COM trống đầu tiên. Thường xảy ra thiết bị bên ngoài tạo ra nhiều cổng COM cùng lúc. Trong trường hợp của tôi, kết nối adapter Bluetooth đã tạo ra 10 cổng COM mới.
Nhiều ứng dụng cũ chỉ định địa chỉ được số cổng COM hai chữ số, không hoạt động với COM100 trở lên. Tệ nhất, các chương trình chỉ hoạt động với cổng COM1-COM9. Làm sao nếu thiết bị nhận số cổng COM cao? Có thể đặt lại số thứ tự cho cổng COM đã dành riêng và xóa cổng đã gán không?
Mục lục
- Thay đổi số cổng COM cho thiết bị trong Windows
- Tìm tiến trình đang sử dụng cổng COM serial trong Windows
- Đặt lại số cổng COM trong Registry Windows
Thay đổi số cổng COM cho thiết bị trong Windows
Trong Windows, có thể thay đổi thủ công số cổng COM gán cho thiết bị. Giả sử cổng COM cần thiết đã bận, muốn thử giải phóng.
- Mở Device Manager bằng lệnh
devmgmt.msc; - Chọn View → Show Hidden Devices trong menu;
- Mở rộng Ports (COM & LPT) và tìm thiết bị trong danh sách;
- Chuyển đến tab Port Settings và nhấn nút Advanced;
- Số cổng COM hiện tại gán cho thiết bị nằm trong trường COM Port Number;
- Để thay đổi, mở danh sách thả xuống và chọn số cổng COM mong muốn.
Thường không thể thay đổi số cổng COM gán sang số khác trong thuộc tính phần cứng, vì tất cả cổng COM "thấp" hơn đã được dùng. Lúc này cần thử xóa dự trữ cổng COM:
- Mở rộng nhánh Ports (COM & LPT), tìm cổng COM cần thiết gán cho thiết bị nào (biểu tượng mờ nghĩa là cổng COM đã dành riêng nhưng thiết bị hiện không kết nối);
- Chuột phải chọn Uninstall;
- Bây giờ có thể gán cổng COM vừa giải phóng cho thiết bị khác. Mở lại thuộc tính thiết bị, vào Port Settings → Advanced. Chọn cổng COM trống trong danh sách thả xuống.
Tuy nhiên, cách này không giải phóng được cổng COM bận trong tất cả trường hợp.
Lấy danh sách đầy đủ cổng COM bận trong Windows bằng PowerShell:
Get-WMIObject Win32_SerialPort | Select-Object Name,DeviceID,Description
Lấy số cổng COM cho thiết bị cụ thể theo tên, ví dụ:
Get-WMIObject Win32_SerialPort | Where-Object { $_.Name -like "*Arduino*"} | select name, deviceid
Get-WMIObject Win32_SerialPort | Where-Object { $_.Name -like "*GPS*"} | select name, deviceid
Tìm tiến trình đang sử dụng cổng COM Serial trong Windows
Không thể giải phóng cổng COM của thiết bị đang được Windows hoặc chương trình đang chạy (tiến trình) sử dụng. Cần dừng tiến trình đang dùng cổng COM trước. Dùng công cụ Process Explorer (Sysinternals) để tìm tên tiến trình dùng cổng COM cụ thể (https://docs.microsoft.com/en-gb/sysinternals/downloads/process-explorer).
Đầu tiên, hiển thị tên dịch vụ dùng cổng COM. Chạy lệnh PowerShell:
get-pnpdevice -class Ports -ea 0 | Select Name, PNPDeviceID, Status, Service
Tên dịch vụ của cổng COM cụ thể hiển thị ở cột Service. Ví dụ, cho COM2 là Serial. Chạy Process Explorer với quyền admin, chọn Find → Find Handle or DLL. Ở dòng Handle or DLL substring, nhập giá trị Service lấy trước (ví dụ Serial).
Process Explorer sẽ hiển thị tên tiến trình đang dùng cổng COM. Để giải phóng, kill tiến trình hoặc chương trình đó.
Đặt lại số cổng COM trong Registry Windows
Thông tin về cổng COM đang dùng lưu trong tham số CommDB dưới khóa registry HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\COM Name Arbiter.
- Mở Registry Editor (
regedit.exe) đến khóa registry trên.
Quan trọng! Khuyến khích backup khóa registry này (File → Export) trước khi thao tác. Nếu sai, có thể khôi phục cấu hình cổng COM gốc. - Giá trị tham số ComDB ở dạng binary xác định danh sách cổng COM dành riêng trong Windows. Mỗi bit xác định trạng thái cổng tương ứng (từ 1 đến 255). Ví dụ, nếu chỉ muốn giữ dự trữ cho COM3, giá trị hex của ComDB = 04 (0000 0100).
Quan trọng! Rất chú ý, đừng thêm bit thừa vào tham số, hệ thống sẽ bị lỗi BSOD. - Nếu phải đặt lại tất cả gán cổng COM, đổi giá trị ComDB thành 0.
Lưu ý: Danh sách đầy đủ cổng COM kết nối trong Windows nằm tại khóa HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM. Các entry dưới SERIALCOMM chỉ hiện khi thiết bị thực sự kết nối và sẵn sàng. Subkey này thuộc khóa HARDWARE, được tạo lại mỗi lần khởi động hệ thống. - Khóa registry HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ports chứa danh sách tất cả số cổng COM đã gán. Có thể xóa tất cả dự trữ cổng không cần thiết. Ví dụ, chỉ giữ COM3, xóa các cổng còn lại.
- Rút tất cả thiết bị bên ngoài và khởi động lại máy tính;
- Sau reboot, kết nối thiết bị theo thứ tự cần thiết, cài lại bộ chuyển đổi USB-to-serial, v.v. Tất cả thiết bị cổng COM sẽ được hệ thống tự động phát hiện và gán số cổng COM tuần tự.
Cũng có thể dùng các công cụ miễn phí sau để dọn dẹp cổng COM đã dành riêng:
- COM Name Arbiter Tool – giúp đặt lại dự trữ cổng COM và tìm số cổng COM đang dùng. Tải công cụ, chạy quyền admin. Chọn cổng COM muốn giải phóng, nhấn Clear unused Reservations và Remove non-present devices.
- Device Cleanup Tool – tiện ích tìm trong registry các thiết bị từng kết nối (dưới khóa
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum), xóa thiết bị không dùng và dọn dẹp dự trữ cổng COM.