0

次のコードを使用して、C#でGSMモデムを見つけようとしています

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO.Ports;
using System.Threading;

namespace LibUsbDotNet_Test1
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] ports = SerialPort.GetPortNames();

            //display ports
            for (int i = 0; i < ports.Length; i++)
            {
                Console.WriteLine(ports[i]);
            }


            //Find Modem
            for (int i = 0; i < ports.Length; i++)
            {
                SerialPort p = new SerialPort(ports[i].Trim());

                if (!p.IsOpen)
                {
                    p.Open();
                }


                /**************nothing below this line get displayed***************************************/

                if (CheckExistingModemOnComPort(p))
                {
                    Console.WriteLine("Modem Found: " + p.PortName);
                }
                else
                {
                    Console.WriteLine("No Modem Found: ");
                }

                p.Close();
            }

            Console.ReadLine();
        }



        private static 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;
        }
    }


}

メソッドCheckExistingModemOnComPortは別のスタック オーバーフロー メンバーhereによって記述されています。

しかし、このコードは行の後では機能しないようです

if (!p.IsOpen)
 {
       p.Open();
 }

この部分はコード内でコメント化されているため、場所を簡単に特定できます。ここで何が問題なのですか?開いているポートも閉じています。

編集

これは私が得る出力です

COM4
COM3
COM5
COM13
COM12
COM11

このコードが入ったときのデバッグウィンドウの出力は次のとおりです

if (!p.IsOpen)
{
         p.Open();
}

ここに画像の説明を入力

私の GSM モデム (ドングル) はCOM13

アップデート

ポートのオープンを処理するために try..catch() ブロックを使用しましたが、モデム用の COM ポートが実際にはアレイに存在するにもかかわらず、「モデムが見つかりません:」というメッセージが表示されます。

4

0 に答える 0