没有断点就不会触发serial_data接收到的事件

时间:2019-10-07 16:09:43

标签: c# multithreading winforms uart

我有一个程序,可通过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桌面

0 个答案:

没有答案