串口是很简单的,编写基于串口的程序也很容易。新手们除了要面对一堆的生僻概念,以及跨线程访问的细节,还有一个需要跨越的难题,就是协议解析,上一篇已经说明了:
一个二进制格式的协议一般包含: 协议头 + 数据段长度 + 数据 + 校验
一个Ascii格式的文本协议,一般包含: 数据头 + 正文 + 数据结束标识
类似的命令可能很多,类似的代码也会重复写很多次。对于我,并不觉得这个有任何难度,但是,很多时候,需要写点类似东西的时候呢,我往往不想写,不是别的,要搭建一个这样的框架,这绝对是个体力活,而且还需要耐心和细心。
从我上一次带项目,我就开始考虑编写通用的一个通讯库,支持很多功能,不过和公司内容结合紧密,不适合开源,更不适合推广。我重新组织、抽象了各个概念。希望能让新人朋友减少学习难度,更快的投入到其他方面。
请注意,此文章我也不知道如何归纳,不算科普,不能算类库的介绍,我是在介绍如何设计一个这样的通讯库。
通讯库,并非串口库,所以,我希望有一个基类,可以描述各种通讯方法的基类或接口,微软已经这么做了,他把这个叫做Stream。我认为不好的理由是,提供了Length属性、peek方法、seek方法却无法使用,很多方法和属性是不支持的,如果使用这个类操作硬件,就像一颗地雷,不小心就会写一个不支持的操作,而且会在运行时报错。所以,我希望能针对流设备的硬件,重新设计,我抽象出了一个接口:ICommunication。提供基本的打开、关闭、读写、字符集和有效数据长度等流设备的特性和操作。
为了能有一个通用的配置类,我定义了一个接口:ICommunicationSetting。
当你实现一个设备的时候,你需要实现ICommunication,还需要编写一个设置的类,去实现ICommunicationSetting接口。别觉得麻烦,这是为了能抽象的好,编写一个一劳永逸不用经常重写的通用代码。有了2个接口,我甚至可以开始编写依赖此接口的功能或软件了。当然,我还有需要写有关协议的分析。
既然协议是分2种,那自然要编写BinaryXXX和TextXXX,没错,有这样2个类。
考虑的更详细一点,任何数据,都不是无限期有效的,比如你获取下位机发来的电压,过了几秒了,应该就无效了,所以要考虑定时失效,于是我实现了有效性检查。数据要在字节数组中查找,分析,通知。所以这些公共的部分,我抽出来了,我写了一个接口,叫做:IAnalyzer,并编写了默认的实现,于是有了AnalyzeResult类,同时,区分2种协议方式,创建了子类:BinaryAnalyzeResult和TextAnalyzeResult。
那么,谁来使用ICommunication,IAnalyzer呢?放心,联系有点紧密,我不会撒手扔给外面的,这样做反而更复杂了,不是么。所以我写了一个带有分析功能的类:WyzComm。
使用通讯库的
这个类实现了数据的采集、缓存、分析器的调用,以及事件调用的通知。数据死锁的控制,所有你认为的麻烦事情,都在这里做了。那么,我编写这个类的时候,我肯定不知道未来有多少种协议是不是?那怎么办呢?我无法写死分析器,所以,我编写了接口:IAnalyzerCollection,因为文章从串口说起,我首先提供了串口的实现:
SerialPort(此类和微软的那个名字一样而已,但不是同一个),实现了ICommunication接口,我定义了一个SerialPortSetting类,实现了ICommunicationSetting。
至此。通讯库的框架就完成了。而这也就是使用通讯库所需要关注的所有内容。下面,为了能进行实际的演示,我编写了简单的实现。来演示一种功能,假设我有个程序,需要同时分析二进制数据格式和ASCII的文本数据格式,数据各不相同,使用了通讯库之后,我不需要重写数据的缓存、关闭的死锁处理、数据对界面的通知。我只需要编写2个协议类,和1个协议集合类。我的数据分析工作就完成了。
首先是一个文本协议,协议头是WYZ,协议尾是回车换行,中间是一个整形数字。我只需要设置好头、尾,编写数据分析。
然后我定义了一个二进制协议,分析一条数据包含2个子项。
我首先定义这个数据的具体类型
然后我编写协议分析类
完成了。一个基于串口的,同时分析2种数据的,数据具有有效性判断,支持独立数据通知界面,整体原始数据缓存显示的功能。完成了。
为了演示功能,我写了新的校验方式,当然,你不用管,默认已经支持了异或校验,后续还会把常用校验都添加进去,crc16,crc32,奇偶校验等。
模拟发送数据为:
文本格式发送:WYZ123<CR><LF>
二进制格式发送:AA BB CC 08 0A 00 00 00 FA 3E F7 42 05
vs2008工程项目源码范例
分享到:
相关推荐
008.C# 串口操作系列(5)--通讯库雏形.doc 009.C# 串口操作系列(4) -- 协议篇,文本协议数据解析.doc 00grb.txt 010.C# 串口操作系列(3) -- 协议篇,二进制协议数据解析.doc 011.C# 串口操作系列(2) -- 入门篇,为...
C# 三菱PLC 型号FX系列串口通讯 FX2n-2321F 使用一个开源的技术来读写三菱FX系列模块数据,不需要额外的组件,读取操作只要放到后台线程就不会卡死线程,本组件支持超级方便的高性能读写操作 1)附件C#代码全开源,...
C#打印操作实例--设置页码打印范围源码(201903)
C#打印操作实例--设置页码打印范围源码(十分经典)
串口数据操作,有很多场景应用到串口操作,比如:地磅、超市收银(串口扫码)、工业机械控制(和PLC的交互、和普通硬件的交互),今天分享一下基础版的串口操作。
数据结构与算法(C#实现)系列---二叉树.doc文档中有代码
ASP精华 0.5 2002-5-26 C#知识库 1.0 2003-4-17 C#知识库 2.0 2003-7-25 C#知识库 3.0 2004-2-26 C#知识库 4.0 2004-06-13 C#知识库 5.0 2005-06-27 增加了UML C#知识库 5.1 2005-07-25 增加了企业设计模式 C#知识库...
C#操作xml方法-----C#.Net实例代码
C#源码系列7---一个开源ERP源码(C#)
C#打印操作实例--设置页码打印范围源码(0515).rar
C#打印操作实例---打印空学生证书
C#打印操作实例--设置页码打印范围源码__0525).rar
C#serialPort--TcpSerialport串口通讯 实现serialPort通讯与TcpSerialport通讯
c#串口通讯,c#编写的串口通讯,功能很齐全
c#语言编写---通讯源代码 application/x-rar
C#打印操作实例--设置打印前几页(分开打印)源码(值得下载)
本资源为C#实现Rs232通讯程序,经本人测试有效,可以自动获取本机com口,实现数据发送,但是接收没有测试。
C#打印操作实例---打印空学生证书(0515).rar