1、添加引用:
using Microsoft.Win32.SafeHandles;
using System.Runtime.InteropServices;
using System.IO.Ports;
2、从非托管DLL导出函数的必要调用信息
public const short FILE_ATTRIBUTE_NORMAL = 0x80;
public const short INVALID_HANDLE_VALUE = -1;
public const uint GENERIC_READ = 0x80000000;
public const uint GENERIC_WRITE = 0x40000000;
public const uint CREATE_NEW = 1;
public const uint CREATE_ALWAYS = 2;
public const uint OPEN_EXISTING = 3;
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess,uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile);
3、获取本机未占用串口并添加到Combobox中
public bool IsValid(String serial_name)
{
try
{
using (SafeFileHandle hComm = CreateFile("\\\\.\\" + serial_name, GENERIC_READ
| GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero))
{
if (!hComm.IsInvalid)
{
hComm.Close();
return true;
}
// 串口被占用
return false;
}
}
catch
{
// 串口被占用
return false;
}
}
public void GetPorts()
{
string[] ports = SerialPort.GetPortNames();
foreach(string port in ports)
{
if(IsValid(port))combobox1.Items.Add(port);
}
}
4、作用:防止在多个应用程序中配置相同的串口资源!