C#串口通信数据丢失解决方案

串口通信的一般思路是:先接收数据,然后处理数据,并在数据处理之后再次等待接收新的数据。但这种方法的缺点是,在串口高速率大信息量通信时,会出现丢失数据的情况。
丢失数据的原因是数据接收和数据处理再同一个线程中,如果数据处理的时间太长,则来不及接收的数据只能暂存在缓存中。因此,一旦缓存满了,新到的数据就会冲刷掉未来得及接收的数据,从而造成数据的丢失。因此,只是增加缓存的容量不能解决数据丢失的根本问题。
解决思路:

数据接收与数据处理分别放在两个线程中进行;

数据接收线程:接收数据并将接收到的数据存入数据池中;

数据处理线程:从数据池中读取数据和处理数据;

注意:
由于两个线程可能会同时访问数据池,因此为了使数据接收得到最快的响应,最好不选用数组结构,而是选用队列Queue作为数据池的数据结构。
队列在顺序存储方面非常有用。数据对象在队列的一段插入,另一端移除。当两个线程同时访问队列时,一个线程负责数据存入,另一个线程只负责操作数读取,就会提高程序的运行效率。
代码:

数据接收线程:

ReceiveThread()
{
     string str = serialport.ReadExisting();   //从串口读取数据
     queue.Enqueue(str);  //将数据存入队列
}

数据处理线程:

DealDataThread()
{
      if(queue.Count >=1)
      {
              string data = queue.Dequeue();  //将数据出队
              DealWithReceiveData( data );  //处理数据
       }
}

猜你喜欢

转载自blog.csdn.net/qq_30725967/article/details/88911653