【转】串口编程EV_RXCHAR(节选)

本文深入探讨串口编程中常被忽视的关键细节,如EV_RXCHAR事件的正确理解及如何高效处理返回数据,帮助读者避免常见误区。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源网址:http://www.cjjjs.com/paper/dckf/2016316221846329.aspx

串口编程,简单的说,就是通过串口给设备发送指令。指令则是由一串字节序列组成,这个字节序列都是定好的协议。而所谓的协议,也就是一个人为的约定。那么整体来说,对于串口的编程,就是发一串字节序列给设备,设备解析这个字节序列,然后就知道是什么操作了,然后就做出对应的动作。另一个就是接收返回的数据。当设备执行了一个指令,通常要返回一个执行状态或者返回需要的数据,我们程序里就要根据协议来解释返回的数据是什么意思。

    所以说,串口编程就是发数据和收数据,仅此而已。这也是熟悉的人的一个超精简的总结。然而真要做好串口编程,还有一些细节需要处理好。否则,看别人说的如此简单,可是为什么自己就是做不好呢?原因就是很多细节人家并没有告诉你哦。
    那么发数据分为同步和异步的。同步的就是,发完指令后,函数停在那等待返回数据。异步的就是,发完指令后,函数马上返回了。然后设备什么时候将数据返回就有一个事件来通知了。这也就是我们现在要讲的一个事件。
    当设备返回数据时,第一个字符达到缓冲区时触发EV_RXCHAR事件。EV_RXCHAR事件只是表示,设备开始在返回数据了。此时如果你马上读取缓冲区的数据,只能得到一个字节的数据。事实上,最终得到的数据应该有很多个字节。我们一开始会误以为,EV_RXCHAR事件触发后,所有的数据都准备好了。实际上,EV_RXCHAR事件只是数据开始在返回了。这是一个大坑!新手基本都不清楚,所以要么就是收不到数据,要么就是收到的数据残缺不全。问题就是对于EV_RXCHAR事件的理解是错误的。
    那么这个坑我一旦填好了,也就简单了。如果你要完整的读取返回的数据,可以等待一段时间即可。如果数据量不大,等待100ms就足够了。也就是说,在EV_RXCHAR事件触发时,不是立马读取数据,而是等100ms,然后开始读取数据。一般设备都反应的比较快,几十毫秒所有数据都到了。等待时间的长短,可以测试确定。
    为什么我会说这个方案呢?因为等待是处理起来最简单的。当然,你懂得了EV_RXCHAR事件的细节,那么你也可以不用简单的等待。在每次等待时,会浪费一些时间。为了提高效率,那么就放弃这种做法,你可以不停的从缓冲区读取最新接受到的字符,最后组成一个完整的数据串。这样只要一接受完所有的数据,马上就读取完毕了。这样就不会浪费时间在等待上了。不过这样处理的话,就相对麻烦点。
    我在接受数据时,使用异步读取数据,没有等待,就只能读取一个字节的数据,通过更改等待的时间,然后检测出来,时间越长,数据越多。这个就证实了EV_RXCHAR事件的细节。这个细节,如果不是通过实践去验证,很难知道,一般人也不会特地跟你说这个细节。在查阅网上的很多串口编程的文章,几乎没有这类细节分析文章。基本原理文章太多了,然而大家都败在了细节上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值