【C#串口编程计划】C#通讯类库构建

来源:互联网 发布:java成员变量是什么 编辑:程序博客网 时间:2024/06/06 12:22

这篇图文是关于【串口编程计划】的最后一篇“C#通讯类库的构建”,也就是把这次所做的关于串口系统的代码集成到团队的类库中,做到代码的可复用(以后写串口的系统,只需要写数据的定义,协议的解析部分就好,通讯的部分不用在重复写了)、可扩展(串口通讯系统转换成网口通讯系统只需要修改配置文件就好,不需要修改代码)、灵活性好(串口、网口、Wifi、蓝牙等等,做到AddIn,类似工业中的柔性生产线,按照需要定制就好,不需要修改代码)。
这里写图片描述
通讯的方式有许多种,比如串口通信、网口通信、WIFI通讯、蓝牙通信、射频卡通讯等等,但所有的通讯无外乎都是打开连接、关闭连接、读取数据、写入数据等操作,所以我们定义一个统一的接口ILSGOCommunication。其中事件DataReceived用于接收到数据时,来触发注入的执行方法。

无论何种通信,都需要进行配置,所以定义一个通用的配置接口ILSGOCommunicationSetting。利用这个接口来实现通用的通讯配置。由于,我们刚做的系统是基于RS232串口的,所以我们写了两个实体类来实现这两个接口。后面我们会把基于网口Socket的实体类补充进来。其实都是一样,一样的。
这里写图片描述
有了这两个接口,我就可以编写依赖于此接口的功能或者软件了。当然,我们还需要写有关协议的分析。
这里写图片描述
协议通常分为两种,一种是基于文本的协议,一种是基于二进制的协议。

虽然协议种类不同但对两种协议的处理逻辑是一样的。

首先把接收的数据放入自定义的缓存区List buffer中,然后根据协议的约定:

文本协议:报头+数据+报尾

二进制协议:报头+长度+数据+校验

从缓存区中取出每一帧的数据存入byte[] Raw利用Analyze方法进行解析。这样我们定义IAnalyzer接口,以便统一报文的处理逻辑,IAnalyzerCollection是IAnalyzer的集合类,枚举类型lsgoSearchResult用来标识SearchBuffer方法寻找报文的结果。
这里写图片描述
抽象类AnalyzeResult是IAnalyzer的默认实现。Data属性为解析后的数据,Raw属性为原始数据,TimeOut为数据失效的等待时间,比如你获取下位机发来的电压,过了几秒了,应该就无效了,所以要考虑定时失效(通过AnalyzeResult中的Timer开启线程检测),Valid标识了解析报文是否成功。GetNew事件为解析成功后,注入的执行方法。之所以这样写,是因为不同的系统,报文解析成功后所要处理的逻辑可能不同,有的系统直接写入数据库,有的系统直接写入文件,有的系统却仅仅需要界面显示一下就好。

TextAnalyzeResult和BinaryAnalyzeResult是针对解析文本协议和二进制协议写的抽象类。

BeginOfLine、EndOfLine对应报头与报尾,Encoding对应编码方式。常用的是ASCII码,若要支持中文,则需要设置为Unicode编码。

Mask、LenLength、Checksum对应二进制协议的报头、长度和校验。由于校验的方法很多,常用的有CRC校验,异或校验等等,所以校验这块写成事件注入的方式(CheckSumHandler)以便实际应用中根据不用的校验方式注入不同的执行代码。
这里写图片描述
这些接口可以直接被外部使用,但是这样对不熟悉的使用者感到复杂。所以我们用一个实体类来包装这些接口。所以写一个带有分析功能的类:LSGOComm。

_lstBuffer是接收到数据进行存放的缓冲区,ReadBufferSize为该缓冲区设置大小。Comm属性配置实际需要的通讯(比如上面写的串口通讯),Result属性配置需要解析的实际协议。OnDraw为接收到原始数据后注入的方法,即接收到原始数据,需要执行的代码。通过Comm_DataReceived方法整合分析的代码注入到通讯(ILSGOCommunication)的DataReceived事件中,这样,接收数据,分析数据,解析数据就全部串联起来了。至此,通讯类库的框架就完成了。而这也是使用通讯类库所需要关注的所有内容。

下面举两个例子看看如何使用啊!

第一个是基于文本协议的,后面使用这套代码处理基于文本协议报文的时候,只需要修改这块就好。
这里写图片描述
第二个是基于二进制协议的,后面使用这套代码处理二进制报文时就改这块就好。
这里写图片描述
这里写图片描述
这里写图片描述

0 0