之前在ee论坛发了一份实物图:https://bbs.eeworld.com.cn/thread-331569-1-1.html
开始以为串口不是很难,尤其是.net下封装了一个SerialPort类只需要调用相关的方法就行,最开始编写串口通信程序我是按照一般的思路写的,也就是在发送按钮点击时触发事件并对串口写数据,在接受按钮下读数据,但是却出现了一个问题也就是如果串口没写数据,你点击了接受按钮,软件就会假死(软件假死现象我后来通过设置断点一步一步的调试发现主要是我在发送按钮里面做了一个判断如果是没设置串口信息就默认事先设定好的串口信息,如果没打开串口,就调用事先设定的一个方法得到串口,这样就限定死了我一定要点击发送按钮才可以接受数据,才可能不出现死机,其实我做的点击按钮接受和发送的方式如果在没有发送空数据的情况一般不会假死。按照我们一般的常识也不会去不发送数据就去接受数据,但是为了把软件做的更稳定些和尽量减少逻辑上的错误,我没有去将就而是继续调试,之所以我还要调试是因为我当时要解决另外一个更重要的问题,那就是如何时时接受数据即使我没点击接受按钮,为什么我要做这个呢?是因为做这个项目时我想过我可以把这个软件做的简单些,但是我有个坏毛病就是要做就事事尽量做的完美,要不不做,为了把我们的串口功能做的更加强大,比如我不仅在数据显示的同时还把数据保存在文本文件里面了,为什么我要保存在文本文件里面呢?也许有人会问为何不保存在数据库里面呢?我之所以没选择数据库保存数据,是因为我感觉如果保存在数据库里面的数据一般都是要事先知道是什么数据,有什么需要而相应设计数据表,而文本文件就比较通用。仅仅是存储而不需要做处理。还有一个原因就是我在做项目时发现有些串口软件在接受大量数据时就会挂掉而且不宜保存数据,所以我选择了把数据保存在文本文件中。点击接受按钮只不过是把接受到的数据显示在文本列表中而已)。对于如何时时接受数据这块,我开始是采用了定时器设定了每次10ms触发一下接受数据事件但是还是没解决数据如果为空的问题,还是会假死,其实我要做的无非是串口监听功能,C#串口监听的实现由于串口不知道数据何时到达,因此有两种方法可以实现C#串口监听之串口数据的读取。1.用线程实时读串口2.用事件触发方式实现。但由于线程实时读串口的效率不是十分高效,因此比较好的方法是事件触发的方式。事件触发方式中我采用了委托机制,委托其实就有点像C里面的函数指针,只不过它是面向对象的,我们只需要编写事件发生的类(书面上叫事件发生器)和事件接收处理的类。事件发生的类就是说在这个类中触发了一个事件,但这个类并不知道哪个对象或方法将会接收到并处理它触发的事件。所需要的是在发送方和接收方之间存在一个媒介。这个媒介在.NET Framework中就是委托(delegate)。在事件接收处理的类中,我们只需要定义一个处理事件的方法。其实感觉委托机制有点像我们编写驱动时编写的中断服务程序的味道。也是一旦有接受到中断信息,就转到相应的中断处理程序中去处理相关的事件。采用了委托机制后感觉运行效果蛮不错的。满足了我的需要,至于把数据保存在文本文件中,当时我不知道用那个文件控件好,在网上找了好久,没有找到相关的资料,后来自己无意间发现一个FILE静态方法,这个方法好强大,很好用就一个方法就搞定了创建保存和写入数据。之前这个方法也没用过,其实感觉保存数据的实现方法好多种,随便找一种就可以,不得不承认.NET很强大,很好。接下来我准备在做个基于B/S模式下的视频远程监控软件。到时做好了给大伙看下。(这份只是暂时的,还有待更新,主要是项目需求在改变,我的上位机软件功能也随之而变,遇到的问题也在更新,等项目做完了,我重新整理一份最新的与大伙一起分享,这只是串口部分的心得,到时我会把整个上位机软件项目的心得重新上传)