C# 串行数据接收事件获胜';不要在没有断点的情况下开火
我有一个程序,通过uart接收数据,并将数据处理成二进制文件。由于时间要求,我需要在单独的线程中处理数据。我正在尝试实现多线程/任务,但我认为我的方式不对。我有单独的类:串口和form1。我将接收到的数据排成一个列表队列,每个列表都是通过uart接收的字节包 下面的代码显示了我的串行端口类C# 串行数据接收事件获胜';不要在没有断点的情况下开火,c#,multithreading,winforms,uart,C#,Multithreading,Winforms,Uart,我有一个程序,通过uart接收数据,并将数据处理成二进制文件。由于时间要求,我需要在单独的线程中处理数据。我正在尝试实现多线程/任务,但我认为我的方式不对。我有单独的类:串口和form1。我将接收到的数据排成一个列表队列,每个列表都是通过uart接收的字节包 下面的代码显示了我的串行端口类 public class FPGAPORT { int i = 0; List<byte> data = new List<byte>(); publi
public class FPGAPORT
{
int i = 0;
List<byte> data = new List<byte>();
public SerialPort PORT;
Queue<string> num_elements = new Queue<string>();
public ConcurrentQueue<List<byte>> msg = new ConcurrentQueue<List<byte>>() ;
CancellationTokenSource tokenSource1 = new CancellationTokenSource();
CancellationToken token1;
public FPGAPORT(string PortName, int BaudRate)
{
PORT = new SerialPort(PortName, BaudRate, Parity.None, 8, StopBits.One);
PORT.DiscardNull = false;
DataCollectionTimer.Elapsed += new ElapsedEventHandler(DataCollectionTimer_Tick);
DataCollectionTimer.Interval = 5000;
DataCollectionTimer.Enabled = false;
}
private void DataCollectionTimer_Tick(object sender, EventArgs e)
{
//logic for queuing the lists(packets of bytes)
if (queuing of one packet is done)
{
msg.Enqueue(data);
Task.Factory.StartNew(() => (System.Windows.Forms.Application.OpenForms["Form1"] as Form1).Data_collection(), token1, TaskCreationOptions.LongRunning, TaskScheduler.Default);
}
}
然而,它永远不会开火,除非我从一开始就有一个断点。使用计时器是强制接收串行数据的线程执行的唯一方法。CRC逻辑很长,因此可能无论它使用什么线程,都会占用计算机。老实说,我对如何修理它一无所知。这是我的第一个多线程项目。如果你能帮我,或者至少为我指出正确的方向,或者参考一些链接,我将非常感激。我在下面写下了我的计算机规格,以防它影响多线程速度或其他什么
我使用的电脑规格如下:
RAM:8GB双通道DDR3 1600MHz(4GBx2)
CPU:3代Intel Core i5-3570处理器(6MB,3.4GHz),带HD2500图形,Dell Optiplex 7010。这是一个四核处理器。
HDD:2.5英寸500GB固态Hyb rid硬盘,Optiplex MT台式机我很确定断点问题只是完全不同的东西的副作用。但是,从您的代码中,无法判断出发生了什么错误。从一个空的事件处理程序(只记录到控制台)开始,查看串行端口连接是否正常工作。串行端口没有问题,因为当我删除task.factory.startnew时,接收的串行端口运行良好,但程序非常慢,这就是我尝试实现多线程的原因。所以你认为我应该看另一个错误的部分,而不是多线程?也许有更有效的方法来实现多线程?感谢您的帮助很难完全理解您在这里要做什么-但是多线程可能是一种方法。数据收集在一个线程上完成,数据处理在另一个线程上完成,这是非常常见的。如果应用程序运行缓慢,那么这可能是由于您对数据的处理,而不是单线程/多线程。一旦有一个完整的数据包排队,是否有可能创建多个任务?这可能会减慢速度。也许考虑一个单独的线程来监视队列长度和去队列和处理,因为数据包变得可用。是否有一种有效的方法来持续检查数据包是否可用?我只能想到一个计时器,它会不断地检查数据包.count>0。如果到达断点,事件会正常触发。结果并没有达到你期望的结果。看起来您正在为每个接收消息创建一个新表单。到达断点后,当您单步执行代码时,是否显示任何内容?我怀疑您没有看到结果,因为新表单在显示数据后被处理,所以在运行没有断点的代码时看不到结果。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public void Data_collection()
{
if (FpgaDevice.msg.Count > 0)
{
List<byte> dequedData;
{
if (FpgaDevice.msg.TryDequeue(out dequedData))
{
crc(dequedData);
}
}
//logic for saving data into binary file
}
else{
// close port
}
}
public void crc(List<byte> data_packet)
{
//logic for calculating CRC on the list dequeued(one packet of
bytes)
}
}
PORT.DataReceived += SerialPort_DataReceived;
private void SerialPort_DataReceived(object sender,
SerialDataReceivedEventArgs e)
{
//logic for queuing the lists(packets of bytes)
if (queuing of one packet is done)
{
msg.Enqueue(data);
Task.Factory.StartNew(() => (System.Windows.Forms.Application.OpenForms["Form1"] as Form1).Data_collection(), token1, TaskCreationOptions.LongRunning, TaskScheduler.Default);
}
}