2016-06-28 22 views
1

頭が激しく擦れた後、私は自分のシステムにUSB to RS232コンバータのCOMポート番号を見つけることができました。私は現在のシステムで15を持っています。 私が今必要とするのは、テーブルが更新できるように、接続されているか接続されていないかを検出することです。私はUSBストレージデバイスを検出する方法を考え出すことができますが、USB to RS232コンバータでは同じことはできません。どのように私はこれを検出することができますかについて誰もが考えを持っていますか?ここで 接続時または切断時にUSB to RS232コンバータを検出する

は、私はあなたが配列のメソッド System.IO.Ports.SerialPort.GetPortNames()から返された照会スレッドまたはタスクのいくつかの並べ替えを行うことができます

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"); 
    } 

} 
+0

私が知る必要があるのは、ポート番号ではなくUSBを接続するときです。上記のコードでポート番号がわかりましたが、USBが接続されていることを今まで知ることができません。 – user3884423

答えて

0

多くの不満の後、私は最終的に私が必要としたものを達成する方法を研究しました。私はそれが同じエリアに将来立ち往生した誰かへのポインタを与える場合に答えを掲示します。私はコードにコメントを入れます。私が最後に得たのは、すべてのComポートのリストであり、これは1つが離れるか、または結合するときに更新されます。 dbt.hというファイルがPC上にあります。

以下のコードを動作させるには、リッチテキストボックスと2つのボタンを含むソリューションを作成します。

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

コンバータによって使用中のCOMポートをうまくするために使用するコードスニペットです:とき、これはアレイの変更、または新しい要素が追加された場合は、新しいシリアルポートがシステムに接続されていることを意味します。

もちろん、システムのすべてのシリアルポートが返されますが、コードスニペットでUSB-RS232コンバーターのいずれかを選択できます。

0

MSSerial_PortNameスニペットを見つけてください。

注::これは動作するコードではありません。要件に応じて変更する必要があります。

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

ありがとうございますが、この作業を行うためには管理者として実行する必要があります。それは、管理者として実行されずに動作する私の元のコードと同じようにポート番号を与えます。これはまだ私に、RS232へのUSBが挿入されたか、または取り外されたかを知らないという問題をもたらします。これは私が現在しようとしているものです。私はそれがハードドライブだった場合、これを得ることができます、どのようにそれを取得する方法は、RS232デバイスのUSBですか? – user3884423

+0

はい、あなたは正しいです、それは管理者でなければなりません。しかし、あなたはqueryObj ["Active"];によって正しいステータスを得ることができません。 wbemtestを使用して、プラグを差し込んでプラグを抜いて状態を確認することをお勧めします。 –

関連する問題