【问题标题】:How to Communicate With Serial Port on a WWAN Modem Using C#如何使用 C# 与 WWAN 调制解调器上的串行端口通信
【发布时间】:2016-12-30 19:36:16
【问题描述】:

我用 C# 编写了一个程序,允许我与计算机内部的串行端口进行通信(使用 AT 命令)。 查找端口的代码如下所示:

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 命令发送到的端口。这是我正在搜索的端口的设备管理器的两张图片

问题是,我们正在使用更新的调制解调器推出我们的计算机,它们的工作方式不同......

新调制解调器不使用在设备管理器中列出物理端口的串行端口。另外,Win32_PnpEntity 搜索中没有显示串行端口...串行端口列在调制解调器属性下。

我的问题是,如何使用 C# 找到调制解调器的串口?

如果有什么方法可以详细说明,请告诉我。

-卢克

【问题讨论】:

    标签: c# serial-port


    【解决方案1】:

    所以,我想出了如何解决我的问题。感谢 Marc 的回答,但对我来说并不奏效。

    我最终遵循了这篇 Stack Overflow 帖子中包含的说明: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 命令。 ;)

    感谢您的帮助, 卢克

    【讨论】:

      【解决方案2】:

      卢克,

      您将不得不更改查询管理树的方式。

      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 命令可以发送到该端口。 希望这会有所帮助。

      问候, 马克

      【讨论】:

      • 嗯...它给了我一个System.NullReferenceException。我将“##### Wireless WWAN Modem”替换为“Your Modem String”,有什么问题?
      • 我可以使用设备 ID 来追踪端口名称吗?
      • 调试:在 var searcher = 行上放置一个断点。跳过命令并查看 searcher 的值。如果为空,则在 WMI Location 中没有搜索到串行端口,我们必须找到合适的位置进行查询。如果 searcher 有价值,请在调试器监视窗口中打开对象并在数据中查找您的调制解调器。找到后,将字符串替换为实际值。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多