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

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

1.BLF定义

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

2.BLF查看

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

3.BLF组成

安装完Vector软件后,可以在Doc\LoggingFormat_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:\Users\Public\Documents\Vector\CANoe\9.0 (x64)\CANoe Sample Configurations\Programming\BLF_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\n", 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开发

最新文章

  1. Dynamics AX 2012 R2 在AIF服务契约中使用DateTime
  2. hdu 2059(dp)
  3. 浅谈break 、continue、return,goto四种语句的区别。
  4. hdu 4180
  5. drupal错误: Maximum execution time of 240 seconds exceeded
  6. 用c++写一个 “hello,world” 的 FastCGI程序
  7. Java中的枚举的治理
  8. 【Android Developers Training】 87. 序言:同步到云
  9. 盒子浮动float
  10. pthread_once()函数详解
  11. Windows安装activemq
  12. Sublime Text3使用Package Control 报错There Are No Packages Available For Installation
  13. mysql 约束和外键约束实例
  14. js运用4
  15. Oracle 监听器日志配置与管理
  16. [ZZ]Appium 文档翻译
  17. oracle表空间不足时如何处理
  18. 2460: [BeiJing2011]元素
  19. 批量修改Java类文件中引入的package包路径
  20. 使用dpkg命令卸载已经安装的软件包

热门文章

  1. python接口自动化测试 - requests库的post请求进行文件上传
  2. vue 生命钩子周期之理解
  3. 题解【洛谷P3385】【模板】负环
  4. radar图生成用户guideline
  5. 传奇版本中利用NPC迅速给人物加血脚本制作
  6. 前后端分离之 跨域和JWT
  7. 关于为什么使用React新特性Hook的一些实践与浅见
  8. Steam游戏《Nine Parchments(九张羊皮纸)》修改器制作-[先使用CE写,之后有时间的话改用C#](2020年寒假小目标02)
  9. Jmeter_请求原件之参数化CSV
  10. SpringCloud项目实战