Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 串行数据接收事件获胜';不要在没有断点的情况下开火_C#_Multithreading_Winforms_Uart - Fatal编程技术网

C# 串行数据接收事件获胜';不要在没有断点的情况下开火

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

我有一个程序,通过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);
                    }
     }
然而,它永远不会开火,除非我从一开始就有一个断点。使用计时器是强制接收串行数据的线程执行的唯一方法。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);
                        }
         }