.NET 串口通讯编程

不久前,作了一个远程水表抄表系统,现在拿出来给大家共享。

 

设备通讯如同人们之间的交流一样:有时候我们围坐在一起自由的聊天,有的滔滔不绝讲述、有的静静的聆听、有的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文件。(本文通过一个远程水表抄表系统的实例梗概,介绍了如何设计串口通讯程序。)

 

posted @ 2016-01-11 12:20  快乐的老毛驴  阅读(635)  评论(0编辑  收藏  举报