代码改变世界

(SerialPort)串口编程知识整理:(三)串口编程的系统设计实用经验总结

2010-04-25 15:08  doggies  阅读(5138)  评论(6编辑  收藏  举报

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

 

1、界面设计

 

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

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

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

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

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

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

 

2、串口的开关顺序控制

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

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

3、串口的通讯状态检查

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

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

 

4、重复数据的处理

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

 

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

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

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

 

6、声明

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

 

本系列文章:

(1)(SerialPort)串口编程知识整理:(一)基本概念和项目实践概述

(2)(SerialPort)串口编程知识整理:(二)串口编程中经常用到的进制转换和其他公共方法

 (3)(SerialPort)串口编程知识整理:(三)串口编程的系统设计实用经验总结

(4)(SerialPort)串口编程知识整理:(四)多串口系统的分布式架构设计