仅从串行端口接收不同的值

时间:2013-07-21 14:59:07

标签: c#

我有一个像使用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#的新手,所以我可能会遗漏一些部分。

1 个答案:

答案 0 :(得分:1)

  availablePlayers[plIndex] = rx_data;

这会在您第二次收到字符串时导致代码崩溃。不幸的是,您还捕获了IndexOutOfRangeException并关闭了端口。这将使代码完全死锁,SerialPort.Close()只能在事件处理程序返回时完成。

具体的对策:

  • 使用List<string>代替字符串[]
  • 从您的代码中删除try / catch,它无法做任何事情,只会让您的程序失败而无法恢复
  • 为AppDomain.CurrentDomain.UnhandledException编写一个事件处理程序,以便在程序因意外异常而死亡时提供诊断
  • 熟悉Debug + Windows + Threads调试器窗口。它允许你看到其他线程中发生了什么,你会看到死锁。
相关问题