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

STM32 CAN多节点组网项目实操 挖坑与填坑记录2

系列文章,持续探索CAN多节点通讯,

上一篇文章链接:

STM32 CAN多节点组网项目实操 挖坑与填坑记录-CSDN博客文章浏览阅读120次。CAN线性组网项目开发过程中遇到的数据丢包问题,并尝试解决的记录和推测分析。开发了一个多节点线性组网采集数据的项目。系统包含1个供电和数据网关板还有最多10个节点。节点之间和网关之间通过CAN通讯。硬件环境节点软件开发环境节点IAR 8.32.1VSCODE软件支持包ST HAL 库硬件环境网关板软件开发环境节点KEIL5.14VSCODE软件支持包ST HAL 库PC上位机环境windows10USB-CAN PC上位机CANAGAROOPC串口助手。https://blog.csdn.net/qq_21370051/article/details/134919608?spm=1001.2014.3001.5502

 摘要

CAN线性组网项目开发过程中遇到的数据丢包问题,并尝试解决的记录和推测分析。

  关键词

CAN串联多节点通讯、CAN10节点通讯、CAN数据丢包、STM32 CAN

  背景/项目介绍

概述:

开发了一个多节点线性组网采集数据的项目。

系统包含1个供电和数据网关板还有最多10个节点。

节点之间和网关之间通过CAN通讯。

网关板主要功能:

1.是给总线上每个节点供电

2.并将CAN协议转换为USB CDC设备和PC上位机通讯。

节点的功能:

采集当前位置数据,并通过CAN协议上传给网关板。

通讯线束

CAT6 六类网线,用的网线来传输CAN信号,取网线中的1对双绞线来做CAN_H  CAN_L通讯,再取2对网线来做供电,由网关板输出DC12到网线,以此给10个节点做供电,算是自己做了个POE供电,不过是非标的,哈哈哈哈。

节点硬件设计:

一个STM32单片机、两个不带网络变压器的RJ45插座。CAN收发器芯片。

两个RJ45插座完全并联,当接线时,一个用来插入上一个节点延展出的网线水晶头,另一个RJ45插座插入一条网线用来连接下一个节点。

整体系统总线布局

虽然系统物理宏观角度来看是线性连接的,但其实内部每个节点还是通过CAN_H CAN_L挂载到总线上的。类似上图的链接方式。

运行开发环境介绍

硬件环境

节点

STM32F091CCT6

J-LINK  V11

软件开发环境

节点

IAR 8.32.1 

VSCODE 

软件支持包ST HAL 库

硬件环境

网关板

STM32F072C816

J-LINK  V11

软件开发环境

节点

KEIL5.14

VSCODE 

软件支持包ST HAL 库
PC上位机环境windows10
USB-CAN PC上位机CANAGAROO
PC串口助手Serial Port Utility

实验1:

实验条件:

测试条件,在最高18层的居民楼馁,网关板在二居室卧室里,后级网线从市内拉到居民楼楼道内,随楼道步梯往楼上呈“之”字形往楼上延伸。网关板和PC之间是USB-TYPE-C线连接,协议为USB-TTL 。

节点布局:

CAN网关板和第一个节点之间用50米的CAT6网线,第二个节点到第十个节点之间都是2米的CAT6网线。

节点间的2米网线没有伸展开,绕圈放置。

线束材料:

CAT6类网线,我是用网线来传输的CAN信号,并且用网线来传输12V DC给接点供电。

其中第一根网线10米,其余为5米。 

通讯波特率:

10k

接入节点:

实验1接入的是1.2.3.4.5.6.7.8.9.10  这几个节点。

接点接入方法1:

先开启网关板的供电,然后一个个接入节点设备

节点接入方法2: 

先不开启网关板供电,先将所有节点接好,然后再开启网关板供电,所有节点上电。或者是用“节点接入方法1”接好总线后,再给网关板断电,然后重新上电,都是为了实现一个所有节点同时上电。

实验发现

只能接收到 5节点的数据。

实验2:

实验条件:

线束材料:

和实验1 相同。

通讯波特率:

10k 

接入节点:

也接入的是1.2.3.4.5.6.7.8 9.10 这几个节点。

 线束布局:

和实验1 相同。

实验变量:

在实验1的基础上,将节点间的2米网线伸展开。

实验发现

只能接收到6个节点的数据。

总结扩展

我为了增加通讯距离,已经将通讯速率降低到了10Kbps,理论上通讯距离50米应该没问题啊,我之前设置125Kbps,也是网关+10个节点,第一个节点和网关之间20米CAT6网线,节点之间5米网线实验时,通讯是正常的,总长度已经是70米了。而今天的实验,任意两节点间距离达到了50米就出现了如此严重的丢数据现象,是不能接受的。

实验3:

实验条件

线束材料、通讯波特率同实验2。
实验变量

找一个普通节点相同的电路板,将程序改为收到就转发。让他成为一个中继节点。

接入节点:

中继1   节点:1  2 3 4 5 6 7 8 9 10 

节点布局:

网关板和第一个中继板之间为10米蓝色的超六类双屏蔽的网线

再接20米的灰色普通CAT6网线。后面的10个节点之间为2米的CAT6网线。

因为空间受限,节点之间的网线没有全延展开。

程序修改

收到CAN数据就原封不动转发的代码实现如下:


uint16_t RecvCanDataToCmdQueue(void)
{// uint8_t lu8_sta =0;// uint16_t lu16_temp =0;// memset(&UpComCmdDP,0,sizeof(UpComCmdDP));// memset(&gu8Ar_Result,0,sizeof(gu8Ar_Result)); CanDataRx_TypeDef   ls_CanRxData;CanDataTx_TypeDef   Frame;ErrorStatus         err = SUCCESS;uint16_t            lu16_cnt = 0;uint32_t            lu32_sta =0;uint16_t            lu16_temp =0;memset(&Frame,0,sizeof(Frame));memset(&UpComCmdDP,0,sizeof(UpComCmdDP));memset(&ls_CanRxData,0,sizeof(ls_CanRxData));lu16_cnt = QUEUE_StructOut(&QueCanRxData,&ls_CanRxData,1);     // CanDataTx_TypeDef   Frame;// ErrorStatus  err = SUCCESS;// memset(&Frame,0,sizeof(Frame));if(gu8_DecvType == M_Repeater){if(1 == lu16_cnt) {Frame.Header.IDE     = CAN_ID_EXT;Frame.Header.StdId   = ls_CanRxData.Header.StdId;Frame.Header.ExtId   = ls_CanRxData.Header.ExtId;Frame.Header.RTR     = CAN_RTR_DATA;    Frame.Header.DLC     = 8;        Frame.DataBuf[0]     = ls_CanRxData.DataBuf[0];Frame.DataBuf[1]     = ls_CanRxData.DataBuf[1];Frame.DataBuf[2]     = ls_CanRxData.DataBuf[2];      Frame.DataBuf[3]    = ls_CanRxData.DataBuf[3];  Frame.DataBuf[4]    = ls_CanRxData.DataBuf[4];  Frame.DataBuf[5]    = ls_CanRxData.DataBuf[5];            Frame.DataBuf[6]    = ls_CanRxData.DataBuf[6];  Frame.DataBuf[7]    = ls_CanRxData.DataBuf[7];   err = CanPackData2TxQue(&Frame);if(err!= SUCCESS){myprintf(DEBUG_UART,"CanPackData2TxQue ERR \r\n");return ERROR;}}}else{if(1 == lu16_cnt) {if(gS_SysParm.PCCanID == ls_CanRxData.Header.ExtId )  //如果数据是从PC发来的{if( ( gS_SysParm.LocalCanID == ls_CanRxData.DataBuf[0] ) || ( BROADCAST_CANID == ls_CanRxData.DataBuf[0] ) ) //如果是发送给本设备的{                if( MC_SEND_MESS == ls_CanRxData.DataBuf[1] )  //判断MESSAGETYPE{switch (ls_CanRxData.DataBuf[2]){case MC_WIHTE_BALANCE_START:{UpComCmdDP.CMD_TYPE = UPM_WHITE_BLANCE_START;      lu32_sta = QUEUE_StructIn(&UpMachComCmdQue,&UpComCmdDP,1);if(1 == lu32_sta){APP_ACK2PC_CanTxQue(MC_WIHTE_BALANCE_START,0);}else{myprintf(DEBUG_UART,"QUEUE_StructIn(&UpMachComCmdQue,&UpComCmdDP,1) ERR\r\n");}}break;case MC_OPEN_LED:{UpComCmdDP.CMD_TYPE = UPM_SET_TCS_LED_PWM_START;if(ls_CanRxData.DataBuf[3] < 1){UpComCmdDP.u32Value = 1;}else if(ls_CanRxData.DataBuf[3] > 10){UpComCmdDP.u32Value = 10;}                            else{UpComCmdDP.u32Value = ls_CanRxData.DataBuf[3];}uint8_t lu8_val = (uint8_t)UpComCmdDP.u32Value;// UpComCmdDP.u32Value = MC_TCS_LED_INIT_PWM;lu32_sta = QUEUE_StructIn(&UpMachComCmdQue,&UpComCmdDP,1);if(1 == lu32_sta){APP_ACK2PC_CanTxQue(MC_OPEN_LED,lu8_val);}else{myprintf(DEBUG_UART,"QUEUE_StructIn(&UpMachComCmdQue,&UpComCmdDP,1) ERR\r\n");}                            }break;        case MC_CLOSE_LED:{UpComCmdDP.CMD_TYPE = UPM_CLOSE_TCS_LED; UpComCmdDP.u32Value = 0;lu32_sta = QUEUE_StructIn(&UpMachComCmdQue,&UpComCmdDP,1);if(1 == lu32_sta){APP_ACK2PC_CanTxQue(MC_CLOSE_LED,0);}else{myprintf(DEBUG_UART,"QUEUE_StructIn(&UpMachComCmdQue,&UpComCmdDP,1) ERR\r\n");}                            }break;      case MC_OPEN_RGB_DATAUP:{UpComCmdDP.CMD_TYPE = UPM_OPEN_RGB_DATAUP; lu32_sta = QUEUE_StructIn(&UpMachComCmdQue,&UpComCmdDP,1);if(1 == lu32_sta){APP_ACK2PC_CanTxQue(MC_OPEN_RGB_DATAUP,0);}else{myprintf(DEBUG_UART,"QUEUE_StructIn(&UpMachComCmdQue,&UpComCmdDP,1) ERR\r\n");}                            }break;                        case MC_CLOSE_RGB_DATAUP:{UpComCmdDP.CMD_TYPE = UPM_CLOSE_RGB_DATAUP; lu32_sta = QUEUE_StructIn(&UpMachComCmdQue,&UpComCmdDP,1);if(1 == lu32_sta){APP_ACK2PC_CanTxQue(MC_CLOSE_RGB_DATAUP,0);}else{myprintf(DEBUG_UART,"QUEUE_StructIn(&UpMachComCmdQue,&UpComCmdDP,1) ERR\r\n");}                                                             }break;  default:myprintf(DEBUG_UART,"{ CAN_UPM: unknow DataBuf[2]  002  !!}\r\n");     break;}}   // else if( MC_ACK_MESS == ls_CanRxData.DataBuf[1] )  //判断MESSAGETYPE// {// }// else if( MC_AUTO_UP == ls_CanRxData.DataBuf[1] )  //判断MESSAGETYPE// {// }                }             }} //endof if(1 == lu16_cnt) }//endof elsereturn 1;//1条指令解析成功,入通讯命令队列
}

实验发现

10个节点全都能收到数据了。

备注:

监听软件,CANGAROO。

敬请期待

没来得及继续探究剩下的问题,欢迎关注,后面我会记录并更新我的程序更改和实验方案~

关注我不迷路。

相关文章:

STM32 CAN多节点组网项目实操 挖坑与填坑记录2

系列文章&#xff0c;持续探索CAN多节点通讯&#xff0c; 上一篇文章链接&#xff1a; STM32 CAN多节点组网项目实操 挖坑与填坑记录-CSDN博客文章浏览阅读120次。CAN线性组网项目开发过程中遇到的数据丢包问题&#xff0c;并尝试解决的记录和推测分析。开发了一个多节点线性…...

Flink 数据类型 TypeInformation信息

Flink流应用程序处理的是以数据对象表示的事件流。所以在Flink内部&#xff0c;我么需要能够处理这些对象。它们需要被序列化和反序列化&#xff0c;以便通过网络传送它们&#xff1b;或者从状态后端、检查点和保存点读取它们。为了有效地做到这一点&#xff0c;Flink需要明确知…...

基于python的leetcode算法介绍之递归

文章目录 零 算法介绍一 简单示例 辗转相除法Leetcode例题与思路[509. 斐波那契数](https://leetcode.cn/problems/fibonacci-number/)解题思路&#xff1a;题解&#xff1a; [206. 反转链表](https://leetcode.cn/problems/reverse-linked-list/)解题思路&#xff1a;题解&…...

2023年度佳作:AIGC、AGI、GhatGPT、人工智能大语言模型的崛起与挑战

目录 前言 01 《ChatGPT 驱动软件开发》 内容简介 02 《ChatGPT原理与实战》 内容简介 03 《神经网络与深度学习》 04 《AIGC重塑教育》 内容简介 05 《通用人工智能》 目  录 前言 2023年是人工智能大语言模型大爆发的一年&#xff0c;一些概念和英文缩写也在这一…...

Axure的交互以及情形的介绍

一. 交互 1.1 交互概述 通俗来讲就是&#xff0c;谁用了什么方法做了什么事情&#xff0c;主体"谁"对应的就是axure中的元件&#xff0c;"什么方法"对应的就是交互事件&#xff0c;比如单击事件、双击事件&#xff0c;"什么事情"对应的就是交互…...

【MATLAB第84期】基于MATLAB的波形叠加极限学习机SW-ELM代理模型的sobol全局敏感性分析法应用

【MATLAB第84期】基于MATLAB的波形叠加极限学习机SW-ELM代理模型的sobol全局敏感性分析法应用 前言 跟往期sobol区别&#xff1a; 1.sobol计算依赖于验证集样本&#xff0c;无需定义变量上下限。 2.SW-ELM自带激活函数&#xff0c;计算具有phi&#xff08;x&#xff09;e^x激…...

米游社区表情包整合网站源码

源码介绍 米游社表情包整合网站源码&#xff0c;来自Github大佬的项目&#xff0c;包含米游兔123枚&#xff0c;米游社 玩家12枚&#xff0c;崩坏 星穹铁道112枚&#xff0c;绝区零218枚&#xff0c;NAP32枚&#xff0c;崩坏RPG62枚&#xff0c;崩坏3-1282枚&#xff0c;原神 …...

easyexcel调用公共导出方法导出数据

easyexcel备忘 Slf4j public class ConditionDownloadUtil {//扫描在xboot 包下所有IService 接口的子类, 每次启动服务后, 重新扫描public final static Class[] classesExtendsIService ClassUtil.scanPackageBySuper("cn.exrick.xboot", IService.class).toArra…...

C语言插入排序算法及代码

一、原理 在待排序的数组里&#xff0c;从数组的第二个数字开始&#xff0c;通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。 二、代码部分 #include<stdio.h> #include<stdlib.h> int ma…...

2023年中国法拍房用户画像和数据分析

法拍房主要平台 法拍房主要平台有3家&#xff0c;分别是阿里、京东和北交互联平台。目前官方认定纳入网络司法拍卖的平台共有7家&#xff0c;其中阿里资产司法拍卖平台的挂拍量最大。 阿里法拍房 阿里法拍房数据显示2017年&#xff0c;全国法拍房9000套&#xff1b;2018年&a…...

Android 清除临时文件,清空缓存

python 代码&#xff1a; import os import shutil import tracebackdef delete_folder(path):if os.path.exists(path):print(f"删除文件夹: {path}")shutil.rmtree(path)print("删除完成")def delete_file(path):if os.path.exists(path):print(f"删…...

Guava限流神器:RateLimiter使用指南

1. 引言 可能有些小伙伴听到“限流”这个词就觉得头大&#xff0c;感觉像是一个既复杂又枯燥的话题。别急&#xff0c;小黑今天就要用轻松易懂的方式&#xff0c;带咱们一探RateLimiter的究竟。 想象一下&#xff0c;当你去超市排队结账时&#xff0c;如果收银台开得越多&…...

【六大排序详解】开篇 :插入排序 与 希尔排序

插入排序 与 希尔排序 六大排序之二 插入排序 与 希尔排序1 排序1.1排序的概念 2 插入排序2.1 插入排序原理2.2 排序步骤2.3 代码实现 3 希尔排序3.1 希尔排序原理3.2 排序步骤3.3 代码实现 4 时间复杂度分析 Thanks♪(&#xff65;ω&#xff65;)&#xff89;下一篇文章见&am…...

凸优化问题求解

这里写目录标题 1. 线性规划基本定理2.单纯形法2.1 转轴运算 3. 内点法3.1 线性规划的内点法 1. 线性规划基本定理 首先我们指出&#xff0c;线性规划均可等价地化成如下标准形式 { min ⁡ c T x , s . t A x b , x ⪰ 0 , \begin{align}\begin{cases}\min~c^Tx,\\\mathrm{s.…...

文件操作入门指南

目录 一、为什么使用文件 二、什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 三、文件的打开和关闭 3.1 文件指针 3.2 文件的打开和关闭 四、文件的顺序读写 ​编辑 &#x1f33b;深入理解 “流”&#xff1a; &#x1f342;文件的顺序读写函数介绍&#xff1a; …...

Axure之交互与情节与一些实例

目录 一.交互与情节简介 二.ERP登录页到主页的跳转 三.ERP的菜单跳转到各个页面的跳转 四.省市联动 五.手机下拉加载 今天就到这里了&#xff0c;希望帮到你哦&#xff01;&#xff01;&#xff01; 一.交互与情节简介 "交互"通常指的是人与人、人与计算机或物体…...

【数据库设计和SQL基础语法】--连接与联接--多表查询与子查询基础(二)

一、子查询基础 1.1 子查询概述 子查询是指在一个查询语句内部嵌套另一个查询语句的过程。子查询可以嵌套在 SELECT、FROM、WHERE 或 HAVING 子句中&#xff0c;用于从数据库中检索数据或执行其他操作。子查询通常返回一个结果集&#xff0c;该结果集可以被包含它的主查询使用…...

Android studio中导入opencv库

具体opencv库的导入流程参考链接&#xff1a;Android Studio开发之路 &#xff08;五&#xff09;导入OpenCV以及报错解决 一、出现的错误&#xff1a;NullPointerException: Cannot invoke “java.io.File.toPath()” because “this.mySdkLocation” is null 解决办法&#…...

Linux(1)_基础知识

第一部分 一、Linux系统概述 创始人&#xff1a;芬兰大学大一的学生写的Linux内核&#xff0c;李纳斯托瓦兹。 Linux时unix的类系统&#xff1b; 特点&#xff1a;多用户 多线程的操作系统&#xff1b; 开源操作系统&#xff1b; 开源项目&#xff1a;操作系统&#xff0c;应用…...

网络相关面试题

简述 TCP 连接的过程&#xff08;淘系&#xff09; 参考答案&#xff1a; TCP 协议通过三次握手建立可靠的点对点连接&#xff0c;具体过程是&#xff1a; 首先服务器进入监听状态&#xff0c;然后即可处理连接 第一次握手&#xff1a;建立连接时&#xff0c;客户端发送 syn 包…...

Vue2面试题:说一下对跨域的理解?

http请求分为两大类&#xff1a;普通http请求&#xff08;如百度请求&#xff09;和ajax请求&#xff08;跨域是出现在ajax请求&#xff09; 同源策略&#xff1a;在浏览器发起ajax请求时&#xff0c;当前的网址和被请求的网址协议、域名、端口号必须完全一致&#xff0c;目的是…...

Axure中如何使用交互样式交互事件交互动作情形

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《产品经理如何画泳道图&流程图》 ⛺️ 越努力 &#xff0c;越幸运 目录 一、Axure中交互样式 1、什么是交互样式&#xff1f; 2、交互样式的作用&#xff1f; 3、Axure中如何…...

1112. 迷宫(DFS之连通性模型)

1112. 迷宫 - AcWing题库 一天Extense在森林里探险的时候不小心走入了一个迷宫&#xff0c;迷宫可以看成是由 n∗n 的格点组成&#xff0c;每个格点只有2种状态&#xff0c;.和#&#xff0c;前者表示可以通行后者表示不能通行。 同时当Extense处在某个格点时&#xff0c;他只…...

飞天使-k8s知识点1-kubernetes架构简述

文章目录 名词功能要点 k8s核心要素CNCF 云原生框架简介k8s组建介绍 名词 CI 持续集成, 自动化构建和测试&#xff1a;通过使用自动化构建工具和自动化测试套件&#xff0c;持续集成可以帮助开发人员自动构建和测试他们的代码。这样可以快速检测到潜在的问题&#xff0c;并及早…...

linux中deadline调度原理与代码注释

简介 deadline调度是比rt调度更高优先级的调度&#xff0c;它没有依赖于优先级的概念&#xff0c;而是给了每个实时任务一定的调度时间&#xff0c;这样的好处是&#xff1a;使多个实时任务场景的时间分配更合理&#xff0c;不让一些实时任务因为优先级低而饿死。deadline调度…...

jquery、vue、uni-app、小程序的页面传参方式

jQuery、Vue、Uni-app 和小程序&#xff08;例如微信小程序&#xff09;都有它们自己的页面传参方式。下面分别介绍这几种方式的页面传参方式&#xff1a; jQuery: 在jQuery中&#xff0c;页面传参通常是通过URL的查询参数来实现的。例如&#xff1a; <a href"page2…...

ModuleNotFoundError: No module named ‘openai.error‘

ModuleNotFoundError: No module named ‘openai.error’ result self.fn(*self.args, **self.kwargs) File “H:\chatGPTWeb\chatgpt-on-wechat\channel\chat_channel.py”, line 168, in _handle reply self._generate_reply(context) File “H:\chatGPTWeb\chatgpt-on-wec…...

理解pom.xml中的parent标签

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 循序渐进学SpringBoot ✨特色专栏&…...

element ui el-avatar 源码解析零基础逐行解析

avatar功能介绍 快捷配置头像的样式 avatar 的参数配置 属性说明参数size尺寸type string 类型 &#xff08;‘large’,‘medium’,‘small’&#xff09;number类型 validator 校验shape形状circle (原型) square&#xff08;方形&#xff09;icon传入的iconsrc传入的图片st…...

Linux下c语言实现动态库的动态调用

在Linux操作系统下&#xff0c;有时候需要在不重新编译程序的情况下&#xff0c;运行时动态地加载库&#xff0c;这时可以通过Linux操作系统提供的API可以实现&#xff0c;涉及到的API主要有dlopen、dlsym和dlclose。使用时&#xff0c;需要加上头文件#include <dlfcn.h>…...

网站运营费用/关键词排名优化提升培训

前面内容&#xff0c;我们详细了解了使用Python获取百家姓起源的方法 前情回顾 《百家姓》中姓氏起源&#xff0c;新华字典如何解释&#xff1f;用Python带你1步搞定 还带大家将百家姓的起源内容存入到了Excel中 Excel展示 复习Excel样式设置&#xff0c;案例演示Python将《百家…...

在微信网站上做的微信名片是真的吗/搜索引擎营销简称

最近项目中考虑使用阿里大鱼的sms短信发送服务&#xff0c;不过&#xff0c;在找到阿里大鱼php sdk的 时候&#xff0c;尼玛&#xff0c;问题来了&#xff01;我就想用个短信而已啊。。。。竟然给我打包了好多 什么httpdns 什么kfcsearch 什么area ?至于么&#xff1f; 至于么…...

昆明seo网站建设/湖南好搜公司seo

Bingo! 正如你所猜测的那样&#xff0c;这篇文章是讲人员招聘的。 感谢计算机&#xff0c;正因为有了它&#xff0c;我们不需要真的有水果&#xff0c;就能玩切水果的游戏。 如果你是一个水果罐头制造商&#xff0c;那么你需要操心的是从哪里购买水果原料、怎样运输、怎样建造厂…...

网站都有备案号吗/游戏广告联盟平台

查询表内容&#xff1a; select * from stu; (stu是一张表) 显示表结构: desc stu;...

邢台住房和城乡建设部网站/2021年关键词有哪些

springboot集成clickhouse一、安装二、springboot集成三、参考文献一、安装 我是安装在linux上, 步骤如下。 1、添加yum源 下面展示一些 内联代码片。 yum-config-manager --add-repo http://repo.red-soft.biz/repos/clickhouse/repo/clickhouse-el6.repo 2、安装 yum inst…...

深圳网站设计公司怎么找/seo做的比较牛的公司

初衷在公司由于大家随意提交 git-commit 的信息&#xff0c;导致提交的风格千奇百怪&#xff0c;写的信息不明确&#xff0c;不知道这次提交具体是修复 bug 呢&#xff1f;还是增加新功能&#xff0c;还是单纯改了一些配置文件&#xff0c;亦或是重构了一些不好的代码。只能靠大…...