通用数据采集平台,从架构到代码

国内某二线城市某科技公司,项目、产品繁多,软硬件通吃。硬件大牛H,软件新人S,研发BOSS:

H:BOSS,这两天刚刚搞出个采集电参数的模块,能不能安排人做个简单的测试程序,就是一个串口,电脑上看一下数据就行,很简单的;

BOSS:可以,小S,你把老H这个功能实现下,在我原来的那个XXX串口程序基础上改一下就行了;

S:我在整个网站,没时间呀?

BOSS:这个简单,改一下显示就行了;

S:行,听你的(无懒!!)

然后S把BOSS原来的程序COPY一份,开改打开串口--->收数据---->分析数据--->显示--->关闭串口,丫的还要改程序名字等等

...

X月过后:

H:BOSS,我整了个XX控制器,需要用电脑软件控制一下就行,就发两个控制指令,然后看到控制结果就行,很简单的;

BOSS:老H,你干的不错呀,小S,你有空把这个控制实现一下,就在你上次那个采集程序基础上改一下就行了;

S:我上次那网站还没整完呀?客户吹的紧呀?

BOSS:这个简单,就两个控制指令,算你半天工作量

S:(内心:简单?简单$%$$####%^)

然后S把原来的采集程序COPY一份,开改打开串口--->发控制指令--->收数据---->分析数据--->显示--->关闭串口,丫的还要改程序名字等等

...

又是X月过后:

H:BOSS呀,有个客户那边说我们的协议不好使,要用国标的协议,能不能把协议稍微改一下,很简单的;

BOSS:嗯,客户第一嘛,小S,耶...小S...小S...小S...小S...

S:老大,我是真没空呀,让老H自己改吧,很简单的,把XX工程打开,改XX文件XX行

H:......

   

思维的逆转

    搞硬件的老H能改?他知道显示界面怎么委托?开玩笑,他可能都不知道什么是类;

    还有为什么老是拿以前的程序来改?因为我们需要以前的串口读写程序,新写的话太废时间,你说我可以封装好点,让别人调用方便点,那还是得调用呀,如果换成网络TCP怎么办?再换成其他的怎么办?

    我们对底层依赖的太严重了!我们应该把这种依赖倒置(小S:不就是依赖倒置嘛,切!!BOSS:#@¥%,理论害死人呀,你丫知道你不实践)。我们要做一个平台,无论什么协议,无论什么串口、网络,甚至其它通信方式,还有WINFORM界面显示我都把它预先处理好,让只会简单C语言的老H只关心他知道的协议; 于是就出现下面这个框架:

 

    绿色表示原始数据包的流向情况,平台自己处理所有与硬件通信功能,所有的协议放在模块中用户自己处理。   

    平台完成开发后,提供一个接口定义的模块,比如下面这个接口:

复制代码
namespace IDataMonitor
{
    public abstract class DllBase
    {
        /// <summary>
        /// 接收数据处理函数
        /// </summary>
        /// <param name="buffer">收到的原始数据</param>
        /// <returns>返回一个字符串,用于采集平台界面显示</returns>
        public abstract string OnReceive(byte[] buffer);

        /// <summary>
        /// 模块加载的时候执行,禁止在该函数里编写长时间执行的代码,如果需要可以用线程代替
        /// </summary>
        public abstract void DllLoad();

        /// <summary>
        /// 在主程序退出时执行
        /// </summary>
        public abstract void DllUnload();

        /// <summary>
        /// 可以通过该委托发送查询/控制指令
        /// </summary>
        public Func<byte[], bool> SendFunc;

    }
}
复制代码

 

    公司内部或其他公司开发人员拿到接口定义模块后,就可以基于它开发完成自己的协议模块(DLL形式),然后放置在平台指定的文件夹下即可,无需再次修改数据通信平台的代码,真正实现公司数据采集平台的通用。

 

用户使用

平台搭建完成后,老H只需要新建一个类库工程,添加接口文件的引用,然后如下处理自己的协议即可:

复制代码
namespace TestDll
{
    public class Class1 : DllBase
    {
        private volatile bool _bListen = true;
        public override string OnReceive(byte[] buffer)
        {
            //这里测试,原包返回
            return Encoding.Default.GetString(buffer);
        }

        public override void DllLoad()
        {
            var thread = new Thread(Query);
            thread.Start();
        }

        public override void DllUnload()
        {
            _bListen = false;
        }

        public void Query()
        {
            while (_bListen)
            {
                string test = "this datas come from test dll";
                SendFunc(Encoding.Default.GetBytes(test));
                Thread.Sleep(1000);
            }
        }
    }
}
复制代码

   

    然后老H把生成的DLL文件放置在平台运行文件夹下,简单配置一下对应的具体网络(或串口):

 

我为了方便,把测试的串口和网络都对应到TestDll处理了,运行的效果如下:

 

    通过代码可以看出,无需了解任何winform、TCP或串口编程知识,甚至可以不用知道什么是TCP,什么是串口,只需要把收到的数据解析出来就行了。小S泪流满面,BOSS清静了!!

 

链接

平台主文件DataMonitor工程及相关的接口测试:https://datamonitor.codeplex.com/

 

知识共享许可协议
作者: .ccp(.cpp的代码人生)
出处: http://www.cnblogs.com/dotcpp/ 
本作品采用 知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
如您有任何疑问或者授权方面的协商,请 给我留言
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值