不久前,作了一个远程水表抄表系统,现在拿出来给大家共享。
设备通讯如同人们之间的交流一样:有时候我们围坐在一起自由的聊天,有的滔滔不绝讲述、有的静静的聆听、有的2三个人在窃窃私语;而辩论场上的交流,则必须遵循一定的规则,比如,每个人每次讲话不能超过3分钟, 这样才能保证所有的人都有公平的机会阐述自己的观点。
远程抄表系统中,多个水表终端通过总线连接在一个计算机设备上,所有的水表都在等候中心计算机的指令;当一个水表收到属于自己的指令时,做出相应的动作,并在下一个总线周期报告响应后的状态。我们可以把这种通讯模式,隐喻成课堂上老师和学生的交流方式:老师提出问题,然后被老师点到名的学生站起来回答问题(如果没被点到的学生也都站起来回答问题,情况立即就复杂了)。这种通讯方式,被称为“半双工”,它可以很好的应用在远程抄表系统中。
通过使用半双工通讯机制,我们避免了通讯混乱的情况,所以以后的分析中我们只考虑一个水表的情况。
下面,我们来编写代码,实现水表与中心计算机通过串行通讯端口进行通讯。
来看一下我们的系统图:
首先CCom类,封装计算机读写COM端口的类, 我把每个指令都封装成了对应的方法,您可以根据自己的需求来决定是否把指令封装成方法。这里特别要注意,COM端口的关闭。必须要确保使用完毕后,关闭端口。否则下次我们可能无法打开端口。它主要封装了下面的功能
l 串行端口的开关
l 从串行端口读指令包(ValveCommandPacket, PacketTypes = MasterEnd)
l 向串行端口写指令包(ValveCommandPacket, PacketTypes = SlaveEnd)
l 重置端口
l 本项目中定义的 8个指令
详细的代码参见ccom.cs文件。
其次,ValveCommandPacket封装了COM通讯数据包。用它来完成,文字指令到2进制代码的相互转换。本次开发中主要定义了以下数据位:
l 阀门地址
l 指令类型(控制指令或响应指令)
l 指令字
l 指令内容
l CRC校验码
详细的代码保存在ValveCommandPacket.cs文件中。
最后,CRCGenerator类,提供了一个可以生成8位和16位校验码的类。详细的代码请参照CRCGenerator.cs文件。(本文通过一个远程水表抄表系统的实例梗概,介绍了如何设计串口通讯程序。)