C#、.Net 2.0、および VS2008 を使用してプロジェクトに取り組んでいます。簡単に言えば、私のアプリケーションは USB 経由でデバイスと通信します。また、デバイスからの着信メッセージの処理に問題があります。
これは、「デバイスから何かを取得しました」というイベントのハンドラーです。
private void usb_OnDataRecieved(object sender, DataRecievedEventArgs args)
同じクラスのメソッドで呼び出されることはありません(部分クラスを使用します):
private void btn_indication_start_Click(object sender, EventArgs e)
{
currentTest = "indication";
this.ControlBox = false;
bool isTestPassed = false;
int timeout = 1000;
sendMessageToDevice("A9 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00"); //device should respond to this message
System.Diagnostics.Stopwatch stopwatch = System.Diagnostics.Stopwatch.StartNew();
while (true)
{
if (stopwatch.ElapsedMilliseconds >= timeout)
break;
Thread.Sleep(1);
}
if (!newMessageArrived) //this bool variable always false :(
{
MessageBox.Show("Timeout!"); //usb_OnDataRecieved called only in this block! And newMessageArrived become true
//and when we remove MessageBox, it don't called ever!
this.ControlBox = true;
currentTest = "";
return;
}
//do something else with device...
this.ControlBox = true;
currentTest = "";
}
イベントハンドラーでこの問題を解決するにはどうすればよいですか?
PSフォームのボタンとテキストボックスを介してメッセージを送受信すると正常に動作します:
private void btn_send_Click(object sender, EventArgs e)
{
try
{
string text = this.tb_send.Text + " ";
text.Trim();
string[] arrText = text.Split(' ');
byte[] data = new byte[arrText.Length];
for (int i = 0; i < arrText.Length; i++)
{
if (arrText[i] != "")
{
int value = Int32.Parse(arrText[i], System.Globalization.NumberStyles.HexNumber);
data[i] = (byte)Convert.ToByte(value);
}
}
if (this.usb.SpecifiedDevice != null)
{
this.usb.SpecifiedDevice.SendData(data);
}
else
{
MessageBox.Show("Device not found, plug it");
}
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
private void usb_OnDataRecieved(object sender, DataRecievedEventArgs args)
{
if (InvokeRequired)
{
try
{
Invoke(new DataRecievedEventHandler(usb_OnDataRecieved), new object[] { sender, args });
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
else
{
string rec_data = "Data: ";
foreach (byte myData in args.data)
{
if (myData.ToString("X").Length == 1)
{
rec_data += "0";
}
rec_data += myData.ToString("X") + " ";
}
this.lb_read.Items.Insert(0, rec_data);
lastMessageFromUsb = rec_data;
newMessageArrived = true;
}
}