2

RFIDを利用した登録システムのようなプロジェクトがあります。ユーザーが登録モードを有効にした場合、表示される各カードは一度だけ保存する必要があります。このために、配列を使用してから、配列内の同じコードをチェックして、それが既に存在するかどうかを確認しています。しかし、配列インデックスのインクリメントに問題があります。

クラスForm1では、初期化があります:

string rx_data = "";
string last_data = "";
string[] availablePlayers = {""};
int plIndex = 0;

以下のコードでは、 を使用するplIndexと、最初のカードのみを受け取り、このハンドラーの呼び出しを停止するように見えます。

    public void WriteRxData(object sender, SerialDataReceivedEventArgs e)
    {
        if (connection.IsOpen && !cardSaveCon.IsOpen)
        {
            try
            {
                rx_data = connection.ReadLine(); // check how the data ends
               if (!availablePlayers.Any(rx_data.Contains))
                {
                    availablePlayers[plIndex] = rx_data;
                    receivedData.AppendText(rx_data);
                    plIndex++;
                }

            }
            catch (Exception err)
            {
                connection.Close();
            }
        }

しかし、代わりに、ハードコードされたインデックス値を使用すると機能します。これは他の言語でも機能する必要があるため、これを処理する方法を知りたいです。私はC#が初めてなので、欠けている部分があるかもしれません。

4

1 に答える 1

1
  availablePlayers[plIndex] = rx_data;

これにより、2 回目に文字列を受け取ったときにコードがクラッシュします。残念ながら、IndexOutOfRangeException もキャッチしてポートを閉じています。これにより、コードが完全にデッドロックされます。SerialPort.Close() は、イベント ハンドラーが返されたときにのみ完了できます。

具体的な対策:

  • List<string>文字列の代わりに使用する[]
  • コードから try/catch を削除すると、何もできなくなりますが、回復する方法がなくてもプログラムが失敗します
  • AppDomain.CurrentDomain.UnhandledException のイベント ハンドラーを記述して、プログラムが予期しない例外で停止したときに診断を提供します。
  • Debug + Windows + Threads デバッガー ウィンドウに慣れてください。これにより、他のスレッドで何が起こっているかを確認できます。デッドロックが発生している可能性があります。
于 2013-07-21T15:30:40.980 に答える