目的:自动获得特定串口。?
?
1、注册表方式
//***********************
// 枚举所有的串口,以及名称,返回特定的串口号
//***********************
int EnumAllComm()
{
HKEY hkey;
int result;
int i = 0;
result = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Hardware\\DeviceMap\\SerialComm", NULL,KEY_READ,&hkey);
if (ERROR_SUCCESS == result) //打开串口注册表
{
TCHAR portName[0x100], commName[0x100];
DWORD dwLong, dwSize;
do
{
dwSize = sizeof(portName) / sizeof(TCHAR);
dwLong = dwSize;
result = RegEnumValue(hkey, i++, portName, &dwLong, NULL, NULL, (LPBYTE)commName, &dwSize);
printf("%s %s\n", portName, commName); //显示名称及值
if (strcmp(portName, "\\Device\\QCUSB_COM20_6")==0) //特定串口
{
return atoi(commName+3);//去掉COM只取号 正常
}
if (ERROR_NO_MORE_ITEMS == result)
{
// 枚举串口
break; // portName是注册表名称(不是设备管理器里的前缀),commName就是值 串口名字comN
}
} while (1);
RegCloseKey(hkey);关闭注册表
}
return -1;//没
}
?
2.直接打开试
//默认只找倒数第一个
int getCommNum()
{
HANDLE hCom;
int i;
BOOL flag;
char str[100] = {0};
flag = FALSE;
for (i = 30; i >= 1; i--)//此程序支持N个串口
{
sprintf(str,"\\\\.\\COM%d",i);
//printf("%s%s",str,"\n");
hCom = CreateFile(str, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (INVALID_HANDLE_VALUE != hCom)
{//能打开该串口,则添加该串口
CloseHandle(hCom);
return i;
}
}
return -1;
}
3、枚举【计算机管理】表
?C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Management;
using System.Text;
using System.Threading.Tasks;
namespace FT_M20
{
class MySerialPort
{
public static string strConvertToHexStr(string str)
{
string strHex = "";
foreach (byte b in str)
{
strHex += String.Format("{0:X2} ", b);
}
return strHex;
}
public static byte[] hexConvertToByteArray(String str)
{
str = str.Replace(" ", "");
byte[] b = new byte[str.Length / 2];
for (int i = 0; i < str.Length; i = i + 2)
{
b[i / 2] = (byte)Convert.ToInt32(str.Substring(i, 2), 16); //将十六进制“10”转换为十进制i
}
return b;
}
/// <summary>
/// Get the target com num.
/// </summary>
/// <returns></returns>
public static string GetComName()
{
string[] strArr = GetHarewareInfo(HardwareEnum.Win32_PnPEntity, "Name");
foreach (string s in strArr)
{
//Quectel USB Serial - 1 Port(COM7)
if (s.Contains("COM"))
{
if (s.Contains("Quectel USB Serial-1"))
{
//Log(s);
return s.Substring(s.Length - 5, 4);
}
}
}
return null;
}
/// <summary>
/// Get the system devices information with windows api.
/// </summary>
/// <param name="hardType">Device type.</param>
/// <param name="propKey">the property of the device.</param>
/// <returns></returns>
public static string[] GetHarewareInfo(HardwareEnum hardType, string propKey)
{
List<string> strs = new List<string>();
try
{
using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("select * from " + hardType))
{
var hardInfos = searcher.Get();
foreach (var hardInfo in hardInfos)
{
if (hardInfo.Properties[propKey].Value != null)
{
String str = hardInfo.Properties[propKey].Value.ToString();
strs.Add(str);
}
}
}
return strs.ToArray();
}
catch
{
return null;
}
finally
{
strs = null;
}
}//end of func GetHarewareInfo().
/// <summary>
/// 枚举win32 api
/// </summary>
public enum HardwareEnum
{
// 硬件
Win32_Processor, // CPU 处理器
Win32_PhysicalMemory, // 物理内存条
Win32_Keyboard, // 键盘
Win32_PointingDevice, // 点输入设备,包括鼠标。
Win32_FloppyDrive, // 软盘驱动器
Win32_DiskDrive, // 硬盘驱动器
Win32_CDROMDrive, // 光盘驱动器
Win32_BaseBoard, // 主板
Win32_BIOS, // BIOS 芯片
Win32_ParallelPort, // 并口
Win32_SerialPort, // 串口
Win32_SerialPortConfiguration, // 串口配置
Win32_SoundDevice, // 多媒体设置,一般指声卡。
Win32_SystemSlot, // 主板插槽 (ISA & PCI & AGP)
Win32_USBController, // USB 控制器
Win32_NetworkAdapter, // 网络适配器
Win32_NetworkAdapterConfiguration, // 网络适配器设置
Win32_Printer, // 打印机
Win32_PrinterConfiguration, // 打印机设置
Win32_PrintJob, // 打印机任务
Win32_TCPIPPrinterPort, // 打印机端口
Win32_POTSModem, // MODEM
Win32_POTSModemToSerialPort, // MODEM 端口
Win32_DesktopMonitor, // 显示器
Win32_DisplayConfiguration, // 显卡
Win32_DisplayControllerConfiguration, // 显卡设置
Win32_VideoController, // 显卡细节。
Win32_VideoSettings, // 显卡支持的显示模式。
// 操作系统
Win32_TimeZone, // 时区
Win32_SystemDriver, // 驱动程序
Win32_DiskPartition, // 磁盘分区
Win32_LogicalDisk, // 逻辑磁盘
Win32_LogicalDiskToPartition, // 逻辑磁盘所在分区及始末位置。
Win32_LogicalMemoryConfiguration, // 逻辑内存配置
Win32_PageFile, // 系统页文件信息
Win32_PageFileSetting, // 页文件设置
Win32_BootConfiguration, // 系统启动配置
Win32_ComputerSystem, // 计算机信息简要
Win32_OperatingSystem, // 操作系统信息
Win32_StartupCommand, // 系统自动启动程序
Win32_Service, // 系统安装的服务
Win32_Group, // 系统管理组
Win32_GroupUser, // 系统组帐号
Win32_UserAccount, // 用户帐号
Win32_Process, // 系统进程
Win32_Thread, // 系统线程
Win32_Share, // 共享
Win32_NetworkClient, // 已安装的网络客户端
Win32_NetworkProtocol, // 已安装的网络协议
Win32_PnPEntity,//all device
}
}
}
|