获取连接到串口的设备名称

16

我想了解如何获取连接到串口的设备名称。

我有两种不同类型的设备可以连接它:

第一种: 打印机(仅接收数据,不发送任何内容) 第二种:天平(只发送数据,不接收任何内容)

我如何区分这两种类型的设备?

谢谢。


平衡不会定期发送数据,只有在另一端发生某些事件时才会发送。 ;) - Arnaud F.
5个回答

14

试试这个:

        ManagementObjectCollection ManObjReturn;
        ManagementObjectSearcher ManObjSearch;
        ManObjSearch = new ManagementObjectSearcher("Select * from Win32_SerialPort");
        ManObjReturn = ManObjSearch.Get();

        foreach (ManagementObject ManObj in ManObjReturn)
        {
            //int s = ManObj.Properties.Count;
            //foreach (PropertyData d in ManObj.Properties)
            //{
            //    MessageBox.Show(d.Name);
            //}
            MessageBox.Show(ManObj["DeviceID"].ToString());
            MessageBox.Show(ManObj["PNPDeviceID"].ToString());
               MessageBox.Show(ManObj["Name"].ToString());
               MessageBox.Show(ManObj["Caption"].ToString());
               MessageBox.Show(ManObj["Description"].ToString());
               MessageBox.Show(ManObj["ProviderType"].ToString());
               MessageBox.Show(ManObj["Status"].ToString());

        }

太好了!比检查所有连接的USB设备并筛选它们要快得多,谢谢! - Starwave

11

没有通用的方法来识别串口(UART RS232)设备。

除非这些设备有特殊的命令,您可以向设备发送这些命令,然后它会响应您的请求并提供身份信息,否则您就无能为力。

通常依赖串口的应用程序都会有一个标准设置屏幕,用户可以用它来配置连接设备的串口,包括波特率、奇偶校验位、停止位和数据位等端口配置。如果多个设备可以在同一个端口上切换,则操作员需要在与设备通信之前选择目标设备的正确配置。

这就是新技术(如USB等)的优点,其中设备识别已内置于标准中。


我正在进行一个工业项目,因此并不是所有地方都实现了USB接口... :( 你会如何解决这种情况? - Arnaud F.
@Arnaud:询问用户(可能只需一次并记住答案)。 - Ben Voigt
@ArnaudF,由于RS-232规范中没有标准,因此您最好的希望是探测串行端口,并希望设备有某种可用的识别响应。如果幸运的话,这些设备甚至可能有一种已记录下来的命令语言,可以用来通信和查询设备,但这将取决于相关设备的启发式。通常情况下,这被视为应用程序设置的一部分,用户负责识别设备和串行端口配置(波特率、奇偶校验等)。 - Chris Taylor
这似乎是最好的解决方案,你是对的。谢谢 Chris! - Arnaud F.

0
Class1 UD = new Class1();
{
string strUserAgent = Request.UserAgent.ToLower();
        if (strUserAgent != null)
        {
            string Browser = Request.Browser.Browser;
            string a = Request.Browser.MobileDeviceManufacturer;
            string b = Request.Browser.MobileDeviceModel;
            string c = Request.Browser.Platform;
            string d = Request.Browser.Type;
            string e = Request.Browser.Version;

            UD.Browser = Browser;
            UD.MobileDeviceModel = b;
            UD.MobileDeviceManufacturer = a; 
            UD.Platform2 = c;
            UD.Type = d;
            UD.Version2 = e; 




            if (Request.Browser.IsMobileDevice == true || strUserAgent.Contains("iphone") ||
                     strUserAgent.Contains("blackberry") || strUserAgent.Contains("mobile") ||
                     strUserAgent.Contains("windows ce") || strUserAgent.Contains("opera mini") ||
                     strUserAgent.Contains("palm"))
            {
                UD.deviceType = "Request from Mobile Device";
            }
            else
            {
                UD.deviceType = "Request from Computer";
            }

        }
}

Android设备将以“移动设备”形式出现。 - Tathagata Mukherjee

0
static void Main(string[] args)
{
    ManagementObjectCollection ManObjReturn;
    ManagementObjectSearcher ManObjSearch;
    ManObjSearch = new ManagementObjectSearcher("Select * from **Win32_ParallelPort**");
    ManObjReturn = ManObjSearch.Get();

    foreach (ManagementObject ManObj in ManObjReturn)
    {
        //int s = ManObj.Properties.Count;
        //foreach (PropertyData d in ManObj.Properties)
        //{
        //    MessageBox.Show(d.Name);
        //}
        Console.WriteLine(ManObj["DeviceID"].ToString());
        Console.WriteLine(ManObj["PNPDeviceID"].ToString());
        Console.WriteLine(ManObj["Name"].ToString());
        Console.WriteLine(ManObj["Caption"].ToString());
        Console.WriteLine(ManObj["Description"].ToString());
        Console.WriteLine(ManObj["ProviderType"].ToString());
        Console.WriteLine(ManObj["Status"].ToString());

    }

}

http://www.seeques.com/20766280/the-port-name-is-illegal-or-couldnt-be-connected-to-the-device.html

端口名称非法,像这样的错误消息是怎么回事...fio.!


0
这在Win11上不起作用,而在Win10上有时也不行。试试这个方法,使用devcon.exe并带上参数hwids=ports。
    private void RetrieveDeviceInfo()
           {
        Process proc1 = null;
        try
        {
            proc1 = new Process();
            proc1.StartInfo = new ProcessStartInfo();
            proc1.StartInfo.FileName = this.DevConExeFile;
            proc1.StartInfo.Arguments = "hwids =ports";
            //proc1.StartInfo.RedirectStandardInput = true;
            proc1.StartInfo.RedirectStandardOutput = true;
            proc1.StartInfo.UseShellExecute = false;
            proc1.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            proc1.StartInfo.CreateNoWindow = true;
            proc1.Start();
            proc1.WaitForExit(1000);
            string AllOutput = proc1.StandardOutput.ReadToEnd();
            this.LastOutput = AllOutput;
        }
        catch(Exception em1)
        {
            throw em1;
        }
        finally
        {
            try
            {
                proc1.Kill();
            }
            catch
            {

            }
        }
    }
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接