本文介绍在串口编程项目中有关系统设计和开发方面的经验总结,希望对正在进行类似系统开发的同行提供一些借鉴和参考,同时也欢迎大家在此讨论。
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、声明
本文所涉及到的内容,是针对具体的项目场景进行的阐述,仅提供参考之用。请各位朋友在实际的应用过程中对项目需求场景进行具体分析。
本系列文章:
2010-04-25 16:12
恩 支持2010-04-25 16:22
恩 支持2010-04-25 17:48
既然采用了事件方式,再采用timer轮询,效率不高,可以采用线程轮询+事件的方式来处理更好些2010-04-25 21:27
我也做过串口通讯,使用的是serialPort+timer。和你的一样。不过惭愧的是没有进行总结过,呵呵,谢谢你的分享,继续关注中。