C# 如果重复此消息,则将消息添加到忽略列表

C# 如果重复此消息,则将消息添加到忽略列表,c#,serial-port,filtering,ignore,C#,Serial Port,Filtering,Ignore,也许有人可以提供最好的方法来忽略重复的消息,我应该使用什么来忽略,在列表中保存消息并遍历列表,或者将所有消息保存到文件中,最好的方法是什么?我正在使用以下代码从串行端口读取数据: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.IO.Ports; namespace canSniff

也许有人可以提供最好的方法来忽略重复的消息,我应该使用什么来忽略,在列表中保存消息并遍历列表,或者将所有消息保存到文件中,最好的方法是什么?我正在使用以下代码从串行端口读取数据:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;

namespace canSniff
    {
    class PortDataReceived
    {
        public static void Main()
        {
            SerialPort mySerialPort = new SerialPort("COM4");

            mySerialPort.BaudRate = 115200;
            mySerialPort.Parity = Parity.None;
            mySerialPort.StopBits = StopBits.One;
            mySerialPort.DataBits = 8;
            mySerialPort.Handshake = Handshake.None;
            mySerialPort.RtsEnable = true;

            mySerialPort.DataReceived += new  SerialDataReceivedEventHandler(DataReceivedHandler);

            mySerialPort.Open();

            Console.WriteLine("Press any key to continue...");
            Console.WriteLine();
            Console.ReadKey();

        }

        private static void DataReceivedHandler(
                            object sender,
                            SerialDataReceivedEventArgs e)
        {
            SerialPort sp = (SerialPort)sender;
            string indata = sp.ReadExisting();
            Console.WriteLine("Data Received:");
            Console.Write(indata);
        }
    }
}

您可以使用
HashSet
存储收到的消息。 是否应将其另存为文件,取决于应用程序的使用方式。下面的代码知道应用程序运行的时间是否与收到的消息有关

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Ports;

namespace canSniff
    {
    class PortDataReceived
    {

        private HashSet<string> _messages = new HashSet<string>();

        public static void Main()
        {
            SerialPort mySerialPort = new SerialPort("COM4");

            mySerialPort.BaudRate = 115200;
            mySerialPort.Parity = Parity.None;
            mySerialPort.StopBits = StopBits.One;
            mySerialPort.DataBits = 8;
            mySerialPort.Handshake = Handshake.None;
            mySerialPort.RtsEnable = true;

            mySerialPort.DataReceived += new  SerialDataReceivedEventHandler(DataReceivedHandler);

            mySerialPort.Open();

            Console.WriteLine("Press any key to continue...");
            Console.WriteLine();
            Console.ReadKey();

        }

        private static void DataReceivedHandler(
                            object sender,
                            SerialDataReceivedEventArgs e)
        {
            SerialPort sp = (SerialPort)sender;
            string indata = sp.ReadExisting();

            if(_messages.Add(indata))
            {
                 // the message was added 
                 Console.WriteLine("Data Received:");
                 Console.Write(indata);
            }
            else
            {
                  // do something with the omitted message that was allready in the list
            }
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.IO.Ports;
名称空间canSniff
{
类PortDataReceived
{
私有HashSet_messages=新HashSet();
公共静态void Main()
{
SerialPort mySerialPort=新的SerialPort(“COM4”);
mySerialPort.BaudRate=115200;
mySerialPort.Parity=奇偶校验.None;
mySerialPort.StopBits=StopBits.One;
mySerialPort.DataBits=8;
mySerialPort.Handshake=Handshake.None;
mySerialPort.RtsEnable=true;
mySerialPort.DataReceived+=新的SerialDataReceivedEventHandler(DataReceivedHandler);
mySerialPort.Open();
Console.WriteLine(“按任意键继续…”);
Console.WriteLine();
Console.ReadKey();
}
私有静态无效DataReceivedHandler(
对象发送器,
SerialDataReceivedEventArgs(e)
{
SerialPort sp=(SerialPort)发送方;
字符串indata=sp.ReadExisting();
如果(_messages.Add(indata))
{
//消息已添加
Console.WriteLine(“接收到的数据:”);
Console.Write(indata);
}
其他的
{
//对列表中已准备就绪的省略消息执行某些操作
}
}
}
}

若要忽略上一条消息,请清除缓冲区:
mySerialPort.DiscardInBuffer()
有关更多信息,请查看此处的答案:我需要忽略5分钟。例如,当所有标准消息都将被忽略时,我将按下按钮,新代码将到达,这个按钮代码我应该处理。请告诉我,这将是这样的:所有接收到的消息我将存储到缓冲区,如果100条不同消息中的一条再次到达并到达缓冲区中的同一条消息,此消息将被忽略?谢谢,我将学习一点关于HashSet的知识。你是对的,当应用程序运行时,消息应该被忽略一次,如果这是你期望的答案,你可以投票并接受它作为答案。非常感谢。