0

私は現在、Visual Studios 2010 c#のSerialPortライブラリを使用してカスタムメイドの PCB からデータを読み取るプロジェクトに取り組んでいます。

現在、ボタンをクリックしてデバイスからデータのバイトとして与えられた特定のタイプのデータを読み取ろうとしています。デバイスからの応答がない場合は、5 秒待ってからタイムアウトします。

ただし、何らかの理由でタイマーに問題があり、多くの場合、5 秒が経過する前に時間切れになり、有効なデータが保存されなくなります。以下は使用したコードです。誰かが私の欠陥を指摘できますか? 私が使用しているSystem.Windows.Forms.Timerのイベント タイマー関数が間違っていると思われます。

ボタンクリック

    bool flag = false;
    private void btnGetData_Click(object sender, EventArgs e)
    {

        string command = "*data#";//make string command to send
        sendCommand(command);
        flag = true;
        gui.Timer.Interval = timerlength;
        gui.Timer.Enabled = true;
        gui.Timer.Tick += new EventHandler(Timer_Tick);


    }

タイマー イベント ハンドラ

    private void readVarsTimer_Tick(object sender, EventArgs e)
    {
       if (flag == true)
        {
            flag = false;//set flag low
            print("Data Timer Expired, Run Command Again.");
            gui.Timer.Stop();//stop timer
            gui.Timer.Enabled = false; //event over
            timerlength = 5000;//reset timer

        }
    }

シリアル ポートがデータを読み込んでいます。タイマーを使用しない送信または受信データは正常に機能するため、シリアル ポートの設定が正しいと想定してください。

            if (flag == true)
            {
              //code to read data in, and parse to display in text boxes correct 
              flag = false; 
            }

その他の重要な注意事項:

  • デバイスから期待できる 3 種類のデータがあるので、対応するボタンでフラグを設定して if/else を使用します。したがって、「フラグ」変数のグローバル宣言です。

  • シリアルポートがゴミ箱データを取得するという問題を検出したことはありません。データを実行して分析し、正しい期待データを取得できることを確認しました。

  • このタイマーは、デバイスがオフのときも問題なく、5 秒間経過してから期限切れになります。

4

1 に答える 1

1

呼び出しを行うための十分なコードがありません。しかし、2 つの基本的な問題が際立っています: 既に有効になっている可能性のあるタイマーを有効にできます。これは何もしません。タイマーの期限が切れるのが早すぎます。さらに深刻な問題は、イベント ハンドラーを追加し続けることです。そのため、タイマーが期限切れになると、Tick イベント ハンドラーが複数回実行されます。

Tick イベントを 1 回だけサブスクライブする必要があります。これは、クラスのコンストラクターで行います。

また、タイマーを開始する前に、タイマーが無効になっていることを確認する必要があります。これを行うには、Tick イベント ハンドラー応答を受信したときに、Enabled プロパティを false に戻します。おそらく後者は欠落しています。btnGetData_Click() メソッドで既に有効になっている場合は、論理エラーであるため、InvalidOperationException を発生させます。または、応答を取得する試みを放棄することが正当な場合は、最初に Enabled = false を強制します。

于 2013-04-28T15:10:57.317 に答える