(SerialPort)串口编程知识整理:(三)串口编程的系统设计实用经验 ...
2010-04-25 15:08 by doggies, 493 visits, , ,

    本文介绍在串口编程项目中有关系统设计和开发方面的经验总结,希望对正在进行类似系统开发的同行提供一些借鉴和参考,同时也欢迎大家在此讨论。

 

1、界面设计

 

(1)在界面设计上,由于系统启动后要始终实时监控加油数据,采用了SDI展示方式。

(2)由于每个油站的油机个数不同(标红处),所以将显示信息通过控件进行封装,并且按照实际的客户环境,通过设置动态加载。

(3)界面通过四种颜色表示四种油机状态,分别为绿色-连在正常,黄色-正在加油,红色-加油结束,灰色-连接失败

(4)为了有更好的用户体验,每次系统退出时都保持每条油枪的油品、单价信息,以便下次系统启动时向用户显示。

(5)当进行调价操作时,对应油机的单价要实时调整。

(6)由于通过异步线程接收数据,在数据显示在界面的时候,需要通过代理完成。

 

2、串口的开关顺序控制

         由于系统需要通过SerialPort控件和硬件进行通讯,在通过timer控件进行轮询时,需要异步接收串口数据。基于防御性编程思想,为了保证串口能够正常关闭,在串口进行打开和关闭的操作时,需要注意对timer控件、SerialPort控件和flag信号量进行顺序的控制。Flag信号量是为了保证DataReceived异步接收事件能够接收到一条完成的协议数据。

         串口打开和关闭的顺序如下图所示:

3、串口的通讯状态检查

         通过watchdog方式,设置全局变量count[]数组做为计数器容器,当针对每个油机下发一条命令时,计数器容器对应的该油机计数器累加1,当DataReceived异步接收事件接收到某个油机一条完整的数据时,计数器清零。

         这样系统每次下发命令时,可以检查计数器,假设计数器小于20的时候,则将对应的油机显示置灰,说明这条油枪已经连续20次无法响应,也就是说通讯出现了问题。

 

4、重复数据的处理

         对于串口对同一笔数据重复上传的情况,为了减轻数据库的负载,通过缓存池对数据进行过滤,缓存池存储机号和该笔记录的{wy}序列号。缓存对象池可以是一个DataTable,也可以是一个数组或者其他类型的对象,只要该对象提供按条件查找对比的功能就可以。

 

5、SerialPort控件对象和协议命令的封装

         通过对SerialPort控件对象的封装,保证了多个窗体间对串口实例的调用。在实际开发中也能提高代码的复用性。

对协议命令的封装带来的好处是当底层硬件升级带来协议的变更时,可以更好的降低系统耦合度,减少业务逻辑层的代码修改。

 

6、声明

         本文所涉及到的内容,是针对具体的项目场景进行的阐述,仅提供参考之用。请各位朋友在实际的应用过程中对项目需求场景进行具体分析。

 

本系列文章:

4 条回复

  1.  2010-04-25 16:12
    恩 支持
  2.  2010-04-25 16:22
    恩 支持
  3.  2010-04-25 17:48
    既然采用了事件方式,再采用timer轮询,效率不高,可以采用线程轮询+事件的方式来处理更好些
  4.  2010-04-25 21:27
    我也做过串口通讯,使用的是serialPort+timer。和你的一样。不过惭愧的是没有进行总结过,呵呵,谢谢你的分享,继续关注中。
郑重声明:资讯 【(SerialPort)串口编程知识整理:(三)串口编程的系统设计实用经验 ...】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——