首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >连接或断开时检测USB到RS232转换器

连接或断开时检测USB到RS232转换器
EN

Stack Overflow用户
提问于 2016-06-28 15:38:57
回答 3查看 1.2K关注 0票数 2

经过大量的抓挠之后,我设法在我的系统上找到了USB到RS232转换器的com端口号。在目前的系统中,我有15个。现在需要做的是检测何时连接或断开连接的,以便我可以更新我的表。我可以知道如何检测一个USB存储设备,但同样的不适用于USB到RS232转换器。有人知道我怎么能检测到这个吗?

下面是我用来计算转换器使用的com端口的代码片段

代码语言:javascript
运行
复制
private void btn_tst2_Click(object sender, EventArgs e)
{          
    ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2",
    "SELECT * FROM Win32_PnPEntity WHERE ClassGuid=\"{4d36e978-e325-11ce-bfc1-08002be10318}\"");

    foreach (ManagementObject queryObj in searcher.Get())
    {
        rtxbx_output.AppendText(queryObj["Name"].ToString() +"\r");
    }

}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-30 16:12:13

在经历了很多挫折之后,我终于想出了实现我所需要的东西的方法。我贴出了答案,以防它给出一个指针,指向未来被困在同一区域的人。我在代码中包含了注释。我最后得到的是所有Com端口的列表,当一个人离开或加入时,这个列表会被刷新。在您的PC上可以找到dbt.h文件。

要使下面的代码工作,只需使用一个富文本框和两个按钮就可以找到解决方案。

代码语言:javascript
运行
复制
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;
    using System.Management;    //used to perform WMI queries
    using System.Threading;
    using System.Runtime.InteropServices; // needed for marshalling

    namespace MissionControl
    {
        public partial class Control : Form
        {
            public Control()
            {
                InitializeComponent();
            }

            // WndProc = Window Procedures: Every window has an associated     window procedure — a function that processes all messages sent 
        // or posted to all windows of the class. All aspects of a window's appearance and behavior depend on the window procedure's 
        // response to these messages. see https://msdn.microsoft.com/en-us/library/ms632593%28v=vs.85%29.aspx
        protected override void WndProc(ref Message m)
        {
            //you may find these definitions in dbt.h 
            const int WM_DEVICECHANGE = 0x0219; // in dbt.h, BroadcastSpecialMessage constants. 
            const int DBT_DEVICEARRIVAL = 0x8000;  // system detected a device arrived see dbt.h
            const int DBT_DEVICEREMOVECOMPLETE = 0x8004; //system detected a device removal see dbt.h
            const int DBT_DEVTYP_PORT = 0x00000003;  // serial, parallel in dbt.h

            switch (m.Msg)
            {
                case WM_DEVICECHANGE:
                    switch (m.WParam.ToInt32())
                    {
                        case DBT_DEVICEARRIVAL:
                            {
                                // Get the DBT_DEVTYP* as defined in dbt.h
                                // We are looking for DBT_DEVTYP_PORT value = 3 which is Serial port
                                int devTypeA = Marshal.ReadInt32(m.LParam, 4);

                                if (devTypeA == DBT_DEVTYP_PORT)
                                {
                                    rchtxbx_output.SelectedText = string.Empty;
                                    rchtxbx_output.SelectionFont = new Font(rchtxbx_output.SelectionFont, FontStyle.Bold);
                                    rchtxbx_output.SelectionColor = Color.Lime;
                                    rchtxbx_output.AppendText("\rSerial Port Connected\r\rList of Current Ports\r");

                                }
                                else
                                {
                                    // We should never get in here but just in case do somethign rather than fall over
                                    rchtxbx_output.SelectedText = string.Empty;
                                    rchtxbx_output.SelectionFont = new Font(rchtxbx_output.SelectionFont, FontStyle.Bold);
                                    rchtxbx_output.SelectionColor = Color.Red;
                                    rchtxbx_output.AppendText("Non-Serial Port Connected\r");
                                }


                                //To prevent cross threading we will start the function call in its own thread
                                // Create the thread object, passing in GetPortNum
                                //ThreadA is the arrival thread (just connected)
                                Thread ThreadA = new Thread(new ThreadStart(GetPortNum));

                                // Start the thread via a ThreadStart delegate
                                ThreadA.Start();

                            }
                            break;
                        case DBT_DEVICEREMOVECOMPLETE:
                            {
                                // Get the DBT_DEVTYP* as defined in dbt.h
                                // We are looking for DBT_DEVTYP_PORT value = 3 which is Serial port
                                int devTypeD = Marshal.ReadInt32(m.LParam, 4);

                                if (devTypeD == DBT_DEVTYP_PORT)
                                {
                                    rchtxbx_output.SelectedText = string.Empty;
                                    rchtxbx_output.SelectionFont = new Font(rchtxbx_output.SelectionFont, FontStyle.Bold);
                                    rchtxbx_output.SelectionColor = Color.Lime;
                                    rchtxbx_output.AppendText("\rSerial Port Disconnected\r\rList of Current Ports\r");
                                }
                                else
                                {
                                    // We should never get in here but just in case do something rather than fall over
                                    rchtxbx_output.SelectedText = string.Empty;
                                    rchtxbx_output.SelectionFont = new Font(rchtxbx_output.SelectionFont, FontStyle.Bold);
                                    rchtxbx_output.SelectionColor = Color.Red;
                                    rchtxbx_output.AppendText("Non-Serial Port Disconneted\r");

                                }

                                //To prevent cross threading we will start the function call in its own thread
                                // Create the thread object, passing in GetPortNum
                                //ThreadD is the departure thread (disconnected) 
                                Thread ThreadD = new Thread(new ThreadStart(GetPortNum));

                                // Start the thread via a ThreadStart delegate
                                ThreadD.Start();
                            }

                            break;
                    }

                    break;
            }
            //we detect the media arrival event 
            base.WndProc(ref m);
        }


        private void btn_close_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btn_clr_Click(object sender, EventArgs e)
        {
            rchtxbx_output.Clear();
        }

        private void GetPortNum()
        {
            //Windows Management Instrumentation (WMI) consists of a set of extensions to the Windows Driver Model that provides an 
            //operating system interface through which instrumented components provide information and notification. 
            // To work out the WMI to use, get the tool https://www.microsoft.com/en-us/download/details.aspx?id=8572

            //GUID (or UUID) is an acronym for 'Globally Unique Identifier' (or 'Universally Unique Identifier'). It is a 128-bit 
            //integer number used to identify resources. The term GUID is generally used by developers working with Microsoft 
            //technologies, while UUID is used everywhere else.
            // Get the list of ClassGUID from https://msdn.microsoft.com/en-us/library/windows/hardware/ff553426%28v=vs.85%29.aspx

            string comportnum = "";
            int textStart = 0;
            char[] textEnd = { ')' };


            ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2",
                    "SELECT * FROM Win32_PnPEntity WHERE ClassGuid=\"{4d36e978-e325-11ce-bfc1-08002be10318}\"");
            foreach (ManagementObject queryObj in searcher.Get())
            {
                comportnum = queryObj["Name"].ToString(); // Get the name of the comm port

                //Format the string to extract the comport number only
                textStart = comportnum.IndexOf("(COM");
                comportnum = comportnum.Remove(0, textStart + 4).TrimEnd(textEnd);

                //To prevent cross threading use Invoke. We are writing to a control created in another thread.
                rchtxbx_output.Invoke(new EventHandler(delegate
                {
                    rchtxbx_output.SelectedText = string.Empty;
                    rchtxbx_output.SelectionFont = new Font(rchtxbx_output.SelectionFont, FontStyle.Bold);
                    rchtxbx_output.SelectionColor = Color.Lime; //set font colour
                    rchtxbx_output.AppendText("Comm Port = " + comportnum + "\r"); //add some text
                    rchtxbx_output.ScrollToCaret(); // move cursor to the end
                }));
            }
        }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2016-06-28 15:46:16

您可以使用某种线程或任务来查询从方法System.IO.Ports.SerialPort.GetPortNames()返回的数组:当该数组更改或添加一个新元素时,这意味着一个新的串行端口已经连接到系统。

当然,它会返回您系统上的每个串口,但是您可以选择其中哪一个是USB 232转换器和代码片段。

票数 0
EN

Stack Overflow用户

发布于 2016-06-28 15:52:53

你可以利用MSSerial_PortName

注意事项:这不是一个有效的代码,您必须根据您的需求进行更改。

代码语言:javascript
运行
复制
private void btn_tst2_Click(object sender, EventArgs e)
        {   
// connection to WMI rather than cimv2 namespace       
            ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\WMI",
            "select * from MSSerial_PortName");

            foreach (ManagementObject queryObj in searcher.Get())
            {
               queryObj["Active"]; // status
               queryObj["InstanceName"];  
               queryObj["PortName"]; // port number
            }

        }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38080604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档