เมื่อคุณเชื่อมต่ออุปกรณ์ COM ใหม่ หรืออุปกรณ์ USB เข้ากับคอมพิวเตอร์ (USB modem, โทรศัพท์มือถือ, Bluetooth adapter, Serial to USB converters ฯลฯ) Windows จะตรวจจับผ่าน Plug-n-Play และกำหนด หมายเลขพอร์ต COM ในช่วง 1 ถึง 255 (COM1, COM2, COM3 ฯลฯ) หากอุปกรณ์นี้ถูกเชื่อมต่ออีกครั้ง หมายเลขพอร์ต COM (Communication หรือ Serial) ที่จองไว้จะถูกมอบหมายให้อีกครั้ง อุปกรณ์ใหม่จะได้หมายเลขพอร์ต COM ว่างแรก บ่อยครั้งที่อุปกรณ์ภายนอกสร้างพอร์ต COM หลายพอร์ตพร้อมกัน ในกรณีของผม หลังเชื่อมต่อ Bluetooth adapter แล้วปรากฏ 10!!! พอร์ต COM ใหม่ในระบบ
แอปพลิเคชันรุ่นเก่าบางตัวสามารถจัดการหมายเลขพอร์ต COM ได้เพียง 2 หลักเท่านั้น และไม่ทำงานกับ COM100 ขึ้นไป ในกรณีแย่ที่สุด โปรแกรมเหล่านี้ทำงานได้เฉพาะพอร์ต COM1-COM9 เท่านั้น ถ้าอุปกรณ์ได้หมายเลขพอร์ต COM สูงกว่านั้น จะทำอย่างไร? สามารถรีเซ็ตการกำหนดหมายเลขพอร์ต COM ที่จองไว้และลบพอร์ตที่มอบหมายแล้วได้หรือไม่?
สารบัญ
- วิธีเปลี่ยนหมายเลขพอร์ต COM สำหรับอุปกรณ์ใน Windows
- ค้นหาว่ากระบวนการใดกำลังใช้พอร์ต COM ท้องถิ่นใน Windows
- รีเซ็ตหมายเลขพอร์ต COM ใน Windows Registry
วิธีเปลี่ยนหมายเลขพอร์ต COM สำหรับอุปกรณ์ใน Windows
ใน Windows คุณสามารถเปลี่ยนหมายเลขพอร์ต COM ที่มอบหมายให้อุปกรณ์ด้วยตนเอง สมมติว่าพอร์ต COM ที่ต้องการถูกใช้งานอยู่ และคุณต้องการพยายามปลดปล่อยมัน
- เปิด Device Manager โดยรันคำสั่ง
devmgmt.msc; - เลือก View → Show Hidden Devices ในเมนู;

- ขยาย Ports (COM & LPT) และค้นหาอุปกรณ์ของคุณในรายการ;
- ไปที่แท็บ Port Settings และคลิกปุ่ม Advanced;
- หมายเลขพอร์ต COM ปัจจุบันที่มอบหมายให้อุปกรณ์อยู่ในฟิลด์ COM Port Number;
- เพื่อเปลี่ยน ให้เปิดรายการแบบเลื่อนลงและเลือกหมายเลขพอร์ต COM ที่ต้องการตั้งค่า

แต่บ่อยครั้งที่ไม่สามารถเปลี่ยนหมายเลขพอร์ต COM ที่มอบหมายให้เป็นอีกตัวได้ในคุณสมบัติฮาร์ดแวร์ เนื่องจากพอร์ต COM “ต่ำกว่า” ทั้งหมดถูกใช้งานแล้ว ในกรณีนี้ ต้องลองลบการจองพอร์ต COM
- ขยายสาขา Ports (COM & LPT) ค้นหาว่าหมายเลขพอร์ต COM ที่คุณต้องการถูกมอบหมายให้อะไร (ไอคอนจาง หมายถึงพอร์ต COM นี้ถูกจอง แต่อุปกรณ์ไม่ได้เชื่อมต่ออยู่);
- คลิกขวาเลือก Uninstall;

- ตอนนี้คุณสามารถมอบหมายพอร์ต COM ที่ว่างให้อุปกรณ์อื่น อีกครั้ง เปิดคุณสมบัติของอุปกรณ์ของคุณ ไปที่ Port Settings → Advanced แล้วเลือกพอร์ต COM ว่างในรายการแบบเลื่อนลง

อย่างไรก็ตาม วิธีนี้ไม่สามารถปลดปล่อยพอร์ต COM ที่ยืดได้ในทุกกรณี
สามารถดูรายการพอร์ต COM ที่ยืดทั้งหมดใน Windows ด้วย PowerShell:
Get-WMIObject Win32_SerialPort | Select-Object Name,DeviceID,Description
สามารถดูหมายเลขพอร์ต COM สำหรับอุปกรณ์เฉพาะจากชื่อได้ เช่น:
Get-WMIObject Win32_SerialPort | Where-Object { $_.Name -like "*Arduino*"}|select name, deviceid
หรือ
Get-WMIObject Win32_SerialPort | Where-Object { $_.Name -like "*GPS*"}|select name, deviceid
ค้นหาว่ากระบวนการใดกำลังใช้พอร์ต COM ท้องถิ่นใน Windows
คุณจะไม่สามารถปลดปล่อยพอร์ต COM ของอุปกรณ์ที่ถูกใช้งานโดย Windows หรือโปรแกรมที่กำลังรัน (process) ได้ ก่อนอื่นต้องหยุดกระบวนการที่กำลังใช้พอร์ต COM อยู่ สามารถใช้เครื่องมือ Process Explorer (โดย Sysinternals) เพื่อค้นหาชื่อกระบวนการที่ใช้พอร์ต COM เฉพาะ (https://docs.microsoft.com/en-gb/sysinternals/downloads/process-explorer)
ก่อนอื่น ต้องแสดงชื่อบริการที่ใช้พอร์ต COM รันคำสั่ง PowerShell:
get-pnpdevice -class Ports -ea 0| Select Name, PNPDeviceID, Status, Service

ชื่อบริการของพอร์ต COM เฉพาะแสดงในคอลัมน์ Service เช่น สำหรับ COM2 คือ Serial ตอนนี้รัน Process Explorer เป็น Administrator และเลือก Find → Find Handle or DLL จากเมนู ในบรรทัด Handle or DLL substring ใส่ค่า Service ที่ได้ก่อนหน้านี้ ในตัวอย่างคือ Serial
Process Explorer จะแสดงชื่อกระบวนการที่กำลังใช้พอร์ต COM ของคุณ เพื่อปลดปล่อยพอร์ต COM ให้ Kill กระบวนการหรือโปรแกรมนั้น

รีเซ็ตหมายเลขพอร์ต COM ใน Windows Registry
ข้อมูลเกี่ยวกับพอร์ต COM ที่ใช้งานอยู่ เก็บอยู่ในพารามิเตอร์ CommDB ภายใต้คีย์รีจิสทรี HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\COM Name Arbiter
- เปิด Registry Editor (
regedit.exe) และไปที่คีย์รีจิสทรีที่กล่าวมา;

สำคัญ! ขอแนะนำให้สำรองคีย์รีจิสทีรายนี้ (File → Export) ก่อนทำอะไรต่อไป หากมีปัญหา สามารถกู้คืนการตั้งค่าพอร์ต COM เดิมได้ - ค่าของพารามิเตอร์ ComDB ในรูปแบบไบนารี กำหนดรายการพอร์ต COM ที่จองไว้ใน Windows แต่ละบิตกำหนดสถานะของพอร์ตที่สอดคล้อง (จาก 1 ถึง 255) ตัวอย่างเช่น หากต้องการจองเฉพาะ COM3 ค่า hex ของ ComDB จะเท่ากับ 04 (0000 0100);

สำคัญ! ระมัดระวังมาก อย่าเพิ่มบิตเพิ่มเติมในพารามิเตอร์ ไม่งั้นระบบจะล้มเหลวและเข้าสู่ BSOD - หากต้องการรีเซ็ตการผูกพอร์ต COM ทั้งหมด ให้เปลี่ยนค่า ComDB เป็น 0;

หมายเหตุ สามารถดูรายการพอร์ต COM ที่เชื่อมต่อใน Windows ทั้งหมดได้ที่คีย์รีจิสทรี HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM รายการรีจิสทรีภายใต้ SERIALCOMM จะมีอยู่ก็ต่อเมื่ออุปกรณ์ที่เกี่ยวข้องเชื่อมต่อและพร้อมแล้ว Subkey นี้เป็นส่วนหนึ่งของ HARDWARE key และจะถูกสร้างใหม่ทุกครั้งที่ระบบเริ่มต้น

- คีย์รีจิสทรี HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Ports มีรายการหมายเลขพอร์ต COM ที่มอบหมายทั้งหมด สามารถลบการจองพอร์ตที่ไม่จำเป็นออกได้ ในตัวอย่างเราจะเหลือเฉพาะ COM3 และลบพอร์ตอื่นๆ

- ถอดอุปกรณ์ภายนอกทั้งหมดและรีสตาร์ทคอมพิวเตอร์;
- หลังรีบูท ให้เชื่อมต่ออุปกรณ์ตามลำดับที่ต้องการ ติดตั้ง USB-to-serial converters ใหม่ ทุกอุปกรณ์พอร์ต COM ที่ตรวจพบจะถูกระบบตรวจจับอัตโนมัติและมอบหมายหมายเลขพอร์ต COM ตามลำดับ
ยังสามารถใช้เครื่องมือฟรีต่อไปนี้เพื่อทำความสะอาดพอร์ต COM ที่จองไว้:
- COM Name Arbiter Tool – เครื่องมือนี้ช่วยรีเซ็ตการจองพอร์ต COM และค้นหาหมายเลขพอร์ต COM ที่ใช้งานอยู่ ดาวน์โหลดเครื่องมือและรันเป็น Administrator เลือกพอร์ต COM ที่ต้องการปลดปล่อยและคลิก Clear unused Reservations และ Remove non-present devices;

- Device Cleanup Tool – ยูทิลิตี้ใช้ค้นหาอุปกรณ์ที่เคยเชื่อมต่อมาก่อนหน้านี้ในรีจิสทรี (ภายใต้คีย์
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum) ลบอุปกรณ์ที่ไม่ได้ใช้งาน และล้างการจองพอร์ต COM