当前位置: 首页 > news >正文

网站建设技术方面重庆有什么好玩的游乐场

网站建设技术方面,重庆有什么好玩的游乐场,PHP网站开发程序员招聘,wordpress 商城 插件案例背景(共15页精讲)#xff1a; 该篇博文将告诉您#xff0c;CAN DBC转换C语言代码Demo#xff0c;只需传递对应CAN信号关联参数#xff0c;无需每个信号左移和右移#xff0c;并举例介绍#xff1a;在CANoe/Canalyzer中CAPL中的应用#xff…案例背景(共15页精讲) 该篇博文将告诉您CAN DBC转换C语言代码Demo只需传递对应CAN信号关联参数无需每个信号左移和右移并举例介绍在CANoe/Canalyzer中CAPL中的应用对接收报文进行解包。其它场景的应用也可参考该篇。 目录 1 背景CAN信号在CAN 报文/Frame中位置的决定因素 2 讲解CAN DBC转换C语言代码Demo 2.1 定义一些宏定义 2.2 定义一些结构体 2.3 API接口函数原型 2.4 对CANFD DBC的支持 2.5 如何使用该API接口 3 举例在CANoe/Canalyzer中CAPL中的应用对接收报文进行解包 3.1 信号的字节顺序Byte Order: Intel小端模式 3.1.1 CAPL文件can的完整代码 3.1.2 系统变量定义 3.1.3 测试结果 3.2信号的字节顺序Byte Order: Motorola大端模式 3.2.1 CAPL文件can的完整代码 3.2.2 系统变量定义 3.2.3 测试结果 结尾 优质博文推荐阅读单击下方链接即可跳转 Vector工具链 CAN Matrix DBC CAN Matrix Arxml 1 背景CAN信号在CAN 报文/Frame中位置的决定因素 一个CAN信号在CAN 报文/Frame中的位置由3个条件决定见图1-1 信号的起始位Startbit默认为信号的Lsb信号的长度Length信号的字节顺序Byte Order: Intel小端模式和Motorola大端模式。 详见博文“【DBC专题】-4-DBC文件中的Signal信号字节顺序Motorola和Intel介绍https://blog.csdn.net/qfmzhu/article/details/111561710”这里不再重复讲解。 下面我们根据这个背景来设计一个通用算法封装成一个函数只需输入几个参数即可得到对应的信号值。 图1-1 2 讲解CAN DBC转换C语言代码Demo 2.1 定义一些宏定义 #define FRAME_TJW_ZERO_DLC 0 // unit:Byte #define FRAME_TJW_MAX_DLC 8 // unit:Byte #define SIGNAL_TJW_ZERO_LENGTH 0 // unit:Bit #define SIGNAL_TJW_MAX_LENGTH 64 // unit:Bit #define SIGNAL_TJW_INIT_VALUE 0 #define SIGNAL_TJW_INIT_MASK 0#define SIGNAL_TJW_BYTE_ORDER_INTEL 0 #define SIGNAL_TJW_BYTE_ORDER_MOTOROLA 1#define CAN_SIGNAL_TJW_NORMAL 0 #define CAN_SIGNAL_TJW_NO_VALUE 1 #define CAN_FRAME_TJW_DLC_OUT_OF_RANGE 2 #define INVALID_INPUT_PARAMETERS_TJW 3/** 使用该Demo需注明出处以表对作者的尊重 **/ /** 版权归CSDN博客“汽车电子助手”所有https://blog.csdn.net/qfmzhu **/ 2.2 定义一些结构体 typedef struct {uint8 Signal_State; // Describes the state of a signaluint64 Signal_Value; // Describes the value of a signal } Unpack_CAN_Signal; /** 使用该Demo需注明出处以表对作者的尊重 **/ /** 版权归CSDN博客“汽车电子助手”所有https://blog.csdn.net/qfmzhu **/ 2.3 API接口函数原型 /** 使用该Demo需注明出处以表对作者的尊重 **/ /** 版权归CSDN博客“汽车电子助手”所有https://blog.csdn.net/qfmzhu **/Unpack_CAN_Signal Rx_CAN_Frame_Data_Buff_to_CAN_Signal_Hex_Fun( uint8* data_buff, /**Byte array of CAN data field**/ uint8 signal_start_bit, /**Rang:0~(FRAME_TJW_MAX_DLC * 8 - 1)**/ uint8 signal_length, /**Rang:1~SIGNAL_TJW_MAX_LENGTH**/ boolean signal_byte_order, /**0:Intel;1:Motorola**/ uint8 frame_length) /**Rang:1~FRAME_TJW_MAX_DLC**/ {Unpack_CAN_Signal can_signal;uint8 i 0;uint8 byte_num 0;uint8 low_data_byte 0;uint8 high_data_byte 0;uint8 low_data_byte_position 0;uint8 high_data_byte_position 0;uint8 remaining_bit_number 0;uint8 remaining_byte_number 0; uint64 can_signal_mask SIGNAL_TJW_INIT_MASK;can_signal.Signal_State CAN_SIGNAL_TJW_NORMAL;can_signal.Signal_Value SIGNAL_TJW_INIT_VALUE;if(frame_length FRAME_TJW_ZERO_DLC) /**DLC of CAN frame is 0**/{can_signal.Signal_State CAN_SIGNAL_TJW_NO_VALUE;}else if(frame_length FRAME_TJW_MAX_DLC) /**DLC of CAN frame is out of range**/{can_signal.Signal_State CAN_FRAME_TJW_DLC_OUT_OF_RANGE;}else if((signal_length (frame_length * 8)) /**Invalid signal_length: The length of the signal is not in the range of DLC**/|| (signal_length SIGNAL_TJW_MAX_LENGTH) /**Invalid signal_length: The length of the signal exceeds the maximum Unsigned of C language**/|| (signal_length SIGNAL_TJW_ZERO_LENGTH) /**Invalid signal_length: The length of the signal is not equal to 0**/ ){can_signal.Signal_State INVALID_INPUT_PARAMETERS_TJW;}else{ /**Byte Order: Intel**/if(signal_byte_order SIGNAL_TJW_BYTE_ORDER_INTEL) {/**Bytes used by CAN signal,Byte[0] is low byte,Byte[frame_length] is high byte**/low_data_byte signal_start_bit / 8;high_data_byte (signal_start_bit signal_length - 1) / 8; // 2 6 - 1 /8 0; 2 7 - 1 /8 1 ; 2 14 - 1 /8 1 ; 2 15 - 1 /8 2if((high_data_byte 1) frame_length) /** CAN signal is not in the range of DLC**/{can_signal.Signal_State CAN_FRAME_TJW_DLC_OUT_OF_RANGE;}else{for(i 0;i signal_length;i) /**Generate signal mask according to signal length**/{can_signal_mask | 0x0000000000000001 i;}low_data_byte_position signal_start_bit % 8; /**Distance from the lowest bit of each byte**//**CAN Signal is in a bytes**/if(low_data_byte high_data_byte) { can_signal.Signal_Value (((uint64)data_buff[low_data_byte]) low_data_byte_position) can_signal_mask; }/**CAN Signal in multiple bytes**/else{ for(byte_num low_data_byte;byte_num high_data_byte;byte_num){if(byte_num low_data_byte){can_signal.Signal_Value | ((uint64)data_buff[low_data_byte]) low_data_byte_position;}else{can_signal.Signal_Value | ((uint64)data_buff[byte_num]) ((byte_num - low_data_byte - 1) * 8 (8 - low_data_byte_position));} }can_signal.Signal_Value can_signal.Signal_Value can_signal_mask; } }}/**Byte Order: Motorola**/else /**signal_byte_order SIGNAL_TJW_BYTE_ORDER_MOTOROLA**/{/**Bytes used by CAN signal,Byte[0] is low byte,Byte[frame_length] is high byte**/high_data_byte signal_start_bit / 8; if((high_data_byte 1) frame_length) /** CAN signal is not in the range of DLC**/{can_signal.Signal_State CAN_FRAME_TJW_DLC_OUT_OF_RANGE;}else{for(i 0;i signal_length;i) /**Generate signal mask according to signal length**/{can_signal_mask | 0x0000000000000001 i;}high_data_byte_position signal_start_bit % 8; /**Distance from the lowest bit of each byte**//**CAN Signal is in a bytes**/if(signal_length (8 - high_data_byte_position)){ can_signal.Signal_Value (((uint64)data_buff[high_data_byte]) high_data_byte_position) can_signal_mask; }/**CAN Signal in multiple bytes**/else{ remaining_bit_number signal_length - (8 - high_data_byte_position); // 剩余bit 12 - (8 - 2) 6if((remaining_bit_number % 8) ! 0) {remaining_byte_number remaining_bit_number / 8 1; // remaining_byte_number 1}else{remaining_byte_number remaining_bit_number / 8;}for(byte_num high_data_byte;byte_num (high_data_byte - remaining_byte_number);byte_num--) // high_data_byte 2 remaining_byte_number 1{ if(byte_num high_data_byte){can_signal.Signal_Value | ((uint64)data_buff[high_data_byte]) high_data_byte_position;}else{can_signal.Signal_Value | ((uint64)data_buff[byte_num]) ((high_data_byte - byte_num - 1) * 8 (8 - high_data_byte_position));} if(byte_num 0) {break;} }can_signal.Signal_Value can_signal.Signal_Value can_signal_mask; } } }}return can_signal; } /** 使用该Demo需注明出处以表对作者的尊重 **/ /** 版权归CSDN博客“汽车电子助手”所有https://blog.csdn.net/qfmzhu **/ 2.4 对CANFD DBC的支持 只需将宏定义FRAME_TJW_MAX_DLC的值由8调整为64即可适配CANFD DBC。 2.5 如何使用该API接口 1、提供的demo使用了uint8uint64boolean类型在将该代码集成至开发环境中需要注意这些类型的替换 typedef unsigned char               uint8typedef unsigned long long           uint64 2、调用函数Rx_CAN_Frame_Data_Buff_to_CAN_Signal_Hex_Fun时需要确认传参data_buffsignal_start_bitsignal_lengthsignal_byte_orderframe_length的准确性需与DBC保持一致这样您可以得到对应信号的状态与值 3 举例在CANoe/Canalyzer中CAPL中的应用对接收报文进行解包 CAPL语法和C语言有一些差异我们将第2.3章节中的demo稍作修改以满足测需要。其它场景的应用与其类似。 3.1 信号的字节顺序Byte Order: Intel小端模式 3.1.1 CAPL文件can的完整代码 /** 使用该Demo需注明出处以表对作者的尊重 **/ /** 版权归CSDN博客“汽车电子助手”所有https://blog.csdn.net/qfmzhu **/ /*!Encoding:936*/ includes {}variables {byte CAN_Data_Byte[8];byte Signal_State;word Signal_Value; }on message 0x100 {CAN_Data_Byte[0] this.byte(0);CAN_Data_Byte[1] this.byte(1);CAN_Data_Byte[2] this.byte(2);CAN_Data_Byte[3] this.byte(3);CAN_Data_Byte[4] this.byte(4); CAN_Data_Byte[5] this.byte(5); CAN_Data_Byte[6] this.byte(6);CAN_Data_Byte[7] this.byte(7);sysvar::CAN_Frame::sysvar_Test_Signal_1 Rx_CAN_Frame_Data_Buff_to_CAN_Signal_Hex(0,2,8);sysvar::CAN_Frame::sysvar_Test_Signal_2 Rx_CAN_Frame_Data_Buff_to_CAN_Signal_Hex(50,12,8);sysvar::CAN_Frame::sysvar_Test_Signal_3 Rx_CAN_Frame_Data_Buff_to_CAN_Signal_Hex(62,2,8); }word Rx_CAN_Frame_Data_Buff_to_CAN_Signal_Hex( byte signal_start_bit, /**Rang:0~(8 * 8 - 1)**/ byte signal_length, /**Rang:1~64**/ byte frame_length) /**Rang:1~8**/ {byte i 0;byte byte_num 0;byte low_data_byte 0;byte high_data_byte 0;byte low_data_byte_position 0;byte high_data_byte_position 0;byte remaining_bit_number 0;byte remaining_byte_number 0; word can_signal_mask 0;Signal_State 0;Signal_Value 0;if(frame_length 0) /**DLC of CAN frame is 0**/{Signal_State 1;}else if(frame_length 8) /**DLC of CAN frame is out of range**/{Signal_State 2;}else if((signal_length (frame_length * 8)) /**Invalid signal_length: The length of the signal is not in the range of DLC**/|| (signal_length 16) /**Invalid signal_length: The length of the signal exceeds the maximum Unsigned of C language**/|| (signal_length 0) /**Invalid signal_length: The length of the signal is not equal to 0**/ ){Signal_State 3;}else{/**Byte Order: Intel**/{/**Bytes used by CAN signal,Byte[0] is low byte,Byte[frame_length] is high byte**/low_data_byte signal_start_bit / 8;high_data_byte (signal_start_bit signal_length - 1) / 8; // 2 6 - 1 /8 0; 2 7 - 1 /8 1 ; 2 14 - 1 /8 1 ; 2 15 - 1 /8 2if((high_data_byte 1) frame_length) /** CAN signal is not in the range of DLC**/{Signal_State 2;}else{ for(i 0;i signal_length;i) /**Generate signal mask according to signal length**/{can_signal_mask | 0x0000000000000001 i;}low_data_byte_position signal_start_bit % 8; /**Distance from the lowest bit of each byte**//**CAN Signal is in a bytes**/if(low_data_byte high_data_byte) { Signal_Value (((word)CAN_Data_Byte[low_data_byte]) low_data_byte_position) can_signal_mask; }/**CAN Signal in multiple bytes**/else{ for(byte_num low_data_byte;byte_num high_data_byte;byte_num){ if(byte_num low_data_byte){ Signal_Value | ((word)CAN_Data_Byte[low_data_byte]) low_data_byte_position;}else{ Signal_Value | ((word)CAN_Data_Byte[byte_num]) ((byte_num - low_data_byte - 1) * 8 (8 - low_data_byte_position));} }Signal_Value Signal_Value can_signal_mask; } }}}return Signal_Value; } /** 使用该Demo需注明出处以表对作者的尊重 **/ /** 版权归CSDN博客“汽车电子助手”所有https://blog.csdn.net/qfmzhu **/ 3.1.2 系统变量定义 3.1.3 测试结果 使用的DBC CAN DBC中信号与系统变量的解析结果一致 3.2信号的字节顺序Byte Order: Motorola大端模式 3.2.1 CAPL文件can的完整代码 /** 使用该Demo需注明出处以表对作者的尊重 **/ /** 版权归CSDN博客“汽车电子助手”所有https://blog.csdn.net/qfmzhu **/ /*!Encoding:936*/ includes {}variables {byte CAN_Data_Byte[8];byte Signal_State;word Signal_Value; }on message 0x100 {CAN_Data_Byte[0] this.byte(0);CAN_Data_Byte[1] this.byte(1);CAN_Data_Byte[2] this.byte(2);CAN_Data_Byte[3] this.byte(3);CAN_Data_Byte[4] this.byte(4); CAN_Data_Byte[5] this.byte(5); CAN_Data_Byte[6] this.byte(6);CAN_Data_Byte[7] this.byte(7); sysvar::CAN_Frame::sysvar_Test_Signal_4 Rx_CAN_Frame_Data_Buff_to_CAN_Signal_Hex(6,2,8);sysvar::CAN_Frame::sysvar_Test_Signal_5 Rx_CAN_Frame_Data_Buff_to_CAN_Signal_Hex(10,12,8);sysvar::CAN_Frame::sysvar_Test_Signal_6 Rx_CAN_Frame_Data_Buff_to_CAN_Signal_Hex(56,2,8); }word Rx_CAN_Frame_Data_Buff_to_CAN_Signal_Hex( byte signal_start_bit, /**Rang:0~(8 * 8 - 1)**/ byte signal_length, /**Rang:1~64**/ byte frame_length) /**Rang:1~8**/ {byte i 0;byte byte_num 0;byte low_data_byte 0;byte high_data_byte 0;byte low_data_byte_position 0;byte high_data_byte_position 0;byte remaining_bit_number 0;byte remaining_byte_number 0; word can_signal_mask 0;Signal_State 0;Signal_Value 0;if(frame_length 0) /**DLC of CAN frame is 0**/{Signal_State 1;}else if(frame_length 8) /**DLC of CAN frame is out of range**/{Signal_State 2;}else if((signal_length (frame_length * 8)) /**Invalid signal_length: The length of the signal is not in the range of DLC**/|| (signal_length 16) /**Invalid signal_length: The length of the signal exceeds the maximum Unsigned of C language**/|| (signal_length 0) /**Invalid signal_length: The length of the signal is not equal to 0**/ ){Signal_State 3;}else{/**Byte Order: Motorola**/{/**Bytes used by CAN signal,Byte[0] is low byte,Byte[frame_length] is high byte**/high_data_byte signal_start_bit / 8; if((high_data_byte 1) frame_length) /** CAN signal is not in the range of DLC**/{Signal_State 2;}else{for(i 0;i signal_length;i) /**Generate signal mask according to signal length**/{can_signal_mask | 0x0000000000000001 i;}high_data_byte_position signal_start_bit % 8; /**Distance from the lowest bit of each byte**//**CAN Signal is in a bytes**/if(signal_length (8 - high_data_byte_position)){ Signal_Value (((word)CAN_Data_Byte[high_data_byte]) high_data_byte_position) can_signal_mask; }/**CAN Signal in multiple bytes**/else{ remaining_bit_number signal_length - (8 - high_data_byte_position); // 剩余bit 12 - (8 - 2) 6if((remaining_bit_number % 8) ! 0) {remaining_byte_number remaining_bit_number / 8 1; // remaining_byte_number 1}else{remaining_byte_number remaining_bit_number / 8;}for(byte_num high_data_byte;byte_num (high_data_byte - remaining_byte_number);byte_num--) // high_data_byte 2 remaining_byte_number 1{ if(byte_num high_data_byte){Signal_Value | ((word)CAN_Data_Byte[high_data_byte]) high_data_byte_position;}else{Signal_Value | ((word)CAN_Data_Byte[byte_num]) ((high_data_byte - byte_num - 1) * 8 (8 - high_data_byte_position));} if(byte_num 0) {break;} }Signal_Value Signal_Value can_signal_mask; } } }}return Signal_Value; } /** 使用该Demo需注明出处以表对作者的尊重 **/ /** 版权归CSDN博客“汽车电子助手”所有https://blog.csdn.net/qfmzhu **/3.2.2 系统变量定义 3.2.3 测试结果 使用的DBC CAN DBC中信号与系统变量的解析结果一致 结尾 获取更多“汽车电子资讯”和“工具链使用” 请关注CSDN博客“汽车电子助手”做您的好助手。
http://www.sczhlp.com/news/167347/

相关文章:

  • 中建海峡建设发展有限公司网站建设一个公司官网多少钱
  • 做网站一定要有营业执照吗qq手机版
  • 网站做的好的公司wordpress主题模块添加图片
  • 陕西中洋建设有限公司网站上海传媒公司有哪些
  • opencart做网站视频跨境电商网站设计
  • 广汉做网站租车网站建设系统的设计
  • 如何推广网站话术专业网站推广公司
  • 网站 外包方案建设网站都要学些什么手续
  • 题解:AT_arc181_e [ARC181E] Min and Max at the edge
  • 酵母单杂交实验:解密 “转录因子 - DNA 互作” 的核心工具
  • api调用钉钉群机器人发信息 - 规格严格
  • 2025 年氢氧化铝生产厂家 TOP 品牌榜单来袭,阻燃,高白,酸融,导热,超细,微粉级,低粘度,灌封胶用,覆铜板用氢氧化铝公司推荐!
  • 飞算 JavaAI 赋能老工程重构:破旧立新的高效利器
  • dw网站结构图怎么做广州地区网站建设
  • 不用cms怎么做网站唐山网站定制
  • 网站建设服务市场细分计算机应用技术网站开发方向
  • 广东同江医院网站建设小程序互动投票
  • 做个简单网站大概多少钱wordpress 大型网站吗
  • 网站开发一般过程网站建设包含哪些方面
  • 河南网站顾问网络运维工程师教程
  • 菜谱网站手机源码火车头采集直接发布到wordpress
  • wordpress分类打不开南阳seo网站建设费用
  • 通州做网站公司普陀建设网站
  • 微信网站开发js框架成都网站开发的公司
  • 西安个人做企业网站建立网站需要多少钱?
  • 济南做网站多钱芜湖有哪些知名企业
  • 网站服务器做缓存手机壳在线设计网站
  • 黄酒的电商网页设计网站驰业网站建设
  • 网站推广是做什么的wordpress有那些插件
  • 西安那些做网站的公司最近国内重大新闻事件