当前位置:C++技术网 > 资讯 > 串口编程开发的经验总结:EV_RXCHAR事件的理解

串口编程开发的经验总结:EV_RXCHAR事件的理解

更新时间:2016-03-16 22:18:46浏览次数:1+次

    最近在做串口编程,因为之前没有做过,所以在这方面,又是新手!对,非常的新手。虽然凭借着自己的编程经验,感觉这个东西也不难。然后却折腾了一两天才熟悉。
    引用一段话:
    初学者一个很大的优势就是什么也不懂!正是什么也不懂,在自己钻研的时候,学得到更多东西,当然对应的代价就是困难比较大。而灌输式学习往往会让你失去对很多问题的深思,从而学的很肤浅。没有什么是不能问的,也没有一个固定的学习顺序,很多人告诉你,这个你可以不看,那个可以以后再学,然后过了很久,才会发现,很多地方准备学习却被这种学习模式否定,然后学的很肤浅,学的很机械,学的很无趣,学的一无所知。请时刻保持初学者的心态学习任何东西,你将受益终身。 --- C++技术网(http://www.cjjjs.com)
    所以,我又一次感受到,作为一个新手的快感。我又一次体验到完全不知情到弄得清清楚楚的感觉的过程了。这对于很多刚涉足一个不熟悉的领域时的人来说,都是一个巨大的挑战。然而我多数是很喜欢的。同时,我更愿意将这种探索过程,一点一滴的分享给大家。当你要做这些东西的时候,路上的坑都被我填好了。
    正是我什么也不懂,所以每一点我都严格把关。我讨厌稀里糊涂蒙混过关。即使是拿到可运行的代码,真要做的话,还是会研究仔细了。
    那么下面说说串口编程的一些小点滴。这里我不做全盘的分析了。就讲一下EV_RXCHAR事件的问题,如果有时间了,我想我会大概做一个专题的总结,而且是零基础很详细的分析入门的。当你懂了之后,这都什么跟什么呀,这么简单的东西还要做个专题?然而在你不懂得时候,天都是黑暗的。明明知道不会很难,可就是很多潜伏的坑你不知道。现在很多人在网上能够搞到一段差不多能够运行的代码就不管了。这个和大学里抄作业差不多,错都错成一样的。可悲的事情,我希望在我从事的这些方面终止,我不会延续这种可怕的事情。
    串口编程,简单的说,就是通过串口给设备发送指令。指令则是由一串字节序列组成,这个字节序列都是定好的协议。而所谓的协议,也就是一个人为的约定。那么整体来说,对于串口的编程,就是发一串字节序列给设备,设备解析这个字节序列,然后就知道是什么操作了,然后就做出对应的动作。另一个就是接收返回的数据。当设备执行了一个指令,通常要返回一个执行状态或者返回需要的数据,我们程序里就要根据协议来解释返回的数据是什么意思。
    所以说,串口编程就是发数据和收数据,仅此而已。这也是熟悉的人的一个超精简的总结。然而真要做好串口编程,还有一些细节需要处理好。否则,看别人说的如此简单,可是为什么自己就是做不好呢?原因就是很多细节人家并没有告诉你哦。
    那么发数据分为同步和异步的。同步的就是,发完指令后,函数停在那等待返回数据。异步的就是,发完指令后,函数马上返回了。然后设备什么时候将数据返回就有一个事件来通知了。这也就是我们现在要讲的一个事件。
    当设备返回数据时,第一个字符达到缓冲区时触发EV_RXCHAR事件。EV_RXCHAR事件只是表示,设备开始在返回数据了。此时如果你马上读取缓冲区的数据,只能得到一个字节的数据。事实上,最终得到的数据应该有很多个字节。我们一开始会误以为,EV_RXCHAR事件触发后,所有的数据都准备好了。实际上,EV_RXCHAR事件只是数据开始在返回了。这是一个大坑!新手基本都不清楚,所以要么就是收不到数据,要么就是收到的数据残缺不全。问题就是对于EV_RXCHAR事件的理解是错误的。
    那么这个坑我一旦填好了,也就简单了。如果你要完整的读取返回的数据,可以等待一段时间即可。如果数据量不大,等待100ms就足够了。也就是说,在EV_RXCHAR事件触发时,不是立马读取数据,而是等100ms,然后开始读取数据。一般设备都反应的比较快,几十毫秒所有数据都到了。等待时间的长短,可以测试确定。
    为什么我会说这个方案呢?因为等待是处理起来最简单的。当然,你懂得了EV_RXCHAR事件的细节,那么你也可以不用简单的等待。在每次等待时,会浪费一些时间。为了提高效率,那么就放弃这种做法,你可以不停的从缓冲区读取最新接受到的字符,最后组成一个完整的数据串。这样只要一接受完所有的数据,马上就读取完毕了。这样就不会浪费时间在等待上了。不过这样处理的话,就相对麻烦点。
    我在接受数据时,使用异步读取数据,没有等待,就只能读取一个字节的数据,通过更改等待的时间,然后检测出来,时间越长,数据越多。这个就证实了EV_RXCHAR事件的细节。这个细节,如果不是通过实践去验证,很难知道,一般人也不会特地跟你说这个细节。在查阅网上的很多串口编程的文章,几乎没有这类细节分析文章。基本原理文章太多了,然而大家都败在了细节上。
    更全面详细的串口编程的总结,大家多关注C++技术网上的文章吧。这篇文章就是简单说了一下串口编程,只讲了一个点而已。不过,当你了解了这个点,很多问题就已经解决了。串口发数据就没有什么悬念了。调用WriteFile就OK,发数据是非常简单的。而收数据分同步和异步的处理方式,还有多线程方式,还有完成端口方式。各种方式无非就是要接受数据,如果你对接受数据的本身的很多细节都不了解的话,往往都会不清不楚的。只有先将最基本的细节都搞明白了,什么多线程完成端口,也都是纸老虎了。