DA14585 读取 SHT30温度计;

2023-11-20

user_sht30.c

/**


  • @file user_i2c.c
  • @brief user_i2c source file.
  • Copyright © 2018 Dialog Semiconductor. This computer program or computer programs included in this package (“Software”) include confidential, proprietary information of Dialog Semiconductor. All Rights Reserved.
  • THIS SOFTWARE IS AN UNOFFICIAL RELEASE FROM DIALOG SEMICONDUCTOR (慏IALOG? AND MAY ONLY BE USED BY RECIPIENT AT ITS OWN RISK AND WITHOUT SUPPORT OF ANY KIND. THIS SOFTWARE IS SOLELY FOR USE ON AUTHORIZED DIALOG PRODUCTS AND PLATFORMS. RECIPIENT SHALL NOT TRANSMIT ANY SOFTWARE SOURCE CODE TO ANY THIRD PARTY WITHOUT DIALOG扴 PRIOR WRITTEN PERMISSION.
  • UNLESS SET FORTH IN A SEPARATE AGREEMENT, RECIPIENT ACKNOWLEDGES AND UNDERSTANDS THAT TO THE FULLEST EXTENT PERMITTED BY LAW, THE SOFTWARE IS DELIVERED 揂S IS? WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, TITLE OR NON-INFRINGEMENT, AND ALL WARRANTIES THAT MAY ARISE FROM COURSE OF DEALING, CUSTOM OR USAGE IN TRADE. FOR THE SAKE OF CLARITY, DIALOG AND ITS AFFILIATES AND ITS AND THEIR SUPPLIERS DO NOT WARRANT, GUARANTEE OR MAKE ANY REPRESENTATIONS (A) REGARDING THE USE, OR THE RESULTS OF THE USE, OF THE LICENSED SOFTWARE IN TERMS OF CORRECTNESS, COMPLETENESS, ACCURACY, RELIABILITY OR OTHERWISE, AND (B) THAT THE LICENSED SOFTWARE HAS BEEN TESTED FOR COMPLIANCE WITH ANY REGULATORY OR INDUSTRY STANDARD, INCLUDING, WITHOUT LIMITATION, ANY SUCH STANDARDS PROMULGATED BY THE FCC OR OTHER LIKE AGENCIES.
  • IN NO EVENT SHALL DIALOG BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

*/

/*

  • INCLUDE FILES

*/

#include “user_sht30.h”
#include “i2c.h”
/****************************************************************************************

  • MACROS
    ****************************************************************************************/
    // I2C helper macros
    #define SEND_I2C_COMMAND(X) SetWord16(I2C_DATA_CMD_REG, (X))
    #define WAIT_WHILE_I2C_FIFO_IS_FULL() while (!(GetWord16(I2C_STATUS_REG) & TFNF)){}
    #define WAIT_UNTIL_I2C_FIFO_IS_EMPTY() while (!(GetWord16(I2C_STATUS_REG) & TFE)){}
    #define WAIT_UNTIL_NO_MASTER_ACTIVITY() while (GetWord16(I2C_STATUS_REG) & MST_ACTIVITY)
    #define WAIT_FOR_RECEIVED_BYTE() while (!GetWord16(I2C_RXFLR_REG))

struct i2c_cfg_env_t i2c_cfg_env;

static void user_i2c_send_address(uint32_t address_to_send)
{
for(int8_t i = i2c_cfg_env.register_address_width; i >= 0; i–){
SEND_I2C_COMMAND((address_to_send >> 8*i) & 0xFF); // Send the bytes of the register address
}
}

void user_i2c_init(uint16_t slave_address, I2C_ADDRESS_MODES i2c_address_width, I2C_SPEED_MODES bit_rate, I2C_REGISTER_WIDTH register_width, I2C_ADDRESS_BYTES_COUNT register_address_width)
{
// Save the settings in a struct
i2c_cfg_env.i2c_address_width = i2c_address_width;
i2c_cfg_env.bit_rate = bit_rate;
i2c_cfg_env.register_width = register_width;
i2c_cfg_env.register_address_width = register_address_width;

// Initialize the I2C with the address provided as argument
SetBits16(CLK_PER_REG, I2C_ENABLE, 1); // Enable  clock for I2C
SetWord16(I2C_ENABLE_REG, 0x0); // Disable the I2C controller
SetWord16(I2C_CON_REG,
          I2C_MASTER_MODE | I2C_SLAVE_DISABLE | I2C_RESTART_EN); // Slave is disabled
SetBits16(I2C_CON_REG, I2C_SPEED,
          i2c_cfg_env.bit_rate); // Set speed. Standard speed = 1, fast = 2
if (i2c_cfg_env.i2c_address_width == I2C_7BIT_ADDR) {
    SetBits16(I2C_CON_REG, I2C_10BITADDR_MASTER, 0); // Set addressing mode. 7bit = 0
} else {
    SetBits16(I2C_CON_REG, I2C_10BITADDR_MASTER, 1); // Set addressing mode. 10bit= 1
}
SetWord16(I2C_TAR_REG, slave_address & 0x3FF); // Set Slave device address
SetWord16(I2C_ENABLE_REG, 0x1); // Enable the I2C controller
while (GetWord16(I2C_STATUS_REG) & 0x20)
    ; // Wait for I2C master FSM to be IDLE

}

void user_i2c_set_register_width(I2C_REGISTER_WIDTH width)
{
i2c_cfg_env.register_width = width;
}

void user_i2c_write_reg(uint32_t reg_address, uint32_t wr_data)
{
user_i2c_send_address(reg_address); //Start the transaction and send the address

  for(int8_t i = i2c_cfg_env.register_width; i >= 0; i--){
   WAIT_WHILE_I2C_FIFO_IS_FULL();              // Wait if I2C Tx FIFO is full
   SEND_I2C_COMMAND((wr_data >> 8*i) & 0xFF);  // Write a byte of data to the FIFO
	}
	
WAIT_UNTIL_I2C_FIFO_IS_EMPTY();                // Wait until Tx FIFO is empty
WAIT_UNTIL_NO_MASTER_ACTIVITY();               // wait until no master activity	

}

uint32_t user_i2c_read_reg(uint32_t reg_address)
{
user_i2c_send_address(reg_address);
uint32_t ret = 0;

WAIT_WHILE_I2C_FIFO_IS_FULL(); // Wait if Tx FIFO is full
  for(int8_t i = 0; i <= i2c_cfg_env.register_width; i++){
   SEND_I2C_COMMAND(0x0100 & 0x3FF); // Set R/W bit to 1 (read access) MSB
	}
	
WAIT_UNTIL_I2C_FIFO_IS_EMPTY(); // Wait until I2C Tx FIFO empty
WAIT_UNTIL_NO_MASTER_ACTIVITY();
	
  for(int8_t i = i2c_cfg_env.register_width; i >= 0; i--){
   ret |= (0xFF & GetWord16(I2C_DATA_CMD_REG)) << 8*i; // Get received byte
	}
	
WAIT_UNTIL_I2C_FIFO_IS_EMPTY();  // Wait until Tx FIFO is empty
WAIT_UNTIL_NO_MASTER_ACTIVITY(); // wait until no master activity	
	return ret;

}

void user_i2c_multi_byte_write(uint32_t reg_address, uint8_t *wr_data, uint32_t num_bytes)
{
user_i2c_send_address(reg_address);
for(uint32_t i = 0; i < num_bytes; i++){
WAIT_WHILE_I2C_FIFO_IS_FULL(); // Wait if I2C Tx FIFO is full
SEND_I2C_COMMAND(wr_data[i] & 0xFF); //Write the data to the FIFO
}
WAIT_UNTIL_I2C_FIFO_IS_EMPTY(); //Wait until Tx FIFO is empty
WAIT_UNTIL_NO_MASTER_ACTIVITY(); //Wait until no master activity
}

void user_i2c_multi_byte_read(uint32_t reg_address, uint8_t *rd_data, uint32_t num_bytes)
{
user_i2c_send_address(reg_address);
uint32_t index = 0;

  for(uint32_t i = 0; i < num_bytes;){
   SEND_I2C_COMMAND(0x0100 & 0x3FF); // Set R/W bit to 1 (read access) MSB
		 if(!(++i % 24)){ //FIFO is 32 bits
	      WAIT_UNTIL_I2C_FIFO_IS_EMPTY();                 // Wait until Tx FIFO is empty
      WAIT_UNTIL_NO_MASTER_ACTIVITY();                // wait until no master activity
			  for (uint8_t j = 0; j < 24; j++){
					//Store the FIFO contents in ram
					rd_data[index++] = (0xFF & GetWord16(I2C_DATA_CMD_REG)); // Get received byte
				}
				reg_address += 24/(i2c_cfg_env.register_width + 1);//Calculate the next register to read out 
				user_i2c_send_address(reg_address);                //Restart the read
		 }
	}
	
WAIT_UNTIL_I2C_FIFO_IS_EMPTY(); // Wait until I2C Tx FIFO empty
WAIT_UNTIL_NO_MASTER_ACTIVITY();
	
  while(index < num_bytes){
   rd_data[index++] = (0xFF & GetWord16(I2C_DATA_CMD_REG)); // Get received byte
	}
	
WAIT_UNTIL_I2C_FIFO_IS_EMPTY();  // Wait until Tx FIFO is empty
WAIT_UNTIL_NO_MASTER_ACTIVITY(); // wait until no master activity	

}
/// @} APP

void init_SHT30(){

RESERVE_GPIO(SHT30_EN, SHT30_SCL_PORT, SHT30_SCL_PIN, PID_I2C_SCL);
RESERVE_GPIO(SHT30_EN, SHT30_SDA_PORT, SHT30_SDA_PIN, PID_I2C_SDA);

GPIO_ConfigurePin(SHT30_SCL_PORT, SHT30_SCL_PIN, INPUT_PULLUP, PID_I2C_SCL, true);
GPIO_ConfigurePin(SHT30_SDA_PORT, SHT30_SDA_PIN, INPUT_PULLUP, PID_I2C_SDA, true);

user_i2c_init(SHT30_I2C_ADDRESS, I2C_7BIT_ADDR, I2C_STANDARD, I2C_2BYTES_REGISTER, I2C_2BYTES_ADDRS);

}

#define CRC8_POLYNOMIAL 0x31

#define CRC8_POLYNOMIAL 0x31

uint8_t CheckCrc8(uint8_t* const message, uint8_t initial_value)
{
uint8_t remainder; //余数
uint8_t i = 0, j = 0; //循环变量

/* 初始化 */
remainder = initial_value;

for(j = 0; j < 2;j++)
{
    remainder ^= message[j];

    /* 从最高位开始依次计算  */
    for (i = 0; i < 8; i++)
    {
        if (remainder & 0x80)
        {
            remainder = (remainder << 1)^CRC8_POLYNOMIAL;
        }
        else
        {
            remainder = (remainder << 1);
        }
    }
}

/* 返回计算的CRC码 */
return remainder;

}
/**

  • @brief 将SHT30接收的6个字节数据进行CRC校验,并转换为温度值和湿度值
  • @param dat —— 存储接收数据的地址(6个字节数组)
  • @retval 校验成功 —— 返回0
  •         校验失败  —— 返回1,并设置温度值和湿度值为0
    

/
uint8_t SHT30_Dat_To_Float(uint8_t
const dat, float* temperature, float* humidity)
{
uint16_t recv_temperature = 0;
uint16_t recv_humidity = 0;

/* 校验温度数据和湿度数据是否接收正确 */
if(CheckCrc8(dat, 0xFF) != dat[2] || CheckCrc8(&dat[3], 0xFF) != dat[5])
    return 1;

/* 转换温度数据 */
recv_temperature = ((uint16_t)dat[0]<<8)|dat[1];
*temperature = -45 + 175*((float)recv_temperature/65535);

/* 转换湿度数据 */
recv_humidity = ((uint16_t)dat[3]<<8)|dat[4];
*humidity = 100 * ((float)recv_humidity / 65535);

return 0;

}
float temperature,humidity;
void SHT30_Read(void)
{
uint8_t buff[6]={0};

user_i2c_multi_byte_read(0x2C06,buff,6);

//温度转换;

SHT30_Dat_To_Float(buff,&temperature,&humidity);
//printf(“temperature =%.2f ,humidity = .2f /r/n”,temperature,humidity);
}

user_sht30.h
#ifndef USER_SHT30_H
#define USER_SHT30_H

#include “user_sht30.h”

#define SHT30_I2C_ADDRESS 0x44 //This is the sensor address without R/W bit (0x1D or 0x53 for ADXL)

#define NOTIFICATION_DELAY 50 //The time interval between sent notifications

#define SHT30_SCL_PORT GPIO_PORT_2
#define SHT30_SCL_PIN GPIO_PIN_3

#define SHT30_SDA_PORT GPIO_PORT_2
#define SHT30_SDA_PIN GPIO_PIN_1

typedef enum
{
I2C_7BIT_ADDR,
I2C_10BIT_ADDR,
}I2C_ADDRESS_MODES;

typedef enum
{
I2C_1BYTE_ADDRS,
I2C_2BYTES_ADDRS,
I2C_3BYTES_ADDRS,
}I2C_ADDRESS_BYTES_COUNT;

typedef enum
{
I2C_STANDARD = 1,
I2C_FAST,
}I2C_SPEED_MODES;

typedef enum
{
I2C_1BYTE_REGISTER,
I2C_2BYTES_REGISTER,
I2C_3BYTES_REGISTER,
I2C_4BYTES_REGISTER,
}I2C_REGISTER_WIDTH;

/**

  • @brief I2C struct
    */
    struct i2c_cfg_env_t
    {
    uint8_t bit_rate; //Standard mode or fast mode
    uint8_t register_width; //Slave register width 8 or 16 bit
    uint8_t i2c_address_width; //Slave addressing width 10 or 7 bit
    uint8_t register_address_width;//Slave register addressing width 8 or 16 bit
    };

/*

  • FUNCTION DECLARATIONS

*/

/**


  • @brief Initializes the I2C interface with the provide slave address
  • @param[in] slave_address , The I2C slave address to communicate with
  • @param[in] i2c_address_width , The width of the I2C address(7 or 10 bit)
  • @param[in] bit_rate , The I2C bus frequency (standard or fast mode)
  • @param[in] register_width , The I2C slave register width (1-4 bytes)
  • @param[in] register_address_width , The I2C slave register address width (1-3 bytes)
  • @return void

*/
void user_i2c_init(uint16_t slave_address, I2C_ADDRESS_MODES i2c_address_width, I2C_SPEED_MODES bit_rate, I2C_REGISTER_WIDTH register_width, I2C_ADDRESS_BYTES_COUNT register_address_width);

/**


  • @brief Sets the register width of the slave device
  • @param[in] register_width, The I2C slave register width (1-4 bytes)
  • @return void

*/
void user_i2c_set_register_width(I2C_REGISTER_WIDTH width);

/**


  • @brief Reads data from an I2C slave register
  • @param[in] reg_address, Register address to be read
  • @return Contents of the register

*/
uint32_t user_i2c_read_reg(uint32_t reg_address);

/**


  • @brief Writes data to a register address of an I2C slave
  • @param[in] reg_address, Register address to write to
  • @param[in] wr_data, Data to write
  • @return void

*/
void user_i2c_write_reg(uint32_t reg_address, uint32_t wr_data);

/**


  • @brief Writes data to a register address of an I2C slave
  • @param[in] reg_address, Register address to write to
  • @param[in] wr_data, Data to write
  • @param[in] num_bytes, Number of bytes to write
  • @return void

*/
void user_i2c_multi_byte_write(uint32_t reg_address, uint8_t *wr_data, uint32_t num_bytes);

/**


  • @brief Writes data to a register address of an I2C slave
  • @param[in] reg_address, Register address to write to
  • @param[in] rd_data, Array where the data will be read to
  • @param[in] num_bytes, Number of bytes to read
  • @return void

*/
void user_i2c_multi_byte_read(uint32_t reg_address, uint8_t *rd_data, uint32_t num_bytes);

void init_SHT30(void);
void SHT30_Read(void);
#endif //USER_I2C_H
/// @} APP

如图;debug显示温湿度值

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DA14585 读取 SHT30温度计; 的相关文章

  • 华为OD机试真题-5G网络建设-2023年OD统一考试(C卷)

    题目描述 现需要在某城市进行5G网络建设 已经选取N个地点设置5G基站 编号固定为1到N 接下来需要各个基站之间使用光纤进行连接以确保基站能互联互通 不同基站之间架设光纤的成本各不相同 且有些节点之间已经存在光纤相连 请你设计算法 计算出能
  • 华为OD机试真题-攀登者1-2023年OD统一考试(C卷)

    题目描述 攀登者喜欢寻找各种地图 并且尝试攀登到最高的山峰 地图表示为一维数组 数组的索引代表水平位置 数组的高度代表相对海拔高度 其中数组元素0代表地面 例如 0 1 2 4 3 1 0 0 1 2 3 1 2 1 0 代表如下图所示的地
  • 华为OD机试真题-快递员的烦恼-2023年OD统一考试(C卷)

    题目描述 快递公司每日早晨 给每位快递员推送需要送到客户手中的快递以及路线信息 快递员自己又查找了一些客户与客户之间的路线距离信息 请你依据这些信息 给快递员设计一条最短路径 告诉他最短路径的距离 注意 1 不限制快递包裹送到客户手中的顺序
  • 华为OD机试真题-英文输入法-2023年OD统一考试(C卷)

    题目描述 主管期望你来实现英文输入法单词联想功能 需求如下 依据用户输入的单词前缀 从已输入的英文语句中联想出用户想输入的单词 按字典序输出联想到的单词序列 如果联想不到 请输出用户输入的单词前缀 注意 1 英文单词联想时 区分大小写 2
  • 华为OD机试真题-员工派遣-2023年OD统一考试(C卷)

    题目描述 某公司部门需要派遣员工去国外做项目 现在 代号为x的国家和代号为y的国家分别需要cntx名和cnty名员工 部门每个员工有一个员工号 1 2 3 工号连续 从1开始 部长派遣员工的规则 规则1 从 1 k 中选择员工派遣出去 规则
  • 华为OD机试真题-分配土地-2023年OD统一考试(C卷)

    题目描述 从前有个村庄 村民们喜欢在各种田地上插上小旗子 旗子上标识了各种不同的数字 某天集体村民决定将覆盖相同数字的最小矩阵形的土地的分配给为村里做出巨大贡献的村民 请问 此次分配土地 做出贡献的村民中最大会分配多大面积 输入描述 第一行
  • 讲解darknet: ./src/cuda.c:36: check_error: Assertion `0‘ failed.

    目录 讲解darknet src cuda c 36 check error Assertion 0 failed 错误原因 解决方案 1 检查CUDA安装 2 检查GPU驱动程序 3 检查CUDA环境变量 4 编译darknet 5 调试
  • [补题记录] Educational Codeforces Round 160 (Rated for Div. 2)(A~C)

    URL https codeforces com contest 1913 problem D 目录 A Problem 题意 Thought 思路 Code 代码 B Problem 题意 Thought 思路 Code 代码 C Pro
  • VScode配置mingw C语言环境变量

    C语言IDE VScode VScode是个人比较喜欢的一款IDE软件 鄙人曾同时在VScode软件中运行三个终端 开发Python Golang和C语言 下载地址如下 code visualstudio com VScode配置mingw
  • C 库函数 - gmtime()

    描述 C 库函数 struct tm gmtime const time t timer 使用 timer 的值来填充 tm 结构 并用协调世界时 UTC 也被称为格林尼治标准时间 GMT 表示 声明 下面是 gmtime 函数的声明 st
  • C 库函数 - mktime()

    描述 C 库函数 time t mktime struct tm timeptr 把 timeptr 所指向的结构转换为自 1970 年 1 月 1 日以来持续时间的秒数 发生错误时返回 1 声明 下面是 mktime 函数的声明 time
  • C++基础-一维和二维数组详解

    目录 定义 一维数组 二维数组 定义 数组是相同类型的对象序列 它们占据一块连续的内存区 一维数组
  • C/C++编程中的算法实现技巧与案例分析

    C C 编程语言因其高效 灵活和底层的特性 被广大开发者用于实现各种复杂算法 本文将通过10个具体的算法案例 详细探讨C C 在算法实现中的技巧和应用 一 冒泡排序 Bubble Sort 冒泡排序 Bubble Sort 是一种简单的排序
  • C 库函数 - mktime()

    描述 C 库函数 time t mktime struct tm timeptr 把 timeptr 所指向的结构转换为自 1970 年 1 月 1 日以来持续时间的秒数 发生错误时返回 1 声明 下面是 mktime 函数的声明 time
  • 《妙趣横生的算法》(C语言实现)- 第6章 数学趣题(二)

    6 1 连续整数固定和问题 找出任意输入的整数n的全部的连续整数固定和 题目分析 至少要找出两个连续整数的固定和 一个整数的话就是本身了呢 那如何确定这些连续整数呢 想明白了 第一个整数设为a 第二个整数是a 1 假设有m个连续整数 那么第
  • linux 内核同步互斥技术之cache 伪共享和隐含内存屏障

    隐含内存屏障 内核的有些函数隐含内存屏障 1 获取和释放函数 2 中断禁止函数 1 获取和释放函数 获取 acquire 函数包括如下 1 获取锁的函数 锁包括自旋锁 读写自旋锁 互斥锁 信号量和读写信号量 2 smp load acqui
  • linux ARM64 处理器内存屏障

    一 内存类型 ARMv8架构将系统中所有的内存 按照它们的特性 划分成两种 即普通内存和设备内存 并且它们是互斥的 也就是说系统中的某段内存要么是普通内存 要么是设备内存 不能都是 1 普通内存 Normal Memory 普通内存的特性是
  • 华为OD机试真题-部门人力分配-2023年OD统一考试(C卷)

    题目描述 部门在进行需求开发时需要进行人力安排 当前部门需要完成N个需求 需求用requirements 表示 requirements i 表示第i个需求的工作量大小 单位 人月 这部分需求需要在M个月内完成开发 进行人力安排后每个月的人
  • 串口流控(CTS/RTS)使用详解

    1 流控概念 在两个设备正常通信时 由于处理速度不同 就存在这样一个问题 有的快 有的慢 在某些情况下 就可能导致丢失数据的情况 如台式机与单片机之间的通讯 接收端数据缓冲区已满 则此时继续发送来的数据就会丢失 流控制能解决这个问题 当接收
  • 华为OD机试真题-API集群负载统计-Java-OD统一考试(C卷)

    题目描述 某个产品的RESTful API集合部署在服务器集群的多个节点上 近期对客户端访问日志进行了采集 需要统计各个API的访问频次 根据热点信息在服务器节点之间做负载均衡 现在需要实现热点信息统计查询功能 RESTful API的由多

随机推荐

  • POI实现Word文件转PDF

    需求 采用spire doc生成word文件后 需要加一个预览PDF的功能 可以直接采用POI对docx文件进行转换处理 public static void main String args throws Exception String
  • 遗传算法的有趣实践

    源码 先放上我的源码链接 https github com AIjugg Genetic Algorithm git 自己思考加纯手写的代码 有兴趣的同学可以拿去玩玩 前言 生物进化是一个有趣的话题 人是怎么从人猿进化到的人 长颈鹿的脖子为
  • 基于Java SSM+layui+mysql实现的图书借记管理系统源代码+数据库

    介绍 本项目使用的技术栈是SSM layui mysql 服务器使用的是tomcat 其中书籍图片存放的位置需要先在tomcat根目录下conf setting xml中配置虚拟路径 本项目配置的是D upload 完整代码下载地址 图书借
  • java mapper.readtree_java - 杰克逊的readValue和readTree:何时使用哪个? - 堆栈内存溢出...

    我刚刚开始使用Jackson JSON库 杰克逊是一个非常强大的库 但它有一个非常广泛的API 很多事情可以通过多种方式完成 这使得很难在杰克逊找到自己的方式 如何知道什么是正确 最好的做事方式 我为什么要使用这个解决方案 String j
  • 笔试题8:一些常见的转义字符

    a 响铃 b 退格 f 换页 n 换行 r 回车 t 水平制表 v 垂直制表 反斜杠 文号字符 单引号字符 双引号字符 0 空字符 Null ddd 任意字符 三位八进制数 xhh 任意字符二位十进制数
  • 悟空CRM / 72crm-11.0-Spring部署

    目录 悟空CRM部署 悟空CRM目录结构 悟空CRM使用的主要技术栈 使用说明 一 前置环境 二 JDK1 8 Maven3 5安装 三 安装Mysql数据库 四 安装Elasticsearch 6 8 6 五 安装Redis 六 Naco
  • 如何实现Linux系统和Windows系统之间的文件传输

    一 FTP的概念 FTP服务 用来传输文件的协议 FTP是一种上传和下载用的软件 用户可以通过它把自己的PC机与运行FTP协议的服务器相连 访问服务器上的程序和信息 与大多数Internet服务一样 FTP也是一个客户机 服务器系统 用户通
  • 物联网产业到2023年连接数将突破20亿

    导读 随着经济社会数字化转型和智能升级步伐加快 物联网逐渐成为新型基础设施的重要组成部分 近日 工信部等8部门联合印发 物联网新型基础设施建设三年行动计划 2021 2023年 下称 行动计划 明确到2023年底 在国内主要城市初步建成物联
  • web服务器推送技术

    传统模式的 Web 系统以客户端发出请求 服务器端响应的方式工作 不能满足很多现实应用的需求 譬如 监控系统 后台硬件温度 电压发生变化 即时通信系统 其它用户登录 发送信息 即时报价系统 后台数据库内容发生变化 即时信息系统 微博 说说实
  • leetcode -------414. 第三大的数 C语言版本

    目录 题目 解题思路 图解 代码 题目 414 第三大的数 给你一个非空数组 返回此数组中 第三大的数 如果不存在 则返回数组中最大的数 示例 1 输入 3 2 1 输出 1 解释 第三大的数是 1 示例 2 输入 1 2 输出 2 解释
  • STL list使用

    List 容器 list是C 标准模版库 STL Standard Template Library 中的部分内容 实际上 list容器就是一个双向链表 可以高效地进行插入删除元素 使用list容器之前必须加上
  • VMware--配置php debug环境之PHPStudy+VSCode Xdebug php调试

    目录 1 win配置php环境 1 1 配置PHPStudy 1 1 1 下载phpstudy 1 1 2 配置phpstudy 1 1 3 测试phpstudy是否配置完成 1 2 配置环境变量 1 2 1 打开环境变量 添加配置 1 2
  • OpenWrt 学习记录

    OpenWrt 学习记录 ssh setting CodePath review Makefile CURDIR MAKEFILE LIST ssh setting keygen ssh keygen t rsa C hugh win10W
  • error Missing “key“ prop for element in array react/jsx-key

    react遇到一个奇怪的问题 error Missing key prop for element in array react jsx key 检查了jsx中使用map的 都定义了key div otherList map item an
  • matlab遗传算法(GA)详解(一)算法入门

    遗传算法 Genetic Algorithm GA 是模拟达尔文生物进化论的自然选择和遗传学机理的生物进化过程的计算模型 是一种通过模拟自然进化过程搜索最优解 所找到的解是全局最优解 的方法 参数编码 初始群体的设定 适应度函数的设计 遗传
  • C++ 子类继承父类 之 构造函数

    C 子类继承父类 之 构造函数 前面常写点java的代码 对于C 基本的一些概念很模糊了 就当写个小笔记 之后遇到问题肯定还要补充 主要内容 a 子类继承父类写法 b 子类继承父类的构造函数 创建父类F h cpp view plain c
  • Java中Collections类详细用法

    1 sort Collection 方法的使用 含义 对集合进行排序 例 对已知集合c进行排序 public class Practice public static void main String args List c new Arr
  • 游戏开发物理引擎PhysX研究系列:深入学习方法思考

    无论是google还是百度 对于PhysX相关介绍实在是太少了 目前个人感受是最好通过Unity的物理相关设置来猜测PhysX相关接口的细节原理 光看c 代码去理解时 速度不是很快 有时候效果也不一定对的上
  • maven deploy plugin_Maven插件

    在默认的maven工程内默认使用的JDK1 5的版本 将JDK也看成一个项目进行处理 设置JDK的版本保证当前的IDE集成了设置Maven需要的JDK版本 修改JDK版本的方式是在项目的pom文件内使用build标签进行插件的配置 标签 b
  • DA14585 读取 SHT30温度计;

    user sht30 c file user i2c c brief user i2c source file Copyright 2018 Dialog Semiconductor This computer program or com