我有一个程序,可通过uart接收数据并将数据处理为二进制文件。由于时序要求,我需要在单独的线程中处理数据。我正在尝试实现多线程/任务,但我认为我做的方法不正确。我有单独的类:串行端口和form1。我将接收到的数据放入列表队列中,每个列表都是通过uart接收到的一个字节包。
以下代码显示了我的串行端口类
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);
}
}
这是我的form1课
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);
}
}
但是,除非我从一开始就有一个断点,否则它永远不会触发。使用计时器是强制执行串行数据接收线程执行的唯一方法。CRC逻辑很长,因此可能正在使用的任何线程都在占用计算机。老实说,我对如何解决它一无所知。这是我的第一个多线程项目。如果您可以帮助或至少将我指向正确的方向,或者可能引用一些链接,我将不胜感激。我在下面写了我的计算机规格,以防它影响多线程速度或其他方面。
我使用的计算机具有以下规格: RAM::8GB双通道DDR3 1600MHz(4GBx2) CPU:带HD2500显卡的第三代Intel Core i5-3570处理器(6MB,3.4GHz),Dell Optiplex7010。这是一个四核处理器。 HDD :2.5英寸500GB固态混合驱动器,Optiplex MT桌面