Kobold Com

名字起源于魔兽世界的地精(Kobold),挖矿为生的小侏儒。

KoboldCom提供自定义多协议异步解析、数据模型转换等功能。提供了常见的16进制字节流协议(HexProtocolAnalyzer)和文本字节串协议(TextProtocolAnalyzer)的解析,所以可以使用KoboldCom,快速实现指定协议的数据收发。

项目地址:KoboldCom

背景

在使用C#开发串口通讯组件时,常用的组件就是系统自带System.IO.Ports.SerialPort类,封装了RS-232/RS-485串口设备的基础通讯,提供串口数据的收发工作。

但实现具体复杂业务时候,这是远远不够的。比如多线程数据处理,下位机数据传输的片段并不是每次都是一个协议包的大小,就会涉及缓冲池,持续解析等、以及数据通过协议到数据模型的转换操作等等一系列问题。在其是在配合通讯协议解析数据时候,多线程处理指令任务,接受上传的数据,对于企业应用场景中往往会引入非常高的复杂度。

因此经过几次整理编写,最后写成的这个独立串口通信组件。解耦业务和串口通讯,封装通讯复杂度。在使用时,只需要定义好协议和对应数据模型,接上串口就可以处理业务需求了。

通讯协议

常见的通讯协议一般是这样的:头+数据长度+数据正文+校验

AA 44 05 01 02 03 04 05 EA

还有一种长这个样子:

$GPGGA,121252.000,3937.3032,N,11611.6046,E,1,05,2.0,45.9,M,-5.7,M,,0000*77

其中$表示开始;GPGGA:代表命令;*表示结尾; 77是校验值

这两种协议很常见,所以组件库默认提供了这两种常用的协议解析类(HexProtocolAnalyzer类和TextProtocolAnalyzer类)。

运行示例

使用KoboldCom封装的WinForm示例应用运行截图。

screenshot

How To Use

建议参考Demo中的使用代码,毕竟实例更好理解。下面贴一下关键代码步骤

// 创建通讯协议和模型转换方法
// Protocol1.cs
...Analyze(){
    // 处理数据模型转换
}

// 创建通讯器
var communicator = new KoboldCom.Communicator(new KoboldCom.SerialPort(), new MyProtocols());
// 通讯器处理接收原始数据
communicator.OnRawDataReceived += Communicator_OnRawDataReceived;
// 自定义模型转换后续操作
Protocol1.OnDataAnalyzed += ProtocolText_OnDataAnalyzed;

事件Events

KoboldCom.Communicator对上层开放了两个事件

  1. OnDataAnalyzed 从串口接收的数据中解析到符合协议要求的数据包,会触发的事件
  2. OnDataReceived 串口收到新数据,会触发该事件

可以给这两个事件分别绑定处理方法就可以进行对应操作。

扩展Extension

如果这两种协议的解析方式不适合你的项目要求,可以继承抽象ProtocolAnalyzer类编写子类,一般只需要复写SearchBuffer方法,,也就是数据到协议的处理逻辑就可以了,其他的不需要改动。

其他

Windows下串口调试工具

0 0 vote
Article Rating
Subscribe
提醒
guest
0 评论
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x