zoukankan      html  css  js  c++  java
  • 时间机器代码串VC转换

    最近用VC在写一个Activex小插件。其实是操作串口数据通信,通过某个硬件读取串口数据,然后把数据上传到B/S平台。仪器硬件底层是用C语言编写,具体怎么写法,不是我重点关注的东西,我主要负责仪器与PC接口的开发。

    每一个原器件的串口通讯都有一套协议,这个协议是由硬件方定制提供。

    声明:在这里只希望通过博客日志记录的方式总结记录一点东西,以方便本人总结一下,希望各路高手们不要取笑,如果你有更好建议请给我留言,非常感谢!
     下面插件读取的数据进行一个简单的分析,

    从串口读到数据如下:

    0003FE4500000000004000F81E

    A8000000

    838BE614

    0080000000000000

    01803804A9A10100

    02803A0733F10200

    0380000000000000

    0480000000000000

    0580000000000000

    204E0000E8030000

    0D0A7265733D323530283130305229

    从这一串数据来看,完全不知是什么东西,也不知道个所以然。

    拿到硬件协议对比。

    对数据包进行解包(是硬件方给的定义)

    0003FE4500000000004000F81E 这一串代表包头。

    其中

    0003FE:代表包的标识和方向,从下位机到上位机。

    4500:代表命令

    00000000:代表命令参数

    4000:代表包长度

    F8:代表包头检验和

    1E:代表包数据部分检验和

    包数据分析

    A8:列号

    00:检测项目代号

    0000:空白对照值

    838BE614:检测日期时间

    0080000000000000:第一通道数据

    01803804A9A10100:第二通道数据

    02803A0733F10200:第三通道数据

    0380000000000000:第四通道数据

    0480000000000000:第五通道数据

    0580000000000000:第六通道数据

    204E0000E8030000:补充数据(包尾补充数据)

    0D0A7265733D323530283130305229 这一串完全是没用数据。相当于无效数据返回的特征码

    这样一分析下来似乎清晰了一些。但还是不能知道具体数据代表什么东西。

    那么接下来的工作就是数据转换和处理,说白了就是字符串的分析。

    由于数据存储是采用小端模式的,即是低位放在前面,高位放在后面。

    对于包头不用做太多的处理,只是数据据检验和没有问题即可。

    重点是分析,数据包的数据部分,即是我们想要得的有效数据,做重点处理。

    根据字符串占位情况,看到日期时间串:838BE614,这一串协议定义为日期日间字符串。首先说明一下,这个时间串是经过压缩后放入寄存器。
    要把一子串解释成有效易懂的日期时间字符串如:2010-01-01 30:20:12等

    那么下面看一段处理代码。

    //时间日期处理代码片段

    CString checkDate ;//存储日期时间字符串

    CString str1,str2,str3,str4,str5,str6;//中间处理过程临时变量

    UINT utDate=0;
    BYTE by[4];//转化为字节数组
    for(int k=0;k<checkDate.GetLength();k++)
    {
    str1=checkDate.Mid(k*2,2);
      sscanf(str1,"%02X",&by[k]);//转为by[]
    }
    utDate=by[0]|(by[1]<<8)|(by[2]<<16)|(by[3]<<24);//高位\低位转换
    str1.Format("%d",(utDate>>25)&0x7f);//year
    str2.Format("%d",(utDate>>21)&0x0f);//month
    str3.Format("%d",(utDate>>16)&0x1f);//day
    str4.Format("%d",(utDate>>11)&0x1f);//hour
    str5.Format("%d",(utDate>>5)&0x3f);//minute
    str6.Format("%d",(utDate<<1)&0x3f);//second
    checkDate=str1+"-"+str2+"-"+str3+" "+str4+":"+str5+":"+str6;//得到例如 10-3-2 30:1:33 的结果
    COleDateTime dtStart;
    dtStart.ParseDateTime(checkDate);//标准格式化日期时间
    checkDate=dtStart.Format("%Y-%m-%d %H:%M:%S");//得到最后标准输出的格式

     
    看似简单的一串东西,要它变成有用的数据,还是真是经过几番周折的。。。。

    VC俺是菜鸟,很多东西是摸着石头过河。经过几番瞎折腾,总算也能完成任务。。。

  • 相关阅读:
    java如何手动创建一个线程池
    HashMap的面试总结(摘抄)
    JDK源码调试
    分布式和集群的区别
    开发中model,entity和pojo的区别
    java并发编程_CountDownLanch(倒计数锁存器)应用场景
    Map 怎么排序
    java中Thread的 interrupt异常处理
    zookeeper节点失效重连机制
    java并发库_并发库知识点整理
  • 原文地址:https://www.cnblogs.com/cgli/p/1940355.html
Copyright © 2011-2022 走看看