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

【DBC专题】-10-CAN DBC转换C语言代码Demo_接收Rx报文篇

案例背景(共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介绍icon-default.png?t=N176https://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,使用了uint8,uint64,boolean类型,在将该代码集成至开发环境中,需要注意这些类型的替换:

  • typedef unsigned char               uint8
  • typedef unsigned long long           uint64

2、调用函数Rx_CAN_Frame_Data_Buff_to_CAN_Signal_Hex_Fun时,需要确认传参data_buff,signal_start_bit,signal_length,signal_byte_order,frame_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博客“汽车电子助手”,做您的好助手。

相关文章:

【DBC专题】-10-CAN DBC转换C语言代码Demo_接收Rx报文篇

案例背景(共15页精讲)&#xff1a; 该篇博文将告诉您&#xff0c;CAN DBC转换C语言代码Demo&#xff0c;只需传递对应CAN信号关联参数&#xff0c;无需每个信号"左移"和"右移"&#xff0c;并举例介绍&#xff1a;在CANoe/Canalyzer中CAPL中的应用&#xff…...

AtCoder292 E 思维

题意&#xff1a; 给定一副n(n≤3000)n(n\leq 3000)n(n≤3000)个顶点&#xff0c;mmm条有向边的图&#xff0c;可以在图中添加有向边&#xff0c;求添加的最少边数&#xff0c;使得这副图满足&#xff1a;如果顶点aaa到顶点bbb有边&#xff0c;顶点bbb到ccc右有边&#xff0c;…...

20230309英语学习

What Is Sleep Talking? We Look at the Science 为什么人睡觉会说梦话&#xff1f;来看看科学咋说 Nearly everyone has a story about people talking in their sleep.Though it tends to be more common in children, it can happen at any age:A 2010 study in the jour…...

CAD转换PDF格式怎么弄?教你几种方法轻松搞定!

CAD是从事与艺术创作相关等行业的打工人们必需的工作软件&#xff0c;可以用来完成建筑设计图、设计图纸等。在日常的工作中&#xff0c;一些伙伴经常需要传输图纸给合作方来完成探讨。但是CAD图纸需要使用专业软件才能打开&#xff0c;这就给文件传送带来了一定的困难。而且传…...

AtCoder 259E LCM

题意&#xff1a; 以唯一分解形式给出nnn个数&#xff1a; aipi,1ei,1pi,2ei,2...pi,tei,ta_{i}p_{i,1}^{e_{i,1}}p_{i,2}^{e_{i,2}}...p_{i,t}^{e_{i,t}} ai​pi,1ei,1​​pi,2ei,2​​...pi,tei,t​​ 现在可以将某个数改为111&#xff0c;求所有改法中&#xff0c;有多少个…...

MQTT协议-取消订阅和取消订阅确认

MQTT协议-取消订阅和取消订阅确认 客户端向服务器取消订阅 取消订阅的前提是客户端已经通过CONNECT报文连接上服务器&#xff0c;并且订阅了一个主题 UNSUBSCRIBE—取消订阅 取消订阅的报文同样是由固定报头可变报头有效载荷组成 固定报头由两个字节组成&#xff0c;第一个…...

90后小伙,用低代码“整顿”旅游业,年入2000万,他是怎么做到的?

热爱旅游的92年成都小伙猴哥&#xff0c;大学毕业后开了一家旅行社&#xff0c;主要从事川藏、云南定制游服务。 从今年春节开始&#xff0c;国内各地旅游业开始复苏&#xff0c;向旅行社打电话咨询的人越来越多。 旅游的人多是好事&#xff0c;也是一种烦恼&#xff0c;因为…...

C51---PWM 脉冲宽度调制

1.PWM:脉冲宽度调制,它是通过一系列脉冲宽度进行调制&#xff0c;等效出所需要的波形&#xff08;包含形状以及幅值&#xff09;。对模拟信号电平进行数字编码。也就是说通过调节占空比的变化来调节信号、能量等的变化&#xff0c;占空比就是指在一个周期内&#xff0c;信号处于…...

毕业设计 基于51单片机WIFI智能家居系统设计

基于51单片机WIFI智能家居系统设计1、毕业设计选题原则说明&#xff08;重点&#xff09;2、项目资料2.1 系统框架2.2 系统功能3、部分电路设计3.1 STC89C52单片机最小系统电路设计3.2 ESP8266 WIFI电路设计3.3 DHT11温湿度传感器电路设计4、部分代码展示4.1 LCD12864显示字符串…...

Nginx服务优化措施与配置防盗链

目录 一.优化Nginx的相关措施 二.隐藏/查看版本号 三.修改用户与组 四.设置缓存时间 五.日志切割脚本 六.设置连接超时控制连接访问时间 七.开启多进程 八.配置网页压缩 九.配置防盗链 1.配置web源主机&#xff08;192.168.79.210 www.zhuo.com&#xff09; 1.1 安装…...

Java 某厂面试题真题合集

哈喽~大家好&#xff0c;这篇来看看Java 某厂面试题真题合集。 &#x1f947;个人主页&#xff1a;个人主页​​​​​ &#x1f948; 系列专栏&#xff1a;【日常学习上的分享】 &#x1f949;与这篇相关的文章&#xff1a; Spr…...

很特别的5G市场,5.75亿部手机,却有11亿5G用户,这是怎么了?

中国在5G商用方面已取得了巨大的成绩&#xff0c;这是毋庸置疑的&#xff0c;不过近期公布的一份数据却相当特别&#xff0c;5G手机用户数为5.75亿&#xff0c;而开通了5G套餐的用户数却已超过11亿&#xff0c;这数据对比有点意思。中国在5G商用方面推进很快&#xff0c;建成的…...

go modules

文章目录1. 简介示例1. 示例——同一项目2. 示例——不同项目3. 示例——添加远程模块依赖库1. 简介 go module是Go1.11版本之后官方推出的版本管理工具&#xff0c;并且从Go1.13版本开始&#xff0c;go module将是Go语言默认的依赖管理工具。到今天Go1.14版本推出之后Go modu…...

Baklib客户故事:快递助手ERP

快递助手ERP以多平台多店铺订单管理为核心&#xff0c;集打单发货、商品、库存、采购、售后于一体&#xff0c;中小商家易上手的轻量级ERP&#xff0c;可以满足满足微商、自建商城、档口货源网、一件代发等不同类型客户的打单需求&#xff0c;通过开放平台API接口&#xff0c;自…...

MongoDB学习(java版)

MongoDB概述 结构化数据库 ​ 结构化数据库是一种使用结构化查询语言&#xff08;SQL&#xff09;进行管理和操作的数据库&#xff0c;它们的数据存储方式是基于表格和列的。结构化数据库要求数据预先定义数据模式和结构&#xff0c;然后才能存储和查询数据。结构化数据库通常…...

RK3568平台开发系列讲解(显示篇)什么是DRM

🚀返回专栏总目录 文章目录 一、DRM介绍二、DRM与framebuffer的区别沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇文章将介绍什么是DRM。 一、DRM介绍 DRM 是 Linux 目前主流的图形显示框架,相比FB架构,DRM更能适应当前日益更新的显示硬件。 比如FB原生不支…...

Python蓝桥杯训练:基本数据结构 [二叉树] 上

Python蓝桥杯训练&#xff1a;基本数据结构 [二叉树] 上 文章目录Python蓝桥杯训练&#xff1a;基本数据结构 [二叉树] 上一、前言二、有关二叉树理论基础1、二叉树的基本定义2、二叉树的常见类型3、二叉树的遍历方式三、有关二叉树的层序遍历的题目1、[二叉树的层序遍历](http…...

vuex基础之初始化功能、state、mutations、getters、模块化module的使用

vuex基础之初始化功能、state、mutations、getters、模块化module的使用一、Vuex的介绍二、初始化功能三、state3.1 定义state3.2 获取state3.2.1 原始形式获取3.2.2 辅助函数获取(mapState)四、mutations4.1 定义mutations4.2 调用mutations4.2.1 原始形式调用($store)4.2.2 辅…...

WebSphere中间件漏洞总结

WebSphere中间件漏洞总结 一、WebSphere简介 WebSphere为SOA(面向服务架构)环境提供软件,以实现动态的、互联的业务流程,为所有业务情形提供高度有效的应用程序基础架构。WebSphere是IBM的应用程序和集成软件平台,包含所有必要的中间件基础架构(包括服务器、服务和工具)…...

Unity之ASE实现影魔灵魂收集特效

前言 我们今天来实现一下Dota中的影魔死亡后&#xff0c;灵魂收集的特效。效果如下&#xff1a; 实现原理 1.先添加一张FlowMap图&#xff0c;这张图的UV是根据默认UV图&#xff0c;用PS按照我们希望的扭曲方向修改的如下图所示&#xff1a; 2.通过FlowMap图&#xff0c;我…...

半入耳式耳机运动会不会掉、佩戴超稳固的运动耳机推荐

现在越来越多的人开始意识到运动的重要性&#xff0c;用运动给身体增加一道“防护墙”是最好的生活方式了&#xff0c;不过&#xff0c;日复一日做着几乎相同的动作&#xff0c;难免索然无味&#xff0c;所以很多人都会选择在运动时戴上耳机听歌解闷&#xff0c;这时候也有不少…...

使用Tensorflow完成一个简单的手写数字识别

Tensorflow中文手册 介绍TensorFlow_w3cschool 模型结构图&#xff1a; 首先明确模型的输入及输出&#xff08;先不考虑batch&#xff09; 输入&#xff1a;一张手写数字图&#xff08;28x28x1像素矩阵&#xff09; 1是通道数 输出&#xff1a;预测的数字&#xff08;1x10的one…...

OpenGL三种向着色器传递数据的方法 attributes,uniform,texture以及中间产物

&#xff08;1&#xff09;属性&#xff0c;使在顶点着色器中使用的变量&#xff0c;用于描述顶点的属性&#xff0c;如位置、颜色、法向量等&#xff0c;attributes通常用于描述每个顶点的属性&#xff0c;因此在顶点缓冲对象中存储&#xff0c;渲染的时候&#xff0c;openGL会…...

详解package.json和package-lock

详解package.json和package-lockpackage.json和package-lock.json作用首先要明确一点&#xff0c;package.json不会自动生成&#xff0c;需要我们使用 npm init 创建。package-lock.json是自动生成的&#xff0c;我们使用 npm install 安装包后就会自动生成。在我们执行 npm in…...

02-CSS

一、emmet语法1、简介Emmet语法的前身是Zen coding,它使用缩写,来提高html/css的编写速度, Vscode内部已经集成该语法。快速生成HTML结构语法快速生成CSS样式语法2、快速生成HTML结构语法生成标签 直接输入标签名 按tab键即可 比如 div 然后tab 键&#xff0c; 就可以生成 <…...

JavaScript 中的类型转换机制以及==和===的区别

目录一、概述二、显示转换Number()parseInt()String()Boolean()三、隐式转换自动转换成字符串自动转换成数值四、 和 区别1、等于操作符2、全等操作符3、区别小结一、概述 我们知道&#xff0c;JS中有六种简单数据类型&#xff1a;undefined、null、boolean、string、number、…...

RocketMQ基础篇(一)

目录一、发送消息类型1、同步消息2、异步消息3、单向消息4、顺序消费5、延迟消费二、消费模式1、集群模式2、广播模式3、消费模式扩展4、如何配置三、其他用法1、事务消息2、过滤消息1&#xff09;Tag过滤2&#xff09;SQL方式过滤源码放到了GitHub仓库上&#xff0c;地址 http…...

Android前沿技术—gradle中的build script详解

build.gradle是gradle中非常重要的一个文件&#xff0c;因为它描述了gradle中可以运行的任务&#xff0c;今天本文将会带大家体验一下如何创建一个build.gradle文件和如何编写其中的内容。 project和task gradle是一个构建工具&#xff0c;所谓构建工具就是通过既定的各种规则…...

深入浅出PaddlePaddle函数——paddle.zeros_like

分类目录&#xff1a;《深入浅出PaddlePaddle函数》总目录 相关文章&#xff1a; 深入浅出PaddlePaddle函数——paddle.Tensor 深入浅出PaddlePaddle函数——paddle.ones 深入浅出PaddlePaddle函数——paddle.zeros 深入浅出PaddlePaddle函数——paddle.full 深入浅出Padd…...

物料-零部件分类属性

离散制造业的研发、生产跟产品零部件紧密联系在一起&#xff0c;从企业业务流程来说零部件涉及研发、采购、仓储、生产、质量、售后和配件等多个部门&#xff0c;为了更好地管理零部件&#xff0c;下面我们一起来看看零部件概念及分类。 1、按行业属性分类 &#xff08;1&…...