维克多DBC文件结构

通过DBC文件的解析可以得到CAN数据库的结构,多个DBC文件组合可以得到整车网络拓扑。
因此DBC文件对于一辆车来说至关重要。
DBC文件是一个文本文件,其格式如下:

/******************************************************************************
        DBC_File(network)=
          version                           // VERSION
          new_symbols                       // NS_(DESC_)
          bit_timing                        // BS_   (*obsolete but required*)
          nodes                             // BU_
          value_tables                      // VAL_TABLE_
          messages                          // BO_ / SG_
          message_transmitters              // BO_TX_BU_
          environment_variables             // EV_
          environment_variables_data        // ENVVAR_DATA_
          signal_types                      // (*not used in normal DBC files*)
                                            // SGTYPE_
                                            // SGTYPE_VAL_
                                            // BA_DEF_SGTYPE_
                                            // BA_SGTYPE_
          comments                          // CM_ ...
          attribute_definitions             // BA_DEF_(REL_)
          sigtype_attr_list                 // (*not used in normal DBC files*)
          attribute_defaults                // BA_DEF_DEF_(REL_)
          attribute_values                  // BA_(REL_)
          value_descriptions                // VAL_
          category_definitions              // CAT_DEF_     (*obsolete*)
          categories                        // CAT_         (*obsolete*)
          filter                            // FILTER_      (*obsolete*)
          signal_type_refs                  // (*not used in normal DBC files*)
                                            // SIG_TYPE_REF_
          signal_groups                     // SIG_GROUP_
          signal_extended_value_types       // (*not used in normal DBC files*)
                                            // SIG_VALTYPE_
                                            // SIGTYPE_VALTYPE_
          extended_multiplexing             // SG_MUL_VAL_
        ;
******************************************************************************/

使用巴科斯-诺尔范式定义后,各字段的展开如下:

/******************************************************************************
    version = ['VERSION' '"' 'CANdb_version_string {}' "'];
    new_symbols = ['NS_' ':' ['CM_'] ['BA_DEF_'] ['BA_'] ['VAL_'] ['CAT_DEF_']
              ['CAT_'] ['FILTER'] ['BA_DEF_DEF_'] ['EV_DATA_'] ['ENVVAR_DATA_']
              ['SGTYPE_'] ['SGTYPE_VAL_'] ['BA_DEF_SGTYPE_'] ['BA_SGTYPE_']
              ['SIG_TYPE_REF_'] ['VAL_TABLE_'] ['SIG_GROUP_'] ['SIG_VALTYPE_']
              ['SIGTYPE_VALTYPE_'] ['BO_TX_BU_'] ['BA_DEF_REL_'] ['BA_REL_']
              ['BA_DEF_DEF_REL_'] ['BU_SG_REL_'] ['BU_EV_REL_'] ['BU_BO_REL_']
            ];
    bit_timing = 'BS_:' [baudrate ':' BTR1 ',' BTR2 ]
        baud rate = unsigned_integer
        BTR1 = unsigned_integer
        BTR2 = unsigned_integer
    nodes = 'BU_:' {node_name}
        node_name = C_identifier
    value_tables = {value_table}
        value_table = 'VAL_TABLE_' value_table_name {value_description } ';'
        value_table_name = C_identifier
    value_description = double char_string
    messages = {message}
        message = BO_ message_id message_name ':' message_size transmitter {signal}
        message_id = unsigned_integer
        message_name = C_identifier
        message_size = unsigned_integer
        transmitter = node_name | 'Vector__XXX'
    signal = 'SG_' signal_name multiplexer_indicator ':' start_bit '|' signal_size '@' byte_order value_type '(' factor ',' offset ')' '[' minimum '|' maximum ']' unit receiver {',' receiver}
        signal_name = C_identifier
        multiplexer_indicator = ' ' | 'M' | 'm' multiplexer_switch_value
        start_bit = unsigned_integer
        signal_size = unsigned_integer
        byte_order = '0' | '1' (* 0=little endian, 1=big endian *)
        value_type = '+' | '­-' (* +=unsigned, -­=signed *)
        factor = double
        offset = double
        physical_value = raw_value * factor + offset
        raw_value = (physical_value – offset) / factor
        minimum = double
        maximum = double
        unit = char_string
        receiver = node_name | 'Vector__XXX'
    signal_extended_value_type_list = 'SIG_VALTYPE_' message_id signal_name signal_extended_value_type ';'
        signal_extended_value_type = '0' | '1' | '2' | '3' (*0=signed or unsigned integer, 1=32­bit IEEE­float, 2=64­bit IEEE­double *)
    message_transmitters = {message_transmitter}
        message_transmitter = 'BO_TX_BU_' message_id ':' {} transmitter ';'
    value_descriptions = { value_descriptions_for_signal | value_descriptions_for_env_var }
        value_descriptions_for_signal = 'VAL_' message_id signal_name { value_description } ';'
    environment_variables = {environment_variable}
        environment_variable = 'EV_' env_var_name '' env_var_type '[' minimum '|' maximum ']' unit initial_value ev_id access_type access_node {',' access_node } ';'
        env_var_name = C_identifier
        env_var_type = '0' | '1' | '2' (* 0=integer, 1=float, 2=string *)
        minimum = double
        maximum = double
        initial_value = double
        ev_id = unsigned_integer (* obsolete *)
        access_type = 'DUMMY_NODE_VECTOR0' | 'DUMMY_NODE_VECTOR1' | 'DUMMY_NODE_VECTOR2' | 'DUMMY_NODE_VECTOR3' (* 0=unrestricted, 1=read, 2=write, 3=readWrite *)
        access_node = node_name | 'VECTOR_XXX'
    environment_variables_data = environment_variable_data
        environment_variable_data = 'ENVVAR_DATA_' env_var_name: ' data_size ';'
        data_size = unsigned_integer
    value_descriptions_for_env_var = 'VAL_' env_var_aname { value_description } ';'
    signal_types = {signal_type}
        signal_type = 'SGTYPE_' signal_type_name ':' signal_size '@' byte_order value_type '(' factor ',' offset ')' '[' minimum '|' maximum ']' unit default_value ',' value_table ';'
        signal_type_name = C_identifier
        default_value = double
        value_table = value_table_name
        signal_type_refs = {signal_type_ref}
        signal_type_ref = 'SGTYPE_' message_id signal_name ':' signal_type_name ';'
    signal_groups = 'SIG_GROUP_' message_id signal_group_name repetitions ':' { signal_name } ';'
        signal_group_name = C_identifier
        repetitions = unsigned_integer
    comments = {comment}
        comment = 'CM_' (char_string
                | 'BU_' node_name char_string
                | 'BO_' message_id char_string
                | 'SG_' message_id signal_name char_string
                | 'EV_' env_var_name char_string)';'
    attribute_definitions = { attribute_definition | attribute_definition_relation}
        attribute_definition = 'BA_DEF_' object_type attribute_name attribute_value_type ';'
        object_type = '' | 'BU_' | 'BO_' | 'SG_' | 'EV_'
        attribute_name = '"' C_identifier '"'
        attribute_value_type = 'INT' signed_integer signed_integer
                            | 'HEX' signed_integer signed_integer
                            | 'FLOAT' double double
                            | 'STRING'
                            | 'ENUM' [char_string {',' char_string}]
        attribute_definition_relation = 'BA_DEF_REL_' 'BU_SG_REL_' attribute_name attribute_value_type ';'
    attribute_defaults = { attribute_default }
        attribute_default = 'BA_DEF_DEF_' attribute_name attribute_value ';'
        attribute_value = unsigned_integer
                        | signed_integer
                        | double
                        | char_string
    attribute_values = { attribute_value_for_object }
        attribute_value_for_object = ('BA_' attribute_name (attribute_value
                                    | 'BU_' node_name attribute_value
                                    | 'BO_' message_id attribute_value
                                    | 'SG_' message_id signal_name attribute_value
                                    | 'EV_' env_var_name attribute_value)';'
                            | 'BA_REL_' attribute_name ( 'BU_SG_REL_' node_name 'SG_' message_id signal_name attribute_value
                                    | 'BU_BO_REL_' node_name message_id attribute_value) ';')

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

使用上面的格式定义,可以比较容易的通过代码,实现自己的文件解析器。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java DBC文件解析是指使用Java编程语言DBC文件进行解析和处理的过程。DBC文件是CAN网络通信协议的描述文件,它定义了CAN协议的消息,信号,节点等信息。 在Java中解析DBC文件涉及到以下几个步骤: 1. 导入相关的Java库:首先需要导入相关的Java库来处理和解析DBC文件。比如,可以使用Apache POI库来读取和解析Excel格式的DBC文件,或者使用自定义的DBC解析库。 2. 读取DBC文件:使用Java代码读取和加载DBC文件,可以将DBC文件读取到内存中,以便后续的解析和处理。 3. 解析DBC文件:解析DBC文件的过程包括解析消息、信号、节点等信息。根据DBC文件的格式和结构,可以使用Java代码逐行解析DBC文件,并将解析的结果存储到相应的数据结构中,比如使用Java的类和对象来表示消息、信号和节点等。 4. 处理和利用解析结果:解析完DBC文件后,可以根据解析结果进行各种操作和处理。例如,可以根据解析的节点信息,生成相应的代码来实现CAN节点的功能;或者根据解析的消息和信号信息,构建CAN消息的发送和接收逻辑。 5. 错误处理和异常处理:在解析DBC文件的过程中,可能会遇到各种错误和异常情况,比如文件路径错误、文件格式错误等。在Java代码中需要适当处理这些错误和异常情况,以保证程序的稳定性和可靠性。 总之,Java DBC文件解析是一项比较复杂的任务,需要熟悉DBC文件的格式和结构,以及相关的Java编程知识和技巧。通过解析和处理DBC文件,可以方便地获取和利用CAN协议的消息和信号等信息,从而实现相应的功能和应用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值