天天看点

C#学习--项目实战之串口通信工具三写在前面写在结尾

C#学习--项目实战之串口通信工具三

  • 写在前面
    • 缓冲区问题
    • 多个线程同时操作一个队列问题
  • 写在结尾

写在前面

不学不知道,一学吓一跳,一个礼拜之前做完了这个串口通信工具,感觉自己牛的不行,因为工作原因,一直没做实况测试,所以一直沉浸在我是高手的感觉中。。。这两天做了一些实况测试,我的妈,问题一大堆。。。

缓冲区问题

因为测试的失败,我又花了一个小时,找到SerialPort的官方文档并仔细的阅读了一边,其实大多数方法和属性的概念还是很好理解的,唯独关于缓冲区的知识点我是一个都没看懂,什么接收缓冲区,输入缓冲区,SerialPort缓冲区,总之就是各种各样的缓冲区,然后根据串口通信原理,我以为这些缓冲区都是有联系的,但是经过我的多方考证,上位机是访问不到设备的缓存区的,最远也只能访问到PC串口驱动上的缓存区,所以SerialPort类上的任何关于缓冲区的属性和方法操作的都是上位机的缓冲区与下位无关。

多个线程同时操作一个队列问题

我的上位机是接受下位机传感器的数据,然后制图。但是在制图后,观察图表会发现,图标经常会出现缺失数据块的现象,我首先想到的就是串口通信的常见问题,丢包了呗。但是在用过很多专业的工具测试后发现,只有我的程序有这种现象。我表示不服,凭啥我写的程序就不好使呢。因为是多线程处理的程序,所以数据存储这一块用的是队列,因为队列的存取分别是对这个队列的头尾进行的,所以可以在一定程度上解决多线程对一个对象同时操作而产生的死锁问题。但是实时上传数据的工具,上传数据量很大,所以我就想是不是大量数据的流动导致了队列的数据丢失。但是这个问题不容易检测,我又不能对每进队列的数据都做记录吧,那我只能做对比测试,选择一个比队列更好的集合来解决这个问题,这就是 ConCurrentQueue 高效的线程安全队列。

using System.Collections.Concurrent;

private ConcurrentQueue<byte[]> dataQueue = new ConcurrentQueue<byte[]>();
           

果然,不出我所料,就是因为队列不安全的原因。当然我只是挑选了比较重要的问题来说,其实在实测的时候还遇到了很多问题。。。

写在结尾

真实要不断的学习不断的进步啊,一个月以前,我对串口通信的了解最多也就是,书里面的一个专业名词,但是一个月的项目经验,真的帮助了我很多,所以这里告诉大家一个真理,学一样东西,最好的方法就是不断的使用和完善它。