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

本文关键字:串行端口 | 更新日期: 2023-09-27 18:24:11

我有一个类似于使用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#的新手,所以可能会缺少一些部分。

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

  availablePlayers[plIndex] = rx_data;

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

具体应对措施:

  • 使用List<string>而不是字符串[]
  • 从你的代码中删除try/catch,它只能让你的程序在没有恢复方法的情况下失败
  • 为AppDomain.CurrentDomain.UnhandledException编写事件处理程序,以便在程序因意外异常而终止时提供诊断
  • 熟悉Debug+Windows+Threads调试器窗口。它可以让你看到其他线程中发生了什么,你会看到死锁