シリアルポートを介してデータを受信するためのハンドラーでは、データを受信すると、それを文字列に格納し、.contains検索を実行して、データに対して何かを行う必要があるかどうかを判断します。アプリケーションがアイドル状態にあり、(モデムと呼びます)が「接続済み」のようなものを送信すると、正常に動作します。
問題は、マシンをポーリングするときです。戻り結果を期待するコマンドを開始すると、機能せず、理由がわかりません。ここで、メッセージボックスを使用して関数を開始すると、機能します。不要なメッセージボックスは必要ありません。
これが私のコードのサンプルです。
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
if (this.InvokeRequired)
{
RefreshTextBox d = new RefreshTextBox(RefreshTextBoxResults);
Invoke(d);
}
else
{
RefreshTextBoxResults();
}
}
private void RefreshTextBoxResults()
{
//MessageBox.Show("refresh text is occurring");
indata1 = serialPort1.ReadExisting();
rx.AppendText(indata1);
string dataCheck = indata1.ToUpper();
//MessageBox.Show(dataCheck);
if (indata1.ToUpper().Contains("CONNECT"))//dataCheck.Contains("CONNECT"))
{
// MessageBox.Show("connect");
cState.Text = "Connected";
if(connected==false)
connectLink();
}
if (dataCheck.Contains("CONNECTED"))
{
// MessageBox.Show("Active Call in Session");
cState.Text = "Connected";
if (connected==false)
connectLink();
}
if (dataCheck.Contains("NO"))
{
cState.Text = "Disconnected";
disconnect();
}
if (dataCheck.Contains("CAMPOS"))
{
campos = indata1;
camDat = true;
}
}
private void cState_Click(object sender, EventArgs e)
{
writeDevice("callstatus");
}
public void writeDevice(string cmd)
{
try
{
{
serialPort1.Write(cmd + "\r\n");
}
}
catch
{ noconnect(); }
}
cstate()を実行すると、呼び出しステータスとタイプ(存在する場合)が返されます。プロンプトボックスに表示されているように、モデムは応答します。「接続済み」という単語がそこにある場合は、ラベルのテキストを「接続済み」に変更する必要があります。コードが置かれている間、そのラベルには何も起こりません。しかし、RefreshTextBoxResults()の最初の行のコメントを削除して、そのMessageBoxをアクティブにすると、モデムのステータスが検出されます。
何が起こっているのかわかりません。なぜこれが起こっているのか誰かが私に説明できますか?