C# 解决串口数据丢失问题

C # 串行类( SerialPort )是.NET Framework version 2.0 中一个新增的类,该类将串口操作了封装,从而为串口通信提供了简便方法。

但在实际串口通信的应用中,在串口高波特率大信息量的数据通信时,会出现丢失数据的问题。

通常我们使用SerialPort类接收串口发送过来的数据时,只需要写一个事件函数。

即DataReceived 事件绑定一个处理函数,然后就可以在该函
数中实现对串口数据的读取。 这个函数的内容可以根据我们的需求自行修改。就单纯从接收数据的角度出发, 假设该函数内容如下:

//串口接收事件private void SerialPort_Rec(object sender, SerialDataReceivedEventArgs e){//Thread.Sleep(50);string recString = string.Empty;while (this.SerialPort.BytesToRead > 0){recString += this.SerialPort.ReadExisting();  //数据读取,直到读完缓冲区数据}DealString(recString); //处理接收到的字符串,由自己写}

大多串口程序都会采用这种思路来实现串口通信。即先接收数据,然后处理数据,并在完成数据处理后,再次等待接收新数据。但这种实现方法在串口高速率大信息量通信时,会出现丢失数据的情况。

这里根据我自己的情况举一个例子:

我从下位机每次发送一帧数据给串口,我希望这一帧数据如下:

应答:$STA,A,27.0,1234,210914080000,X
A为仪器ID,27.0为温度,1234为功耗1234mW,RTC时间,X为校验

但实际接收过程中往往只收到一半数据$STA,A,27.0,1234就直接执行了数据处理函数。

解决方法

采样多线程的方法来解决这个问题。

在主线程中专门接收数据,增加一个线程来处理数据。

最好不要选用像数组这样数据结构。因为此类数据结构在多线程中操作时必须频繁地“加锁”和“解锁”,在一定程度上会降低程序的性能。所以我们选用队列 Queen 作为数据池的数据结构。

使用列队的好处在这里充分体现了,数据先入先出,先收到的数据进行处理后就可以直接释放掉这部分内存,使得程序的运行效率大幅增加。

同时在结束处理的的时候,要对队列的长度进行判断,只有把整个队列处理结束才可以结束线程。

同时该方法也存很明显在劣势,如下:

当数据流入队的速度大于出列队(即接收数据的速度大于处理数据),举个简单例子,就相当于我们手上有一万块钱,每天要花20,每天只能赚10块钱,短时间内我们的钱是够用的,但时间一长,资源就会枯竭。

以上情况下,且需要长时间运行时,堆内存就有可能溢出。

这里贴出我的代码:

     //串口接收事件private void SerialPort_Rec(object sender, SerialDataReceivedEventArgs e){while (this.SerialPort.BytesToRead > 0){data_Queue.Enqueue((byte)SerialPort.ReadByte()); //数据入队}}

数据处理线程:

 //数据处理线程public void DealDataThread(){List<byte> databytes = new List<byte>();//byte[] databytes = new byte[20]; //C#,java的数组的数据只能分配在堆区,没有办法while (!canStop) //循环检测列队{ /*中间这部分是我个人的数据处理代码,用户可以根据自己需求自己改变*/if(data_Queue.Count>=24) //当接收到的数据长度足够时开始处理{//System.Diagnostics.Debug.WriteLine(data_Queue.Peek());if (data_Queue.Dequeue()== 36)  //36就是字符'$',即对应帧头{if(data_Queue.Dequeue() == 36)  //双$$指令{for(int i = 0; i < 20; i++){databytes.Add(data_Queue.Dequeue());//databytes.(i, data_Queue.Dequeue().to,1);}fileWriter.WriteLine(System.Text.Encoding.Default.GetString(databytes.ToArray()));databytes.Clear();}}}}}

C#解决串口数据丢失问题相关推荐

  1. C#解决串口通信中接收数据时延迟处理与缓存处理的方法

    转载连接: http://blog.csdn.net/yaoliang11/article/details/6885768 C#解决串口通信中接收数据时延迟处理与缓存处理的方法 时间:2011-1-2 ...

  2. 解决串口通信时会导致鼠标乱跳的问题

    本文转载http://bbs.eeworld.com.cn/thread-492074-1-1.html 不知道大家有没有遇到过在调试串口通信的时候,出现过鼠标指针不受控的乱跳的问题.遇到这样的问题, ...

  3. java地磅串口显示乱码_解决串口接收中文乱码问题

    定义: SerialPort ComDevice = new SerialPort(); 在开启串口前 设置前后文本转换的字符编码 代码:ComDevice.Encoding = System.Tex ...

  4. 解决串口猎人软件Component ‘anigif.OCx‘ or one of its dependencies not correctly registered: a file is miss

    前言 1.问题描述 2.OCX文件介绍(百度而来) 3.解决方法 4.总结强调 该文章为原创,转载请注明出处和作者:https://blog.csdn.net/Eterlove/article/det ...

  5. C# 解决串口接收数据不完整

    使用缓存机制完成.首先通过定义一个成员变量List<byte> buffer = new List<byte> (4096);用来存放所有的数据,在接收函数里,通过buffer ...

  6. 硬盘无法格式化怎么解决?数据丢失怎么恢复?

    有时遇到一些特殊情况,需要我们对电脑磁盘进行格式化.但是硬盘无法格式化,这时我们应该怎么进行操作?你可以根据下面的操作,通过磁盘的创建权限,或者通过磁盘管理来进行格式化,一起来看看下面的简单操作! 一 ...

  7. 解决RabbitMQ数据丢失

    1)生产者弄丢了数据 生产者将数据发送到rabbitmq的时候,可能数据就在半路给搞丢了,因为网络啥的问题,都有可能. 解决: RabbitMQ提供transaction和confirm模式来确保生产 ...

  8. android 串口乱码,解决串口接收数据乱码的问题

    如标题所示,各种仪器仪表进行串口通讯,都可能遇到运行后发现串口数据出错,接收到的都是乱码,不知道是哪个环节出了问题,怎么办? 乱码的原因通常有两个: 1.波特率 数据位 校验位 不匹配,即我们的网络转 ...

  9. P27[9-3]STM32:串口通信(串口发送)(内含:1.接线图+2.实物图+3.代码部分+4.解决串口发送数据,数据是汉字,结果发送结果为乱码的现象)

    1.接线图如下: 跳线帽接在4~5引脚,2,3引脚连接PA9和PA10引脚.下图也可得出USART接PA9和PA10引脚. TX和RX是交叉连接.PA9(黄线)是TX,接RXD.PA9(绿线)是RXD ...

  10. 解决串口通信在安卓6.0系统以及以上版本里面报错的问题

    做好的串口通信功能在低版本安卓系统可以正常运行,在6.0系统就会报错"Detected problems with app native libraries (please consult ...

最新文章

  1. 送给2020年高考的考生
  2. c语言怎么写到单片机里,哪位师傅知道51单片机怎样编写子程序?C语言的。在主程序里调...
  3. ant build.xml文件中能使用的属性介绍
  4. rfid 标签内存_RFID有源与无源的区别与联系
  5. (转)AppDomain 和动态加载
  6. lucas+卡特兰数
  7. Office 2007 Pro/Ent 简体中文版下载
  8. 孙玄:年薪75万的真实技术面试实践攻略(篇章一)
  9. html5打印样式没有加载,cad打印样式不见了(cad没有打印样式表)
  10. 千千静听滚动条消失的原因
  11. NLP之逆向最大匹配算法(BMM)
  12. iOS之导航UINavigationController的使用(一)
  13. 目前绝大多数处理语言先验性文章总结
  14. java的课程总结报告_java课程总结报告
  15. 红外线测温仪方案开发
  16. 【QCA】SDK11.2添加Marvell AQR114c的支持(uboot+linux)
  17. 计算机在储存波形,安泰示波器维修分享--泰克数字示波器的存储功能详解
  18. PodDisruptionBudget
  19. 如何将SEO与SEM结合推广网站
  20. 免费抽奖 | 《阿巴豆》探索未来系列盲盒数字版权作品全网首发!

热门文章

  1. gst 测试摄像头命令
  2. 移动端H5强制页面横屏展示
  3. 企业邮箱怎么发邮件?企业邮箱无法收发信是怎么回事?
  4. 软件科技创新创业基地暑期集训有感
  5. H264系列(10):GOP之M和N值介绍
  6. Visio 2013最新产品密钥分享,在安装时可以使用以下密钥:
  7. NeHe OpenGL教程 第十三课:图像字体
  8. grub4dos引导启动linux,Grub4Dos 手动引导指令
  9. 计算机性能和拷机软件
  10. Clouda框架:入门全过程之安装使用