【问题标题】:Determine if serial port is normal COM or SPP判断串口是普通的COM还是SPP
【发布时间】:2011-12-19 14:56:31
【问题描述】:

我正在寻找一种方法来确定 COM 是标准 COM 还是 SPP COM,也称为 COM 设备的电缆替换蓝牙适配器。

我有一个可以在 USB (COM -> USB) 和蓝牙下工作的设备,并且蓝牙接口可以与 SPP 一起工作。

我目前正在使用System.IO.Ports.SerialPort.GetPortNames() 来获取 COM。

有没有办法判断是蓝牙连接还是USB连接?

解决方案:

System.Management.ManagementObjectSearcher Searcher = new System.Management.ManagementObjectSearcher("Select * from WIN32_SerialPort");
foreach (System.Management.ManagementObject Port in Searcher.Get())
{
    foreach (System.Management.PropertyData Property in Port.Properties)
    {
        Console.WriteLine(Property.Name + " " + (Property.Value == null ? null : Property.Value.ToString()));
    }
}

输出也类似:

Availability 2
Binary True
Capabilities 
CapabilityDescriptions 
Caption Standard Serial over Bluetooth link (COM10)
ConfigManagerErrorCode 0
ConfigManagerUserConfig False
CreationClassName Win32_SerialPort
Description Standard Serial over Bluetooth link
DeviceID COM10
ErrorCleared 
ErrorDescription 
InstallDate 
LastErrorCode 
MaxBaudRate 9600
MaximumInputBufferSize 0
MaximumOutputBufferSize 0
MaxNumberControlled 
Name Standard Serial over Bluetooth link (COM10)
OSAutoDiscovered True
PNPDeviceID BTHENUM\{00001101-0000-1000-8000-00805F9B34FB}_LOCALMFG&0000\8&3062A492&0&000000000000_0000001C
PowerManagementCapabilities System.UInt16[]
PowerManagementSupported False
ProtocolSupported 
ProviderType RS232 Serial Port
SettableBaudRate True
SettableDataBits True
SettableFlowControl True
SettableParity True
SettableParityCheck False
SettableRLSD True
SettableStopBits True
Status OK
StatusInfo 3
Supports16BitMode False
SupportsDTRDSR True
SupportsElapsedTimeouts True
SupportsIntTimeouts True
SupportsParityCheck False
SupportsRLSD True
SupportsRTSCTS True
SupportsSpecialCharacters False
SupportsXOnXOff False
SupportsXOnXOffSet False
SystemCreationClassName Win32_ComputerSystem
SystemName JVALDRON-PC
TimeOfLastReset 

【问题讨论】:

标签: c# bluetooth serial-port


【解决方案1】:

您无法通过 SerialPort 类找到此信息。您需要执行 WMI 查询。

按照这样的方式做某事可能会导致您这样做

ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * 
                                      from WIN32_SerialPort");

foreach(ManagementObject Port in searcher.Get()) {

       string a = (string) Port.GetPropertyValue("Name");

}

我还没有加载此代码,所以我不知道您可以获得哪些进一步的属性。但是,如果有的话,WMI 将是实现它的方法。

【讨论】:

  • 完美!如果其他人需要,我将发布我使用的代码和输出。
【解决方案2】:

我看到你在看蓝牙连接的设备:

查询 Win32_PnPSignedDriver 并查看 InfName 属性。该值应该是 bthspp.inf

我不能肯定地说,对于每个支持 SPP 协议的供应商的蓝牙设备,inf 文件将始终是这个名称,但这是默认值。

COM 和 LPT 端口的类 GUID 为:{4d36e978-e325-11ce-bfc1-08002be10318} 参考:https://msdn.microsoft.com/en-us/library/windows/hardware/ff553426

ManagementObjectSearcher Searcher = new ManagementObjectSearcher( computer + @"root\cimv2", 
              "SELECT * FROM Win32_PnPSignedDriver " 
            + "WHERE    ClassGuid = '{4d36e978-e325-11ce-bfc1-08002be10318}' " 
            +       AND DeviceID LIKE 'BTHENUM%' 
            );

【讨论】:

    【解决方案3】:

    也许这对某人有帮助。 代码将返回所有可用的 SPP 串行端口。

    public List<AvailableComPort> LoadAvailableComPorts()
        {
            List<AvailableComPort> serialComPortList = new List<AvailableComPort>();
            using (var searcher = new ManagementObjectSearcher("SELECT * FROM WIN32_SerialPort"))
            {
                foreach (ManagementObject queryObj in searcher.Get())
                {
                    if (queryObj["PNPDeviceID"] != null && queryObj["DeviceID"] != null)
                    {
                        //
                        // "BTHENUM\{00001101-0000-1000-8000-00805F9B34FB}_LOCALMFG&0002\7&1ADE6D9D&1&0012F328A5A3_C00000000"
                        // => get only "0012F328A5A3" as ID
    
                        string pnpDeviceId = queryObj["PNPDeviceID"].ToString();
                        string id = pnpDeviceId.Split(new string[] { "\\" }, StringSplitOptions.None).LastOrDefault();
                        id = id.Split(new string[] { "&" }, StringSplitOptions.None).LastOrDefault();
                        id = id.Split(new string[] { "_" }, StringSplitOptions.None).FirstOrDefault();
    
                        if (serialComPortList.Where(o => o.Id == id).Count() == 0)
                            serialComPortList.Add(new AvailableComPort() { Id = id, ComPort = queryObj["DeviceID"].ToString() });
                    }
                }
            }
    
            List<AvailableComPort> comPortAdvancedList = new List<AvailableComPort>();
            using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity"))
            {
                foreach (ManagementObject queryObj in searcher.Get())
                {
                    if (queryObj["PNPDeviceID"] != null && queryObj["Name"] != null)
                    {
                        string pnpDeviceId = queryObj["PNPDeviceID"].ToString();
                        if (comPortAdvancedList.Where(o => o.Id == pnpDeviceId).Count() == 0)
                            comPortAdvancedList.Add(new AvailableComPort() { Id = pnpDeviceId, Name = queryObj["Name"].ToString() });
                    }
                }
            }
    
            List<AvailableComPort> finalComPortList = new List<AvailableComPort>();
            foreach (var serialComPort in serialComPortList)
            {
                AvailableComPort comPortAdvanced = comPortAdvancedList.Where(o => o.Id.Contains("DEV_" + serialComPort.Id)).FirstOrDefault();
                if (comPortAdvanced != null)
                {
                    comPortAdvanced.ComPort = serialComPort.ComPort;
                    finalComPortList.Add(comPortAdvanced);
                }
            }
            return finalComPortList;
        }
    
    public class AvailableComPort
    {
        public string Id { get; set; }
        public string ComPort { get; set; }
        public string Name { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多