コマンドを COM ポートに送信しようとしてAT
いるので、GSM ドングルを見つけることができます。以下はコードです
public bool findGsmModem()
{
bool sendStatus = false;
//Get all the available ports
string[] serialPorts = SerialPort.GetPortNames();
for (int i = 0; i < serialPorts.Length; i++)
{
Console.WriteLine(serialPorts[i]);
}
//Iterate through all the ports sending AT commands to find a modem
for (int i = 0; i < 1; i++)
{
try
{
//port.PortName = serialPorts[i].Trim();
port.PortName = "COM7";
openPort();
string res = ATCommandCaller("AT", 300,"Unable to connect to the phone"); //Connecting to the phone
//res = ATCommandCaller("AT+CMGF=1", 300); //Setting the message Format
sendStatus = true;
break;
}
catch (System.InvalidOperationException ex)
{
//port.PortName = null;
port.Close();
autoInitializer();
//port = new SerialPort();
continue;
//throw ex;
}
}
return sendStatus;
}
別のクラス内でこのメソッドを呼び出す方法は次のとおりです
if (sms.findGsmModem())
{
MessageBox.Show("Modem Found: " + sms.getPortName());
}
else
{
MessageBox.Show("No modem found");
}
上記の 2 番目のコードを使用すると、findGsmModem()
メソッドで正常に動作し、メッセージが表示されます。これは、モデムが実際には COM5 にあり、値がハード コードされているため、ステートメントがブロックport.PortName = "COM5";
に到達しないためです。catch()
しかし、port.PortName = serialPorts[i].Trim();
orを使用するport.PortName = serialPorts[i];
と、ポート名を出力する代わりに何も起こっていないように見えます(内部findGsmModem()
)。次のポートが印刷されています
COM1
COM2
COM8
COM9
COM5
COM4
COM3
ご覧のとおりCOM5
、 gms モデムが実際に存在するポートは配列の 5 番目の要素にあるため、 part をfindGsmModem()
呼び出しcatch()
てから にアクセスしCOM5
ます。
port.PortName = serialPorts[i].Trim()
私はそれがその部分に行き、catch()
そこで何かひどいことが起こるので、私は何も得られないと信じています.
何か案が?
ここにopenPort()
方法があります
public void openPort()
{
try
{
port.DataReceived += new SerialDataReceivedEventHandler(port_DataReceived);
if (!port.IsOpen)
{
port.Open();
}
port.RtsEnable = true;
port.DtrEnable = true;
}
catch (Exception ex)
{
throw ex;
}
}
編集
ここが最も奇妙な部分です。catch()
ループが呼び出されたときにブロックに到達しないことに気付きました! スタック トレースを印刷しようとex.Message
しましたが、何も印刷されませんでした。