CAN数据格式-BLF

摘要:
Vector工具记录的数据通常有两种格式:ASC和BLF。本文介绍ASC。

CAN数据格式-BLF第1张

欢迎关注《汽车软件技术》公众号,回复关键字获取资料。

Vector工具录制的数据,一般有ASC和BLF两种格式,本文介绍ASC。

1.BLF定义

BLF(binary logging format)即二进制数据文件。

2.BLF查看

因其是二进制文件,且又做了数据压缩,已经无法直接看到物理数值。需要在Vector工具中回放。

3.BLF组成

安装完Vector软件后,可以在DocLoggingFormat_BLF目录下看到《CAN_and_General_BLF_Format.pdf》(回复“BLF文档"获取)。此文档详细说明了BLF内容。BLF内由一系列数据块组成。介绍几个常用的:

1)VBLObjectHeaderBase

Parameter

Type

mSignature

DWORD

mHeaderSize

WORD

mHeaderVersion

WORD

mObjectSize

DWORD

mObjectType

DWORD

2)VBLObjectHeader

Parameter

Type

mBase

VBLObjectHeaderBase

mObjectFlags

DWORD

mClientIndex

WORD

mObjectVersion

WORD

mObjectTimeStamp

ULONGLONG

3)VBLCANMessage

Parameter

Type

mHeader

VBLObjectHeader

mChannel

DWORD

mFlags

BYTE

mDLC

BYTE

mID

DWORD

mData[8]

BYTE

4.BLF解析

因BLF的保密性,无法直接读到值,需要使用Vector提供的binlog.dll,相关的例子可以参考《C:UsersPublicDocumentsVectorCANoe9.0 (x64)CANoe Sample ConfigurationsProgrammingBLF_Logging》。下面介绍《bl.c》的函数read_test。(回复“BLF例子”,可以获取ector例子)

/******************************************************************************

*                                                                             *

* read BL file                                                                *

*                                                                             *

******************************************************************************/

int read_test( LPCTSTR pFileName, LPDWORD pRead)

{

    HANDLE hFile;

    VBLObjectHeaderBase base;

    VBLCANMessage message;

    VBLEnvironmentVariable variable;

    VBLEthernetFrame ethframe;

    VBLAppText appText;

    VBLFileStatisticsEx statistics = { sizeof( statistics)};

    BOOL bSuccess;

 

    if ( NULL == pRead)

    {

        return -1;

    }

 

    *pRead = 0;

 

    /* open file */

    hFile = BLCreateFile( pFileName, GENERIC_READ);

 

    if ( INVALID_HANDLE_VALUE == hFile)

    {

        return -1;

    }

 

    BLGetFileStatisticsEx( hFile, &statistics);

 

    bSuccess = TRUE;

    

    /* read base object header from file */

    while ( bSuccess && BLPeekObject( hFile, &base))

    {

        switch ( base.mObjectType)

        {

        case BL_OBJ_TYPE_CAN_MESSAGE:

            /* read CAN message */

            message.mHeader.mBase = base;

            bSuccess = BLReadObjectSecure( hFile, &message.mHeader.mBase, sizeof(message));

            /* free memory for the CAN message */

            if( bSuccess) {

              BLFreeObject( hFile, &message.mHeader.mBase);

            }

            break;

        case BL_OBJ_TYPE_ENV_INTEGER:

        case BL_OBJ_TYPE_ENV_DOUBLE:

        case BL_OBJ_TYPE_ENV_STRING:

        case BL_OBJ_TYPE_ENV_DATA:

            /* read environment variable */

            variable.mHeader.mBase = base;

            bSuccess = BLReadObjectSecure( hFile, &variable.mHeader.mBase, sizeof(variable));

            /* free memory for the environment variable */

            if( bSuccess) {

              BLFreeObject( hFile, &variable.mHeader.mBase);

            }

            break;

        case BL_OBJ_TYPE_ETHERNET_FRAME:

            /* read ethernet frame */

            ethframe.mHeader.mBase = base;

            bSuccess = BLReadObjectSecure( hFile, &ethframe.mHeader.mBase, sizeof(ethframe));

            /* free memory for the frame */

            if( bSuccess) {

              BLFreeObject( hFile, &ethframe.mHeader.mBase);

            }

            break;

        case BL_OBJ_TYPE_APP_TEXT:

            /* read text */

            appText.mHeader.mBase = base;

            bSuccess = BLReadObjectSecure( hFile, &appText.mHeader.mBase, sizeof(appText));

            if ( NULL != appText.mText)

            {

                printf( "%s ", appText.mText);

            }

            /* free memory for the text */

            if( bSuccess) {

              BLFreeObject( hFile, &appText.mHeader.mBase);

            }

            break;

        default:

            /* skip all other objects */

            bSuccess = BLSkipObject( hFile, &base);

            break;

        }

 

        if ( bSuccess)

        {

          *pRead += 1;

        }

    }

 

    /* close file */

    if ( !BLCloseHandle( hFile))

    {

        return -1;

    }

 

    return bSuccess ? 0 : -1;

}

1)hFile = BLCreateFile( pFileName, GENERIC_READ);

以读取的方式,打开BLF文件

2)BLGetFileStatisticsEx( hFile, &statistics);

读取文件统计信息

3)while ( bSuccess && BLPeekObject( hFile, &base))

读取文件object

4)switch ( base.mObjectType)

5)bSuccess = BLReadObjectSecure( hFile, &message.mHeader.mBase, sizeof(message));

读取CAN message

6)bSuccess = BLSkipObject( hFile, &base);

跳过其他object

7) if ( !BLCloseHandle( hFile))

5.开发步骤

需要c/c++基础

1)新建vc++项目

2)引入头文件:binlog.h和binlog_objects.h

3)引入库文件:binlog.dll和binlog.lib

4)参考bl.c开发

免责声明:文章转载自《CAN数据格式-BLF》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇宝塔Python项目设置及启动文件编辑VMware克隆已安装的虚拟机下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

读《C陷阱与缺陷》

《C陷阱与缺陷》里面介绍了一些自己不知道和以前理解不深的东东,现总结如下: 1.词法分析的陷阱(本书第9页) y = x/*p; /* p指向除数 */ 上述语句的本意是:用x除以指针p所指向的值,然后把商赋给y;但是/*被编译器理解为一段注释的开始,编译器将不断地读入字符,直到*/出现为止。也就是说该语句实际的执行效果只是将x的值赋...

(转)C++类所占内存大小计算

C++类所占内存大小计算 转载时请注明出处和作者联系方式文章出处:http://blog.csdn.net/chenchong08作者联系方式:vision_chen@yeah.net 说明:笔者的操作系统是32位的。 class A {}; sizeof( A ) = ?sizeof( A ) = 1明明是空类,为什么编译器说它是1呢?空类同样可以实例化...

iOS开发之—— 加密使用(MD5,base64,DES,AES)

基本的单向加密算法: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法)SHA(Secure Hash Algorithm,安全散列算法)HMAC(Hash Message Authentication Code,散列消息鉴别码) MD5、SHA、HMAC这三种加密算法,可谓是非...

【CUDA并行编程之八】Cuda实现Kmeans算法

本文主要介绍如何使用CUDA并行计算框架编程实现机器学习中的Kmeans算法,Kmeans算法的详细介绍在这里,本文重点在并行实现的过程。 当然还是简单的回顾一下kmeans算法的串行过程: 伪代码: [cpp]view plaincopy 创建k个点作为起始质心(经常是随机选择) 当任意一个点的簇分配结果发生改变时 对数据集中的每个数据点 对每...

C/C++(基础编码-补码详解)

两个数的交换 1.引入第三者。 2.求和运算,求差。(这样会产生内存溢出) 3.异或运算 a = a^b; b = a^b; a = a^b; 8b(bit位) = 1B(Byte=字节)//最小单位是字节 32位机:2^32 = 4G寻址能力 (王爽--统一编址,汇编语言) char类型一个字节,8位。[-128,12...

如何判断SOCKET已经断开

http://biancheng.dnbcw.info/linux/366100.html     最近在做一个服务器端程序,C/S结构。功能方面比较简单就是client端与server端建立连接,然后发送消息给server。我在server端会使用专门的线程处理一条socket连接。这就涉及到一个问题,如果socket连接断开(异常,正常)后,我如何才能...