如何使用 C# 的SerialPort
类发现设备是否连接到特定的串行 (COM) 端口?
Open
注意:即使没有设备连接到端口,该类的方法也会打开端口。
1.WMI:SELECT * FROM Win32_SerialPort
:
ManagementObjectSearcher manObjSearch = new ManagementObjectSearcher("Select * from Win32_SerialPort");
ManagementObjectCollection manObjReturn = manObjSearch.Get();
foreach (ManagementObject manObj in manObjReturn)
{
//int s = manObj.Properties.Count;
//foreach (PropertyData d in manObj.Properties)
//{
// Console.WriteLine(d.Name);
//}
Console.WriteLine(manObj["DeviceID"].ToString());
Console.WriteLine(manObj["Name"].ToString());
Console.WriteLine(manObj["Caption"].ToString());
}
2.如果设备返回响应:System.IO.Ports.SerialPort.GetPortNames()
并发送基本命令:
foreach (string portname in SerialPort.GetPortNames())
{
var sp = new SerialPort(portname, 4800, Parity.Odd, 8, StopBits.One);
try
{
sp.Open();
sp.Write("Your known command to device");
Thread.Sleep(500);
string received = sp.ReadLine();
if (received == "expected response")
{
Console.WriteLine("device connected to: " + portname);
break;
}
}
catch (Exception)
{
Console.WriteLine("device NOT connected to: " + portname);
}
finally
{
sp.Close();
}
}
答案取决于设备和电缆。
在某些情况下,连接设备时会引发DSR ( SerialPort.DsrHolding
) 甚至 CTS ( )。SerialPort.CtsHolding
但在某些情况下,您可能只连接了 Tx / Rx,唯一的判断方法是尝试与设备通信。
您需要查看设备及其电缆的文档。
没有适用于任何设备的通用解决方案。
您可以通过打开串行端口并发送您的设备支持的最基本命令并检查响应来做到这一点。例如,对于 GSM 调制解调器,您打开端口并按命令发送并接收 ok 作为响应。
您可以尝试几件事