【问题标题】:Find gsm modem port in c#在 C# 中查找 gsm 调制解调器端口
【发布时间】:2011-10-31 15:04:46
【问题描述】:

我想遍历可用端口: System.IO.Ports.SerialPort.GetPortNames() 查找端口是否被 gsm 调制解调器使用。 请有任何想法。

【问题讨论】:

  • 我猜你知道如何与这个设备通信(我不知道)——应该有一些简单的操作(比如询问设备版本/序列号)你可以发送到每个端口来找到设备
  • 我可以向未连接调制解调器的端口发送 AT 命令吗?
  • 当然 - 为什么不呢,恕我直言,您不会看到任何回复
  • 如果向未连接的端口发送 AT 命令会收到不利的响应,这将是不幸的。端口上没有任何东西 - 在这种情况下,如果有东西连接到端口(现在可能性越来越小),则不会给出响应 - 您必须匹配串行端口设置和该设备的预期消息等待。

标签: c# port


【解决方案1】:

我在申请中为一项类似任务做了什么:

  1. 要检查调制解调器是否连接到特定端口,您可以向该端口发送 AT 命令。 如果我们在当前 COM 端口上找到调制解调器,则下面的函数返回 true:

    private bool CheckExistingModemOnComPort(SerialPort serialPort)
    {
        if ((serialPort == null) || !serialPort.IsOpen)
            return false;
    
        // Commands for modem checking
        string[] modemCommands = new string[] { "AT",       // Check connected modem. After 'AT' command some modems autobaud their speed.
                                                "ATQ0" };   // Switch on confirmations
        serialPort.DtrEnable = true;    // Set Data Terminal Ready (DTR) signal 
        serialPort.RtsEnable = true;    // Set Request to Send (RTS) signal
    
        string answer = "";
        bool retOk = false;
        for (int rtsInd = 0; rtsInd < 2; rtsInd++)
        {
            foreach (string command in modemCommands)
            {
                serialPort.Write(command + serialPort.NewLine);
                retOk = false;
                answer = "";
                int timeout = (command == "AT") ? 10 : 20;
    
                // Waiting for response 1-2 sec
                for (int i = 0; i < timeout; i++)
                {
                    Thread.Sleep(100);
                    answer += serialPort.ReadExisting();
                    if (answer.IndexOf("OK") >= 0)
                    {
                        retOk = true;
                        break;
                    }
                }
            }
            // If got responses, we found a modem
            if (retOk)
                return true;
    
            // Trying to execute the commands without RTS
            serialPort.RtsEnable = false;
        }
        return false;
    }
    
  2. 在下一阶段,我们可以从调制解调器收集一些数据。 我使用了以下命令:

    • ATQ0 - 打开确认(每次请求都收到 OK)
    • ATE0 - 开启回声
    • ATI - 获取调制解调器详细信息
    • ATI3 - 获取扩展调制解调器详细信息(并非所有调制解调器都支持此命令)

【讨论】:

    【解决方案2】:
                    // Check each Availble COM port
                    foreach (string l_sport in l_available_ports)
                    {
                        GlobalVars.g_serialport = GlobalFunc.OpenPort(l_sport, Convert.ToInt32(this.cboBaudRate.Text), Convert.ToInt32(this.cboDataBits.Text), Convert.ToInt32(this.txtReadTimeOut.Text), Convert.ToInt32(this.txtWriteTimeOut.Text));
                        if (GlobalVars.g_serialport.IsOpen)
                        {
                            GlobalVars.g_serialport.WriteLine("AT\r");
                            Thread.Sleep(500);
                            string l_response = GlobalVars.g_serialport.ReadExisting();
                            if (l_response.IndexOf("OK") >= 0)
                            {
                                GlobalVars.g_serialport.WriteLine("AT+CMGF=1\r");
                                Thread.Sleep(500);
                                string l_response1 = GlobalVars.g_serialport.ReadExisting();
                                if (l_response1.IndexOf("OK") >= 0)
                                {
                                    GlobalVars.g_PhoneNo = txt_PhNum.Text;
                                    MessageBox.Show("Connected Successfully", "Connection", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                    lblConnectionStatus.Text = "Phone Connected Successfully.";
                                    btnOK.Enabled = false;
                                    btnDisconnect.Enabled = true;
    
                                    GlobalVars.g_serialport.WriteLine("AT+CGSN\r");
                                    Thread.Sleep(500);
                                    string l_imei = GlobalVars.g_serialport.ReadExisting();
                                    Console.WriteLine("Modem IMEI:" + l_imei);
                                    if (l_imei.IndexOf("OK", 1) > 0)
                                    {
                                        l_imei = l_imei.Replace("AT+CGSN\r\r\n", null);
                                        l_imei = l_imei.Replace("\r\n\r\nOK\r\n", null);
                                        lbl_ModemIMEI.Text = l_imei;
                                    }
                                    else
                                    {
                                        lblConnectionStatus.Text = "Phone Connected Successfully. Error reading IMEI.";
                                    }
                                    EnableSMSNotification(GlobalVars.g_serialport);
    
                                    break;
                                }
                                else
                                {
                                    Console.WriteLine("No AT+CMGF cmd response");
                                }
                            }
                            else
                            {
                                Console.WriteLine("No AT cmd response");
                            }
                        }
                        else
                        {
                            Console.WriteLine("No Phone At:" + l_sport);
                        }
                    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 2012-12-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多