2016-08-23 2 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 명령을 보내는 포트입니다. 다음은 포트 I이 검색하고의 장치 관리자의 두 사진은

XP

Windows 7

문제는, 우리가 새로운 모뎀과 우리의 컴퓨터를 출시된다됩니다에 대한, 그리고 다른 이들 작업 ...

새 모뎀은 장치 관리자의 포트 목록이있는 직렬 포트를 사용하지 않습니다. 또한 직렬 포트가 Win32_PnpEntity 검색에 표시되지 않습니다 ... 직렬 포트가 모뎀 속성 아래에 나열됩니다.

The New Modem

내 질문은, 어떻게 C#을 사용 모뎀의 직렬 포트를 찾을 수 있습니까입니까?

제가 정교 할 수있는 방법이 있는지 알려주십시오.

누가 복음

답변

0

그래서, 나는 내 문제를 해결하는 방법을 알아 냈어. 귀하의 답변에 대해 Marc에게 감사 드려요. 그러나 그것은 저에게 맞지 않았습니다.

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

    } 
    } 
} 

그것은 마법처럼 작동합니다 List all System Modems 여기

일했다 코드입니다 :

나는이 스택 오버플로 게시물에 포함 된 지침에 따라 결국! 이제 새로운 모뎀에서 사용해야하는 새로운 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'을주고있다. "##### Wireless WWAN Modem"을 "Your Modem String"자리에 놓으시겠습니까? 문제는 무엇입니까? –

+0

장치 ID를 사용하여 포트 이름을 추적 할 수 있습니까? –

+0

디버깅 : 줄에 중단 점 배치 var searcher =. 명령을 단계별로 실행하고 searcher의 값을 살펴보십시오. URL이 null 인 경우 검색된 WMI 위치에 직렬 포트가 없기 때문에 쿼리 할 적절한 위치를 찾아야합니다.searcher에 값이 있으면 디버거 조사 창에서 개체를 열고 데이터에서 모뎀을 찾습니다. 찾았 으면 문자열을 실제 값으로 대체하십시오. –

관련 문제