当前位置: 首页 > news >正文

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

源网址: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事件的细节。这个细节,如果不是通过实践去验证,很难知道,一般人也不会特地跟你说这个细节。在查阅网上的很多串口编程的文章,几乎没有这类细节分析文章。基本原理文章太多了,然而大家都败在了细节上。

相关文章:

  • 【鸡啄米】VC++串口通信编程详解
  • 生产者消费者模式解决强耦合问题
  • MFC多线程编程做时间显示程序
  • 范围for循环(c++ primer 笔记)
  • 转换到 COFF 期间失败: 文件无效或损坏
  • MFC中使用OLE/COM操作EXCEL的方法
  • 半导体器件的分类
  • IGBT是什麽
  • Windows系统字符集及各种字符转换函数(长期填坑)
  • COM组件图解(长期填坑)
  • TreeControl的使用笔记
  • Teach yourself Programing in Ten Years(翻译+原文链接)
  • android-serialport-api源码(c代码部分)
  • PBRT读书笔记(一)
  • Qt实用技巧:会呼吸的痛(呼吸点/呼吸灯)(转载)
  • Android Studio:GIT提交项目到远程仓库
  • CODING 缺陷管理功能正式开始公测
  • Consul Config 使用Git做版本控制的实现
  • Fastjson的基本使用方法大全
  • fetch 从初识到应用
  • java中具有继承关系的类及其对象初始化顺序
  • Laravel 实践之路: 数据库迁移与数据填充
  • maven工程打包jar以及java jar命令的classpath使用
  • php ci框架整合银盛支付
  • vagrant 添加本地 box 安装 laravel homestead
  • 分享几个不错的工具
  • 工作中总结前端开发流程--vue项目
  • 解决iview多表头动态更改列元素发生的错误
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 前端工程化(Gulp、Webpack)-webpack
  • 人脸识别最新开发经验demo
  • 如何利用MongoDB打造TOP榜小程序
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • 一文看透浏览器架构
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (4) PIVOT 和 UPIVOT 的使用
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (四)模仿学习-完成后台管理页面查询
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • .NET Core WebAPI中封装Swagger配置
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .net通用权限框架B/S (三)--MODEL层(2)
  • .NET序列化 serializable,反序列化
  • @entity 不限字节长度的类型_一文读懂Redis常见对象类型的底层数据结构
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例