2016-08-23 26 views
1

私はコンピュータのシリアルポートと(ATコマンドを使用して)通信するためのプログラムをC#で作成しました。 ポートを見つけるためのコードは次のようになります。C#を使用してWWANモデムのシリアルポートと通信する方法

ManagementObjectSearcher searcher = new ManagementObjectSearcher("root\\CIMV2", 
       "SELECT * FROM Win32_PnPEntity"); 

      //This loops through the results from the searcher 
      foreach (ManagementObject queryObj in searcher.Get()) 
      { 
       //If it finds the port, 
       if (queryObj["Caption"].ToString().Contains("##### Wireless AT")) 
       { 
        //it writes it to the file 
        sw.WriteLine("serial port : {0}", queryObj["Caption"] + "\n"); 
        sw.Flush(); 
       } 

このコードは、私たちの古いモデムで見事に動作しますが、それは、COMポートを介して検索し、ATワイヤレスコマンドポートを検索します。これは私のATコマンドを最終的に送るポートです。ここで私は問題は、我々は新しいモデムで、私たちのコンピュータを展開していており、これらは異なる動作

XP

Windows 7

を探していたポートのデバイスマネージャの二つの絵は...

新しいモデムは、デバイスマネージャのポートの物理的なリストを持つシリアルポートを使用しません。また、シリアルポートは、Win32_PnpEntity検索に表示されません...シリアルポートは、モデムのプロパティの下に表示されます。

The New Modem

私の質問は、どのように私はC#を使用してモデムのシリアルポートを見つけるのですかですか?

私が詳しく説明できる方法があるかどうか教えてください。

- ルカ

答えて

0

、私は私の問題を解決する方法を考え出しました。あなたの答えはMarcさんにありがとうございますが、それは私のために働いていませんでした。

私は、このスタックオーバーフローの記事に含まれる指示に従って終わった:List all System Modems

ここで働いていたコードです:

using System.IO.Ports; 
using System.Management; 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using ROOT.CIMV2.Win32; 

namespace Modem 
{ 
    class Program 
    { 

    public static string portName; 
    public static SerialPort _serialPort; 

    static void Main(string[] args) 
    { 

     foreach (POTSModem modem in POTSModem.GetInstances()) 
     { 
      if (modem.Description.Contains("WWAN")) 
      { 
       portName = modem.AttachedTo; 

       SetPort(); 

       break; 
      } 
     } 

    } 


public static void SetPort() 
    { 
     //Assign the port to a COM address and a Baud rate 
     _serialPort = new SerialPort(portName, 9600); 

     //Open the connection 
     _serialPort.Open(); 

     // Makes sure serial port is open before trying to write 
     try 
     { 
      //If the port is not open 
      if (!(_serialPort.IsOpen)) 
       //Open it 
       _serialPort.Open(); 

     } 

     catch 
     { 
      Console.WriteLine("ERROR! Couldn't open serial port..."); 
      Console.ReadKey(); 
     } 

     try 
     { 
      //Here it executes a command on the modem 
      _serialPort.Write("ATI\r"); 


      //Retrieves the output, setting the value to a string 
      string indata = _serialPort.ReadExisting(); 

      Console.WriteLine(indata); 
     } 

     catch 
     { 
      Console.WriteLine("ERROR GETTING INFO!!!"); 
      Console.ReadKey(); 
     } 

    } 
    } 
} 

それは魔法のように動作します!今私は、新しいモデムで使用しなければならないすべての新しいATコマンドを理解する必要があります。 ;)

あなたの助けのおかげで、 ルーク

0

ルーク、

あなたが管理ツリーを照会する方法まで変更する必要があります。

Using System.IO.Ports; 
Using System.Managment; 
Using System; 
private void SetPort() 
    { 
     string[] allPorts = SerialPort.GetPortNames(); 
     bool found = false; 
     SerialPort port; 

     for (int i = 0; i < allPorts.Length; i++) 
     { 
      var searcher = new ManagementObjectSearcher("root\\WMI", "SELECT * FROM MSSerial_PortName"); 
      foreach (ManagementObject queryObj in searcher.Get()) 
      { 
       string instanceName = queryObj["InstanceName"].ToString(); 

       if (instanceName.IndexOf("Your Modem String", StringComparison.Ordinal) > -1) 
       { 
        string portName = queryObj["PortName"].ToString(); 
        port = new SerialPort(portName, 9600, Parity.None, 8, StopBits.One); 
        found = true; 
        break; 
       } 
      } 

      if (found) break; 
     } 
    } 

このループでは、ATコマンドを送信できるシリアルポートがループによって作成されます。 これが役立つことを願っています。だから、

よろしく、 マルク・

+0

は、うーん...それは私に 'System.NullReferenceException'を与えています。 「Your Modem String」の代わりに「#####ワイヤレスWWANモデム」を配置していますが、問題は何ですか? –

+0

デバイスIDを使用してポート名を追跡できますか? –

+0

デバッグ:行にブレークポイントを設定します。var searcher =。コマンドを実行してsearcherの値を調べます。ヌルの場合は、検索されたWMIの場所にシリアルポートがないため、照会する適切な場所を特定する必要があります。searcherに値がある場合は、デバッガウォッチウィンドウでオブジェクトを開き、データ内のモデムを探します。見つかったら、文字列を実際の値に置き換えます。 –

関連する問題