仅从串行端口接收不同的值
本文关键字:串行端口 | 更新日期: 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调试器窗口。它可以让你看到其他线程中发生了什么,你会看到死锁