【C#串口编程计划】C#通讯类库构建
这篇图文是关于【串口编程计划】的最后一篇“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事件中,这样,接收数据,分析数据,解析数据就全部串联起来了。至此,通讯类库的框架就完成了。而这也是使用通讯类库所需要关注的所有内容。
下面举两个例子看看如何使用啊!
第一个是基于文本协议的,后面使用这套代码处理基于文本协议报文的时候,只需要修改这块就好。
第二个是基于二进制协议的,后面使用这套代码处理二进制报文时就改这块就好。
相关文章:

WhatsApp与Gmail用户数均突破10亿大关
北京时间2月2日早间消息,FacebookCEO马克-扎克伯格(Mark Zuckerberg)周一宣布,WhatsApp的用户数突破了10亿。今天,谷歌CEO桑德尔-皮查伊(Sundar Pichai)也在财报电话会议中披露,Gmail活跃用户数已突破10亿。 两年前,Fa…

linux 普通用户 mysql_Linux普通用户部署mysql
1、添加一个新用户,并设置密码user testpasswd test2、解压安装包,并重命名为mysqltar zxvf mysql-5.5.54-linux2.6-x86_64.tar.gz3、移除data目录数据rm -rf data/*4、拷贝配置文件cp support-files/my-medium.cnf my.cnf5、新建一个script目录作为启动…

JQUERY搞的相册导航DEMO教学,总有一款合心意
JQUERY搞的相册导航DEMO教学,总有一款合心意 偶然看到的,老外小结的,用jquery搞的相册导航,总有一款合心意,25款哦http://vandelaydesign.com/blog/web-development/jquery-image-galleries/posted on 2009-08-08 00:15 jackyrong的世界 阅读(...) 评论(...) 编辑 收…

ASP.NET Aries JSAPI 文档说明:AR.Form、AR.Combobox
AR.Form 文档 1:对象或属性: 名称 类型 说明 data 属性 编辑页根据主键请求回来的数据 method 属性 用于获取数据的函数指向,默认值Get objName 属性 用于拦截form表单的请求数据对象名,可以表名,视图名 t…
【通俗理解线性代数】 -- 矩阵与空间的基和坐标
本微信图文从矩阵与坐标系的角度对矩阵进行了通俗化介绍!

mysql 5.7 mts_MySQL:MTS和mysqldump死锁
###一、问题来源这是一位客户的提供的案例如下,show processlist截图如下:出现这种问题除非手动干预…

SQL SERVER 获取表结构信息《转载》
获取表信息SELECT表名 casewhena.colorder1thend.name elseend, 表说明 casewhena.colorder1thenisnull(f.value,) elseend, 字段名 a.name, 主键 casewhenexists(SELECT1FROMsysobjects wherextypePKandparent_obja.id andname in( …

混合托管:第三代云计算
企业在选择技术时,都必须立足公司的未来,并保持自己的理念和观点。而技术经过几代改进,才能更加广泛地应用。 以磁盘驱动器作为例子。磁盘驱动器作由IBM公司1953年研发,每一次更新换代时,新的磁盘驱动器的容量更大&…
【通俗理解线性代数】 -- 特殊的矩阵
本微信图文主要介绍了旋转矩阵、对角矩阵和矩阵乘法的几何与物理意义。

mysql 数据库 数组类型转换_mysql数字类型的数据如何进行转换?
如何将MySQL数据库中的数字类型转换为数字函数,今天给大家介绍mysql中的转换函数,这个在实际的生活应用中是运用广泛的,大大减少了我们自己手动进行数字类型的转换。我们今天主要向大家介绍的是用MySQL数字类型如何正确的转换函数(concat/cas…

测试用例设计规范
1、引言 测试设计遵循与软件设计相同的工程原则。好的软件设计包含几个对测试设计进行精心描述的阶段。这些阶段是: ● 测试策略 ● 测试计划 ● 测试描述 ● 测试过程 上述四个测试设计阶段适用于从单元测试到系统测试各个层面的测试。 测试设计由软件设计说明所驱…
【通俗理解线性代数】 -- 矩阵的等价与相似
本微信图文通俗讲解了矩阵等价与矩阵相似的意义。

Martin Fowler对全世界程序员的建议
对全世界的程序员我都是那么几条建议。第一,每年学习并熟悉一个新的编程语言。坚持几年,你对于程序设计会有非常深刻的见解。第二,学习测试驱动开发,这种新的方法会改变你对于软件开发的看法。第三,劳逸结合࿰…

mysql 触发器死循环_请教如何避免该条触发器的死循环
setANSI_NULLSONsetQUOTED_IDENTIFIERONgoALTERTRIGGER[fetchlcf]ON[dbo].[RdRecords]FORINSERT,UPDATEASbeginSETNOCOUNTONdeclarebustypevarchar(12)/*单据类型*/declareidentityi...set ANSI_NULLS ONset QUOTED_IDENTIFIER ONgoALTER TRIGGER [fetchlcf] ON [dbo].[RdRecor…

August 14, 2009 - Choice
转载于:https://www.cnblogs.com/gieno/archive/2009/08/14/1546232.html

深入Java虚拟机之虚拟机体系结构
工作以来,代码越写越多,程序也越来越臃肿,效率越来越低,对于我这样一个追求完美的程序员来说,这是绝对不被允许的,于是除了不断优化程序结构外,内存优化和性能调优就成了我惯用的“伎俩”。 要对…
【通俗理解线性代数】 -- 内积与相关
本图文从向量内积的角度引出了概率论中的相关系数,说明向量内积是线性相似性的表征。

java modelmapper_java - 使用ModelMapper映射抽象类型的字段 - SO中文参考 - www.soinside.com...
我有以下课堂知识层次:public abstract class Base {protected Boolean baseBoolean;}public class A extends Base {private BigDecimal amount;}并且尝试将DTO映射到实体public class DTO {private Base details;}public class Entity {private Base details;}并映…

基于Dialog的MFC程序在启动时隐藏为托盘程序(四)
这部分说一下如何加menu。。如果做小气球。。mfc的menu确是不如C#活着java那么easy..首先在rc里添加menu资源。。然后在ui界面里先设置一下你的菜单。。在第(二)部分已经简单知道了怎么取得tray的鼠标左右点击事件。。下面我们就把左右点击事件分开。。C…
【通俗理解线性代数】 -- 理解二次型
本微信图文介绍了二次型的几何意义以及正定在函数极值中的应用。

《Clojure数据分析秘笈》——1.6节从JDBC数据库读取数据
本节书摘来自华章社区《Clojure数据分析秘笈》一书中的第1章,第1.6节从JDBC数据库读取数据,作者(美)Eric Rochester,更多章节内容可以访问云栖社区“华章社区”公众号查看 1.6 从JDBC数据库读取数据从关系型数据库中读…

java timer cron_Java之旅--定时任务(Timer、Quartz、Spring、LinuxCron)
在Java中,实现定时任务有多种方式。本文介绍4种。Timer和TimerTask、Spring、QuartZ、Linux Cron。以上4种实现定时任务的方式。Timer是最简单的。不须要不论什么框架,只JDK就能够。缺点是不过个时间间隔的定时器,调度简单。Spring和QuartZ都…

诗歌rails之如何写一个简单的Rails Plugin
生成plugin骨架代码: Ruby代码 ruby script\generate plugin MyPlugin ruby script\generate plugin MyPlugin 功能需求: 在BlogController中把所有符合条件的Post(Model)生成为xml 如果不使用插件,很easy : in BlogController Ruby代码 def export_to_xml posts Post.fin…
【通俗理解线性代数】 -- 施密特正交化与QR分解
我们介绍线性代数知识的时候,稍微扩展一点,就能演变成一个新的角度。

iOS实现tableViewCell或collectionCell中点击界面按钮跳转
//找到父类界面 - (UIViewController *)viewController { for (UIView* next [self superview]; next; next next.superview) { UIResponder *nextResponder [next nextResponder]; if ([nextResponder isKindOfClass:[UIViewController class]]) { return (UIViewControlle…

java web 怎么用solr_使用web过滤器增加solr后台登录验证
solr后台自带是没有登录功能的,默认访问地址是:http://localhost:8983/solr/#/(内置jetty运行)。要给sorl后台增加登录验证方法:1、使用web服务器的登录验证(例如jetty、tomcat)这种方式好处是不需要另外写代码,只需配置一下对应的…

《程序设计解题策略》——1.6 利用左偏树实现优先队列的合并
本节书摘来自华章计算机《程序设计解题策略》一书中的第1章,第1.6节,作者:吴永辉 王建德 更多章节内容可以访问云栖社区“华章计算机”公众号查看。 1.6 利用左偏树实现优先队列的合并 优先队列在程序设计竞赛中十分常见,在统计问题、最值问…

Jquery JQZoom Plugin 放大鏡效果 Two
Jquery JQZoom Plugin 放大鏡效果 TwoJquery1.3.2Lib下載地址:http://files.cnblogs.com/davidzhou/jquery-1.3.2.rar插件下載地址:http://files.cnblogs.com/davidzhou/jqzoom_v2.2.rarDemo下載地址:http://files.cnblogs.com/davidzhou/MagnifySol.rar…

如何建立和维护自己的“人脉”
小故事1: 她打开房门,发现自家的门口竟然多了一条死鱼,她感到十分晦气,于是马上扔到垃圾桶了,过了一会儿,又有一条死鱼躺在自家门口,她还是扔了。为了抓住那个做恶作剧的人,她选择待…

java字符串统计英文字符用什么不同_JAVA程序。输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。...
展开全部一、问题分析:输入32313133353236313431303231363533e58685e5aeb931333363373764一行字母,那么会以换行结束。所以可以存入数组,也可以逐个输入,遇到换行结束。要统计各个类的个数,就要逐个判断是哪个分类的。…