0

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;
            }
        }
4

0 に答える 0