で GPRS 接続を確認するスレッドで作業していますCompactFramework
。
スレッドの考え方は単純です。プログラムが接続されていない場合は、コードを実行して接続します (このコードではエラーが発生します)。接続に問題がない場合は、60 秒後に再度チェックします。
さて、接続コードに焦点を当てます。次のコードは、接続されているかどうかを確認します。接続されていない場合は、DataReceive
イベントにサブスクライブします。
void initFormText()
{
if (isThereConnect()) //true if it is connected
{
//enable timer to recheck if it's connected
}
else //it isn't connected
{
serialPort1.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(serialPort1_DataReceived);
if (serialPort1.IsOpen)
{
serialPort1.Close();
}
serialPort1.Open();
timerStep.Enabled = true;
}
}
ここで問題が発生します。serialPort1_DataReceived でデータを確認し、timerStep によってテストされる変数を設定すると、いくつかの手順が実行されます。
問題は DataReceived イベントで発生します。スレッドの外部で次のコードを実行すると、正常に動作し、すべてのジョブを実行して接続を確立しますが、スレッドでは動作しません。これをいくつか追加してテストしMessageBox
たところ、DataReceive 内のものが表示されないことがわかりました。
void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
byte[] data = new byte[1024];
int n = serialPort1.Read(data, 0, data.Length);
string rec = Encoding.GetEncoding("windows-1252").GetString(data, 0, n);
if (string.IsNullOrEmpty(rec))
{
return;
}
if (rec.Contains("AT+CIMI") && rec.Contains("OK"))
{
MessageBox.Show("serialPort 1");
currState = 1;
}
else if (rec.Contains("READY"))
{
MessageBox.Show("serialPort 11");
currState = 1;
}
else if (rec.Contains("0,1") || rec.Contains("0,5"))
{
MessageBox.Show("serialPort 2");
currState = 2;
}
}
そのため、何らかの理由で serialPort が何も受信しておらず、その理由がわかりません。スレッドの外では機能するが、スレッド内では機能しないという事実は、私を苛立たせています。
助けていただければ幸いです。ありがとうございます!