Hiện nay các ứng dụng có kết nối máy tính thường sử dụng cổng COM ảo từ cổng USB. Nhưng một rắc rối có thể gặp phải đó là, mỗi khi bạn cắm USB-RS232 vào những cổng USB khác nhau, thì máy tính sẽ nhận ra thành những cổng COM khác nhau (COM5, COM6 ..).
Giả sử thiết bị của bạn là một sản phẩm cho người sử dụng, thật là bất tiện mỗi khi mở ứng dụng lên bắt buộc người dùng phải chọn cổng COM để kết nối với thiết bị.
Nhiều khi trên máy của người dùng có đến 2 hay 3 cổng COM, với người dùng bình thường nhiều khi còn không biết cổng COM nào kết nối với thiết bị đang sử dụng.
Để giải quyết vấn đề này, mình cũng từng Post bài hỏi bên ddth.com, tuy nhiên không phải là ý hay khi hỏi các vấn đề liên quan đến phần cứng bên đó. Google cho xong. Và mình đã có cách để giải quyết vấn đề này:
* Mỗi một thiết bị USB đều có Product ID và Vendor ID (ví dụ của Microchip là VID = 0x04D8 và PID = 0x000A) .
* Sử dụng ManagementObjectSearcher trong .NET để lấy thông tin phần cứng
* Kiểm tra thông tin phần cứng với PID và VID có trùng với cổng USB-COM của mình không, trả về tên cổng COM.
Code C# (nhớ add ref cho System.Management)
Sử dụng code này, ví dụ cho USB-COM của Microchip (PIC)
Vậy là sau khi ứng dụng khởi động, nếu kiểm tra _portName khác null, thì có thể Open Port đó, không cần người dùng phải lựa chọn.
[Bổ sung]
Để biết Hardware Id, các bạn xem hình bên dưới
Giả sử thiết bị của bạn là một sản phẩm cho người sử dụng, thật là bất tiện mỗi khi mở ứng dụng lên bắt buộc người dùng phải chọn cổng COM để kết nối với thiết bị.
Nhiều khi trên máy của người dùng có đến 2 hay 3 cổng COM, với người dùng bình thường nhiều khi còn không biết cổng COM nào kết nối với thiết bị đang sử dụng.
Để giải quyết vấn đề này, mình cũng từng Post bài hỏi bên ddth.com, tuy nhiên không phải là ý hay khi hỏi các vấn đề liên quan đến phần cứng bên đó. Google cho xong. Và mình đã có cách để giải quyết vấn đề này:
* Mỗi một thiết bị USB đều có Product ID và Vendor ID (ví dụ của Microchip là VID = 0x04D8 và PID = 0x000A) .
* Sử dụng ManagementObjectSearcher trong .NET để lấy thông tin phần cứng
* Kiểm tra thông tin phần cứng với PID và VID có trùng với cổng USB-COM của mình không, trả về tên cổng COM.
Code C# (nhớ add ref cho System.Management)
Code:
public string GetComPort(string hardwareId) { try { ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity"); foreach (ManagementObject port in searcher.Get()) { string name = port["Name"].ToString(); if (name.Contains("COM")) { string[] o = (string[])port["HardwareId"]; if (o != null) { if (o.Length > 1) { string[] Sp = SerialPort.GetPortNames(); if (o[1] == hardwareId) { foreach (string PortName in Sp) { if (name.Contains(PortName)) return PortName; } } } } } } } catch (ManagementException) { } return null; }
Code:
_portName = GetComPort("USB\\VID_04D8&PID_000A"); //return "COM8"
[Bổ sung]
Để biết Hardware Id, các bạn xem hình bên dưới
Comment