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的知识。你是对的,当应用程序运行时,消息应该被忽略一次,如果这是你期望的答案,你可以投票并接受它作为答案。非常感谢。