道路运输车辆卫星定位系统终端通讯协议

需积分: 46 48 下载量 177 浏览量 更新于2024-08-10 收藏 313KB PDF 举报
"该文档是关于道路运输车辆卫星定位系统终端通讯协议的详细说明,主要涉及帧格式定义,包括标识位、校验码、版本号、厂商编号、外设类型编号、命令类型以及用户数据等关键元素。此协议参照国标,用于规范车载终端与外接设备或平台之间的信息交换。" 在《帧格式定义-uvm_class_reference_manual_1.2》中,通讯帧的结构被详细阐述,这对于确保不同设备间准确无误地传输数据至关重要。帧格式由多个组成部分构成: 1. **标识位**:每个帧以0x7e作为起始标识,如果在数据中遇到0x7e,需要进行转义处理。转义规则是0x7e转换为0x7d后跟0x02,而0x7d转换为0x7d后跟0x01。在发送数据时,需要先封装、计算校验码,然后对数据进行转义;接收时则需进行转义还原,再验证校验码。 2. **校验码**:从厂商编号到用户数据,所有字节相加取低8位作为校验码。例如,如果累加和为0x1388,则校验码为0x88。 3. **版本号**:用于标识通讯协议的版本,确保不同版本的设备能正确理解对方的数据。 4. **厂商编号**:识别设备制造商的代码,确保来自不同厂商的设备可以区分。 5. **外设类型编号**:每个设备类型都有一个唯一的编号,帮助主机的驱动程序识别数据来源。具体的外设类型编号可能在表A.2中列出。 6. **命令类型**:定义了不同类型的交互信息,分为通用协议和专有协议。通用协议处理基本的共享信息,而专有协议则针对特定设备的交互。这些命令类型的详细列表可能在表A.3中给出。 7. **用户数据**:这部分包含与具体业务功能相关的定制数据,是设备与主机间交互的核心内容。 此文档的上下文还提到了JT/T808—2011标准,这是中国交通运输行业的国标,详细规定了道路运输车辆卫星定位系统车载终端与监管/监控平台间的通讯协议和数据格式。这个标准涵盖协议基础、通信连接、消息处理、协议分类与说明以及数据格式,适用于所有道路运输车辆卫星定位系统的终端和平台。 这些定义和协议确保了车辆卫星定位系统能够高效、安全地收集和传输数据,从而实现有效的监控和管理。

请逐行注释下面的代码:class riscv_instr_base_test extends uvm_test; riscv_instr_gen_config cfg; string test_opts; string asm_file_name = "riscv_asm_test"; riscv_asm_program_gen asm_gen; string instr_seq; int start_idx; uvm_coreservice_t coreservice; uvm_factory factory; uvm_component_utils(riscv_instr_base_test) function new(string name="", uvm_component parent=null); super.new(name, parent); void'($value$plusargs("asm_file_name=%0s", asm_file_name)); void'($value$plusargs("start_idx=%0d", start_idx)); endfunction virtual function void build_phase(uvm_phase phase); super.build_phase(phase); coreservice = uvm_coreservice_t::get(); factory = coreservice.get_factory(); uvm_info(gfn, "Create configuration instance", UVM_LOW) cfg = riscv_instr_gen_config::type_id::create("cfg"); uvm_info(gfn, "Create configuration instance...done", UVM_LOW) uvm_config_db#(riscv_instr_gen_config)::set(null, "*", "instr_cfg", cfg); if(cfg.asm_test_suffix != "") asm_file_name = {asm_file_name, ".", cfg.asm_test_suffix}; // Override the default riscv instruction sequence if($value$plusargs("instr_seq=%0s", instr_seq)) begin factory.set_type_override_by_name("riscv_instr_sequence", instr_seq); end if (riscv_instr_pkg::support_debug_mode) begin factory.set_inst_override_by_name("riscv_asm_program_gen", "riscv_debug_rom_gen", {gfn, ".asm_gen.debug_rom"}); end endfunction function void report_phase(uvm_phase phase); uvm_report_server rs; int error_count; rs = uvm_report_server::get_server(); error_count = rs.get_severity_count(UVM_WARNING) + rs.get_severity_count(UVM_ERROR) + rs.get_severity_count(UVM_FATAL); if (error_count == 0) begin uvm_info("", "TEST PASSED", UVM_NONE); end else begin uvm_info("", "TEST FAILED", UVM_NONE); end uvm_info("", "TEST GENERATION DONE", UVM_NONE); super.report_phase(phase); endfunction virtual function void apply_directed_instr(); endfunction task run_phase(uvm_phase phase); int fd; for(int i = 0; i < cfg.num_of_tests; i++) begin string test_name; randomize_cfg(); riscv_instr::create_instr_list(cfg); riscv_csr_instr::create_csr_filter(cfg); asm_gen = riscv_asm_program_gen::type_id::create("asm_gen", , gfn); asm_gen.cfg = cfg; asm_gen.get_directed_instr_stream(); test_name = $sformatf("%0s_%0d.S", asm_file_name, i+start_idx); apply_directed_instr(); uvm_info(gfn, "All directed instruction is applied", UVM_LOW) asm_gen.gen_program(); asm_gen.gen_test_file(test_name); end endtask virtual function void randomize_cfg(); DV_CHECK_RANDOMIZE_FATAL(cfg); uvm_info(`gfn, $sformatf("riscv_instr_gen_config is randomized:\n%0s", cfg.sprint()), UVM_LOW) endfunction endclass

2023-05-24 上传