最新要闻
- 世界观速讯丨《人民日报》炮轰手机预装应用不能删:占内存、鸡肋、广告满天飞
- 【当前热闻】240W闪充卷王!真我GT Neo5即将登场:有两种版本
- 全球动态:TCL华星宣布品牌形象升级:全新Logo正式上线
- 12月汽车投诉榜:丰田包揽前三甲 踩的同一个“坑”
- 世界快资讯:PS5主机千万别再长期竖向放置了!维修人士:会导致APU液金泄露 造成永久损坏
- 当前关注:阿汤哥驾F14爽片《壮志凌云2》惜败!《阿凡达2》成2022年票房冠军 赢麻
- 全球简讯:春节放假7天要调休!除夕火车票明日开抢
- 骁龙8 Gen2首发!高通正式推出卫星通信:3秒发出信息、可实现双向收发
- 每日视讯:Intel怕吗!AMD锐龙7000史上最强核显 这性能不得了
- 世界视讯!被骗好久!宰相刘罗锅真的是一个罗锅吗?1.9米帅男一枚
- 环球视讯!5位退役也未曾飞天的航天员首次公开!他们也是英雄
- 天天精选!在我电脑里 这是唯一的一个360产品
- 存款贬值快一半!土耳其人把游戏当成了救命稻草
- AMD锐龙7000 3D版暴力堆料144MB缓存 微软神助攻:Win11专属优化
- 【环球新视野】大疆2022年之最:有人每天飞5小时 有人一年飞了3万公里
- 每日看点!RX 7900 XT悄然降价:国行回归7399元
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
快资讯:ESP32 I2C 总线主模式通信程序
一、概述
这里主要是记录 ESP32 中进行 I2C 通行的基本程序,也可以说是 I2C 总线驱动程序,当然这里只是作为主模式,从模式我还没需要这个需求,以后有机会贴上。此笔记的主要目的是防止以后写 I2C 通信时,忘记代码而记录的,需要的小伙伴可以收藏一下。
I2C 通信原理在了解程序之前需要先了解 I2C 的通信原理,这里我就不记录了,网上有很多大佬已经完成了这个事,下面是两位大佬的博客,可以参考一下。一文搞懂I2C通信:https://zhuanlan.zhihu.com/p/282949543一文搞懂I2C通信总线:https://blog.csdn.net/m0_38106923/article/details/123673285
I2C总线仲裁机制通过了解 I2C 通信原理后,可以知道 I2C 支持 一主多从和多主多从的通行方式,这里需要注意一下多主多从模式,需要了解一下 I2C 的仲裁机制,有需要的可以看下面两位大佬的博客。I2C总线仲裁机制:https://www.cnblogs.com/yuanqiangfei/p/15781416.htmlI2C总线仲裁机制:https://blog.csdn.net/lpwsw/article/details/121778724
(相关资料图)
I2C 遵循3个机制
“线与”机制:多主机时,总线具有“线与”的逻辑功能,即只要有一个节点发送低电平时,总线上就表现为低电平。
SDA回读机制总线被启动后,多个主机在每发送一个数据位时都要对自己的输出电平进行检测,只要检测的电平与自己发出的电平一致,就会继续占用总线。
低电平优先机制由于线与的存在,当多主机发送时,谁先发送低电平谁就会掌握对总线的控制权。
二、I2C程序分析
一般总线的驱动程序,多数是两个套路,首先初始化,然后完成读写功能即可。
初始化这里的初始化,主要是配置 I2C 的功能定义,见代码分析
esp_err_t esp32_i2c_init(){ // 初始化I2C配置 i2c_config_t i2c_config= { .mode = I2C_MODE_MASTER, // 设置i2c模式 .sda_io_num = I2c_SDA_IO, // 设置SDA引脚 .scl_io_num = I2c_SCL_IO, // 设置SCL引脚 .sda_pullup_en = GPIO_PULLUP_ENABLE, // 设置上拉使能 .scl_pullup_en = GPIO_PULLUP_ENABLE, // 设置上拉使能 .master.clk_speed = I2C_MASTER_FREQ_HZ, // 设置时钟频率400kbit }; // 设置I2C i2c_param_config(I2c_NUM,&i2c_config); // 注册I2C服务及使能 esp_err_t err = i2c_driver_install(I2c_NUM, i2c_config.mode, 0, 0, 0); return err;}
I2C 的读取程序首先看看怎么读取一个字节数据
static esp_err_t i2c_read8(uint8_t dev_addr, uint8_t reg_addr, uint8_t* read_data){ esp_err_t err = 0; /* 写地址 */ i2c_cmd_handle_t cmd = i2c_cmd_link_create(); // 新建操作I2C句柄 i2c_master_start(cmd); // 启动I2C i2c_master_write_byte(cmd, ( TCS34725_address << 1 ) | I2C_MASTER_WRITE, ACK_CHECK_EN); // 发送地址+写+检查ack i2c_master_write_byte(cmd, reg_addr, ACK_CHECK_EN); // 发送ID寄存器地址 i2c_master_stop(cmd); // 关闭发送I2C err = i2c_master_cmd_begin(I2c_NUM, cmd, 1000 / portTICK_RATE_MS); i2c_cmd_link_delete(cmd); /* 读取数据 */ cmd = i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, ( dev_addr << 1 ) | I2C_MASTER_READ, ACK_CHECK_EN); i2c_master_read_byte(cmd, read_data, NACK_VAL); i2c_master_stop(cmd); err = i2c_master_cmd_begin(I2c_NUM, cmd, 1000 / portTICK_RATE_MS); i2c_cmd_link_delete(cmd); return err;}
读取两个字节数据
static esp_err_t i2c_read16(uint8_t dev_addr, uint8_t reg_addr, uint16_t* read_data){ esp_err_t err = 0; uint8_t read_data_h, read_data_l; /* 写地址 */ i2c_cmd_handle_t cmd = i2c_cmd_link_create(); // 新建操作I2C句柄 i2c_master_start(cmd); // 启动I2C i2c_master_write_byte(cmd, ( TCS34725_address << 1 ) | I2C_MASTER_WRITE, ACK_CHECK_EN); // 发送地址+写+检查ack i2c_master_write_byte(cmd, reg_addr, ACK_CHECK_EN); // 发送ID寄存器地址 i2c_master_stop(cmd); // 关闭发送I2C err = i2c_master_cmd_begin(I2c_NUM, cmd, 1000 / portTICK_RATE_MS); i2c_cmd_link_delete(cmd); /* 读取数据 */ cmd = i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, ( dev_addr << 1 ) | I2C_MASTER_READ, ACK_CHECK_EN); i2c_master_read_byte(cmd, &read_data_l, ACK_VAL); i2c_master_read_byte(cmd, &read_data_h, NACK_VAL); i2c_master_stop(cmd); err = i2c_master_cmd_begin(I2c_NUM, cmd, 1000 / portTICK_RATE_MS); i2c_cmd_link_delete(cmd); *read_data = read_data_h << 8 | read_data_l; return err;}
读取多个字节是不是发现像上面这样读取比较麻烦,不利于代码的复用,下面是一个读取函数搞定 I2C 的读取需求
static esp_err_t i2c_read(uint8_t dev_addr, uint8_t* data_rd, size_t size){ esp_err_t err; if (size == 0) { return ESP_OK; } i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, ( dev_addr << 1 ) | I2C_MASTER_READ, ACK_CHECK_EN); if (size > 1) { i2c_master_read(cmd, data_rd, size - 1, ACK_VAL); } i2c_master_read_byte(cmd, data_rd + size - 1, NACK_VAL); i2c_master_stop(cmd); /* I2C 发送函数 */ err = i2c_master_cmd_begin(I2c_NUM, cmd, 1000 / portTICK_RATE_MS); i2c_cmd_link_delete(cmd); return err;}
I2C的写程序写一个字节数据
static esp_err_t i2c_write8(uint8_t dev_addr, uint8_t reg_addr, uint8_t write_data){ esp_err_t err = 0; i2c_cmd_handle_t cmd = i2c_cmd_link_create(); // 新建操作I2C句柄 i2c_master_start(cmd); // 启动I2C i2c_master_write_byte(cmd, ( dev_addr << 1 ) | I2C_MASTER_WRITE, ACK_CHECK_EN); // 发送地址+写+检查ack i2c_master_write_byte(cmd, reg_addr, ACK_CHECK_EN); // 发送ID寄存器地址 i2c_master_write_byte(cmd, write_data, ACK_CHECK_EN); // 将数据写入寄存器中 i2c_master_stop(cmd); // 关闭发送I2C err = i2c_master_cmd_begin(I2c_NUM, cmd, 1000 / portTICK_RATE_MS); i2c_cmd_link_delete(cmd); // 删除句柄 return err;}
写多个字节
static esp_err_t i2c_write(uint8_t dev_addr, uint8_t* write_data, size_t size){ esp_err_t err; i2c_cmd_handle_t cmd = i2c_cmd_link_create(); // 新建操作I2C句柄 i2c_master_start(cmd); // 启动I2C i2c_master_write_byte(cmd, ( dev_addr << 1 ) | I2C_MASTER_WRITE, ACK_CHECK_EN); // 发送地址+写+检查ack i2c_master_write(cmd, write_data, size, ACK_CHECK_EN); // 发送ID寄存器地址 i2c_master_stop(cmd); // 关闭发送I2C err = i2c_master_cmd_begin(I2c_NUM, cmd, 100/portTICK_PERIOD_MS); // I2C 发送函数 i2c_cmd_link_delete(cmd); // 删除句柄 return err;}
三、程序源码
头文件
/** * @file esp32_i2c_drive.h * */#ifndef _ESP32_I2C_DRIVE_H_#define _ESP32_I2C_DRIVE_H_#ifdef __cplusplusextern "C" {#endif/********************* * INCLUDES *********************/#include "driver/i2c.h"/********************* * DEFINES *********************/#define CODE_SIMPLIFY // I2C 驱动代码精简模式// I2C配置#define I2c_SDA_IO (21)#define I2c_SCL_IO (22)#define I2c_NUM (I2C_NUM_0)#define I2C_MASTER_FREQ_HZ (400000)#define ACK_CHECK_EN (0x1) // 主机检查从机的ACK#define ACK_CHECK_DIS (0x0)#define ACK_VAL (0x0)// 主机读取时的应答信号#define NACK_VAL (0x1)/********************** * TYPEDEFS **********************//********************** * GLOBAL PROTOTYPES **********************/esp_err_t esp32_i2c_init();esp_err_t esp32_i2c_write8(uint8_t dev_addr, uint8_t reg_addr, uint8_t write_data);esp_err_t esp32_i2c_read8(uint8_t dev_addr, uint8_t reg_addr, uint8_t* read_data);esp_err_t esp32_i2c_read16(uint8_t dev_addr, uint8_t reg_addr, uint16_t* read_data);// esp_err_t esp32_i2c_write(uint8_t* write_data, size_t size);// esp_err_t esp32_i2c_read(uint8_t* data_rd, size_t size);/********************** * MACROS **********************/#ifdef __cplusplus} /* extern "C" */#endif#endif /* _ESP32_I2C_DRIVE_H_ */
源文件
#include "esp32_i2c_drive.h"#include "TCS34725.h"/***************************************************************文件名 : esp32_i2c_drive.c作者 : jiaozhu版本 : V1.0描述 : esp32_i2c_drive esp32的i2c驱动文件。其他 : 无日志 : 初版 V1.0 2022/12/30***************************************************************//** * @brief 初始化I2C * * @return esp_err_t 初始化成功返回 0 */esp_err_t esp32_i2c_init(){ // 初始化I2C配置 i2c_config_t i2c_config= { .mode = I2C_MODE_MASTER, // 设置i2c模式 .sda_io_num = I2c_SDA_IO, // 设置SDA引脚 .scl_io_num = I2c_SCL_IO, // 设置SCL引脚 .sda_pullup_en = GPIO_PULLUP_ENABLE, // 设置上拉使能 .scl_pullup_en = GPIO_PULLUP_ENABLE, // 设置上拉使能 .master.clk_speed = I2C_MASTER_FREQ_HZ, // 设置时钟频率400kbit }; // 设置I2C i2c_param_config(I2c_NUM,&i2c_config); // 注册I2C服务及使能 esp_err_t err = i2c_driver_install(I2c_NUM, i2c_config.mode, 0, 0, 0); return err;}#if defined(CODE_SIMPLIFY)/** * @brief 通过I2C写入多个数据 * * @param write_data 数据地址,类型为 [寄存器地址] [数据地址] [寄存器地址] [数据地址] ...... * @param size 写入的数据长度 * @return esp_err_t 操作成功返回 0 */static esp_err_t i2c_write(uint8_t dev_addr, uint8_t* write_data, size_t size){ esp_err_t err; i2c_cmd_handle_t cmd = i2c_cmd_link_create(); // 新建操作I2C句柄 i2c_master_start(cmd); // 启动I2C i2c_master_write_byte(cmd, ( dev_addr << 1 ) | I2C_MASTER_WRITE, ACK_CHECK_EN); // 发送地址+写+检查ack i2c_master_write(cmd, write_data, size, ACK_CHECK_EN); // 发送ID寄存器地址 i2c_master_stop(cmd); // 关闭发送I2C err = i2c_master_cmd_begin(I2c_NUM, cmd, 100/portTICK_PERIOD_MS); // I2C 发送函数 i2c_cmd_link_delete(cmd); // 删除句柄 return err;}/** * @brief 通过I2C读取设备数据,但是需要配合 i2c_write 使用才能读取 * * @param data_rd 数据存储地址 * @param size 需要读取的数据长度 * @return esp_err_t 操作成功返回 0 */static esp_err_t i2c_read(uint8_t dev_addr, uint8_t* data_rd, size_t size){ esp_err_t err; if (size == 0) { return ESP_OK; } i2c_cmd_handle_t cmd = i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, ( dev_addr << 1 ) | I2C_MASTER_READ, ACK_CHECK_EN); if (size > 1) { i2c_master_read(cmd, data_rd, size - 1, ACK_VAL); } i2c_master_read_byte(cmd, data_rd + size - 1, NACK_VAL); i2c_master_stop(cmd); /* I2C 发送函数 */ err = i2c_master_cmd_begin(I2c_NUM, cmd, 1000 / portTICK_RATE_MS); i2c_cmd_link_delete(cmd); return err;}#else/** * @brief 往 I2C 中写入一个8位的数据 * * @param dev_addr 设备地址 * @param reg_addr 寄存机地址 * @param write_data 需要写入的数据 * @return esp_err_t 无错误时返回 0 */static esp_err_t i2c_write8(uint8_t dev_addr, uint8_t reg_addr, uint8_t write_data){ esp_err_t err = 0; i2c_cmd_handle_t cmd = i2c_cmd_link_create(); // 新建操作I2C句柄 i2c_master_start(cmd); // 启动I2C i2c_master_write_byte(cmd, ( dev_addr << 1 ) | I2C_MASTER_WRITE, ACK_CHECK_EN); // 发送地址+写+检查ack i2c_master_write_byte(cmd, reg_addr, ACK_CHECK_EN); // 发送ID寄存器地址 i2c_master_write_byte(cmd, write_data, ACK_CHECK_EN); // 将数据写入寄存器中 i2c_master_stop(cmd); // 关闭发送I2C err = i2c_master_cmd_begin(I2c_NUM, cmd, 1000 / portTICK_RATE_MS); i2c_cmd_link_delete(cmd); // 删除句柄 return err;}/** * @brief 读取一个8位的数据 * * @param dev_addr 设备地址 * @param reg_addr 寄存器地址 * @param read_data 数据存储地址 * @return esp_err_t 无错误时返回 0 */static esp_err_t i2c_read8(uint8_t dev_addr, uint8_t reg_addr, uint8_t* read_data){ esp_err_t err = 0; /* 写地址 */ i2c_cmd_handle_t cmd = i2c_cmd_link_create(); // 新建操作I2C句柄 i2c_master_start(cmd); // 启动I2C i2c_master_write_byte(cmd, ( TCS34725_address << 1 ) | I2C_MASTER_WRITE, ACK_CHECK_EN); // 发送地址+写+检查ack i2c_master_write_byte(cmd, reg_addr, ACK_CHECK_EN); // 发送ID寄存器地址 i2c_master_stop(cmd); // 关闭发送I2C err = i2c_master_cmd_begin(I2c_NUM, cmd, 1000 / portTICK_RATE_MS); i2c_cmd_link_delete(cmd); /* 读取数据 */ cmd = i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, ( dev_addr << 1 ) | I2C_MASTER_READ, ACK_CHECK_EN); i2c_master_read_byte(cmd, read_data, NACK_VAL); i2c_master_stop(cmd); err = i2c_master_cmd_begin(I2c_NUM, cmd, 1000 / portTICK_RATE_MS); i2c_cmd_link_delete(cmd); return err;}/** * @brief 读取一个16位的数据 * * @param dev_addr 设备地址 * @param reg_addr 寄存器地址 * @param read_data 数据存储地址 * @return esp_err_t 无错误时返回 0 */static esp_err_t i2c_read16(uint8_t dev_addr, uint8_t reg_addr, uint16_t* read_data){ esp_err_t err = 0; uint8_t read_data_h, read_data_l; /* 写地址 */ i2c_cmd_handle_t cmd = i2c_cmd_link_create(); // 新建操作I2C句柄 i2c_master_start(cmd); // 启动I2C i2c_master_write_byte(cmd, ( TCS34725_address << 1 ) | I2C_MASTER_WRITE, ACK_CHECK_EN); // 发送地址+写+检查ack i2c_master_write_byte(cmd, reg_addr, ACK_CHECK_EN); // 发送ID寄存器地址 i2c_master_stop(cmd); // 关闭发送I2C err = i2c_master_cmd_begin(I2c_NUM, cmd, 1000 / portTICK_RATE_MS); i2c_cmd_link_delete(cmd); /* 读取数据 */ cmd = i2c_cmd_link_create(); i2c_master_start(cmd); i2c_master_write_byte(cmd, ( dev_addr << 1 ) | I2C_MASTER_READ, ACK_CHECK_EN); i2c_master_read_byte(cmd, &read_data_l, ACK_VAL); i2c_master_read_byte(cmd, &read_data_h, NACK_VAL); i2c_master_stop(cmd); err = i2c_master_cmd_begin(I2c_NUM, cmd, 1000 / portTICK_RATE_MS); i2c_cmd_link_delete(cmd); *read_data = read_data_h << 8 | read_data_l; return err;}#endifesp_err_t esp32_i2c_write8(uint8_t dev_addr, uint8_t reg_addr, uint8_t write_data){#if defined(CODE_SIMPLIFY) uint8_t write_buf[2]; write_buf[0] = reg_addr; write_buf[1] = write_data; return i2c_write(dev_addr, write_buf, 2);#else return i2c_write8(dev_addr, reg_addr, write_data);#endif}esp_err_t esp32_i2c_read8(uint8_t dev_addr, uint8_t reg_addr, uint8_t* read_data){#if defined(CODE_SIMPLIFY) esp_err_t err = 0; err = i2c_write(dev_addr, ®_addr, 1); err = i2c_read(dev_addr, read_data, 1); return err;#else return i2c_read8(dev_addr, reg_addr, read_data);#endif}esp_err_t esp32_i2c_read16(uint8_t dev_addr, uint8_t reg_addr, uint16_t* read_data){#if defined(CODE_SIMPLIFY) uint8_t buf[2]; esp_err_t err = 0; err = i2c_write(dev_addr, ®_addr, 1); err = i2c_read(dev_addr, buf, 2); *read_data = buf[1] << 8 | buf[0]; return err;#else return i2c_read16(dev_addr, reg_addr, read_data);#endif}
注意:到此笔记已经结束了,上面程序各位可以直接拿去使用,但是拒绝商用,出现任何问题概不负责。
参考链接
一文搞懂I2C通信:https://zhuanlan.zhihu.com/p/282949543一文搞懂I2C通信总线:https://blog.csdn.net/m0_38106923/article/details/123673285I2C总线仲裁机制:https://www.cnblogs.com/yuanqiangfei/p/15781416.htmlI2C总线仲裁机制:https://blog.csdn.net/lpwsw/article/details/121778724
-
天天观点:创新的概念、设计和生产鞋类和鞋类软件丨Jevero及Botcha 3D功能简介
Design&Develop始于1990年,将创意塑造成鞋子。 我们始终使用和实施新的创新概念、设计和生产鞋类和鞋类软件
来源: 快资讯:ESP32 I2C 总线主模式通信程序
天天观点:创新的概念、设计和生产鞋类和鞋类软件丨Jevero及Botcha 3D功能简介
学习笔记——书城项目第五阶段之购物车数量的修改、精度问题的处理
世界观速讯丨《人民日报》炮轰手机预装应用不能删:占内存、鸡肋、广告满天飞
【当前热闻】240W闪充卷王!真我GT Neo5即将登场:有两种版本
全球动态:TCL华星宣布品牌形象升级:全新Logo正式上线
12月汽车投诉榜:丰田包揽前三甲 踩的同一个“坑”
世界快资讯:PS5主机千万别再长期竖向放置了!维修人士:会导致APU液金泄露 造成永久损坏
当前关注:阿汤哥驾F14爽片《壮志凌云2》惜败!《阿凡达2》成2022年票房冠军 赢麻
快资讯丨回顾2022
全球简讯:春节放假7天要调休!除夕火车票明日开抢
骁龙8 Gen2首发!高通正式推出卫星通信:3秒发出信息、可实现双向收发
每日视讯:Intel怕吗!AMD锐龙7000史上最强核显 这性能不得了
好用的工具
世界最资讯丨Python中的注释和input函数的使用
世界视讯!被骗好久!宰相刘罗锅真的是一个罗锅吗?1.9米帅男一枚
环球视讯!5位退役也未曾飞天的航天员首次公开!他们也是英雄
天天精选!在我电脑里 这是唯一的一个360产品
存款贬值快一半!土耳其人把游戏当成了救命稻草
顺序结构及if选择结构
环球今亮点!左偏树 学习笔记
亲测有效! Scrutiny 网站SEO检测及优化工具 V12.6.1 for mac
全球聚焦:创建型模式——前言
continue跳過循環(skippaart程序),接受設定的合法分數來進行平均分求值,并展現最高分,最低分
AMD锐龙7000 3D版暴力堆料144MB缓存 微软神助攻:Win11专属优化
【环球新视野】大疆2022年之最:有人每天飞5小时 有人一年飞了3万公里
正点原子FSMC控制TFT-LCD的地址偏移解读
【全球新视野】linux 下 mongodb 安装
PG中级证书到手,PostgreSQL(PG)认证
每日看点!RX 7900 XT悄然降价:国行回归7399元
【环球播资讯】AMD锐龙7000送上史上最强核显!频率3GHz 超越所有独显
世界播报:上海一家网吧春节促销:300元包20天 玩家签“生死状”
头条:风靡全国后 老头乐要席卷世界了
【天天报资讯】AcWing.1175 最大半连通子图
如何给所有的 await async 函数添加try/catch?
世界微资讯!mybatis使用postgresql中的jsonb数据类型
世界报道:2022年新能源车销量出炉:每卖出3辆车就有1辆新能源
全球动态:高分国漫《中国奇谭》B站播放量破1800万 网友:碾压《三体》动画
今年上映!国产航空大片《长空之王》新海报:尖端战机亮眼
超过6万台!国产龙芯CPU采购大单拿到手软
四川女子回娘家屋旁偶遇大熊猫直言激动 并不怕人:圆滚滚超可爱
学习笔记——书城项目第五阶段之购物项加号、购物项减号
【世界快播报】记一次2022某地HVV中的逆向分析
全球看点:2022年押注特斯拉亏大了!50支重仓基金惨不忍睹
环球视讯!加州新法实施 特斯拉仍宣传“全自动驾驶”:或被罚数千万美元
当前资讯!15分钟出结果 快速检测试剂盒:25份到手74.9元
司机酒后睡着 原地踩油门致车辆起火:烧成废墟
焦点播报:奇瑞营销公司总经理:自家2.0T发动机能与奔驰、宝马媲美
docker network
比亚迪高端品牌“仰望”发布 超级技术叩开百万级新能源市场大门
观察:首次集成AI引擎 AMD对锐龙7000移动版极其自信:超越苹果不是问题
新年微信红包封面领取攻略 谁还没有几个红包皮呢?
大桶更尽兴 溜溜梅六味青梅宝藏桶480g 25.1元
世界快看点丨【甘特图软件部件】上海道宁与DlhSoft助力您的Windows与移动应用程序开发
世界百事通!学习笔记——CommonResult工具、书城项目第五阶段(清空购物车、删除购物项、对数量的修改)
环球热点评!百万级U8、U9双双亮相!比亚迪已注册多个仰望品牌商标
环球资讯:笔记本显示屏变天了!OLED面板大爆发:加速淘汰LCD
一加11在京东抢购一空!3999元定价震撼整个手机行业
七彩虹RTX 4070 Ti 6499元起开卖:兔年惊喜礼盒 不加1分钱
副业不小心干成了主业!新东方在线拟更名为东方甄选控股有限公司
java中的多线程
2022 最新版 JDK 17 下载与安装 步骤演示 (图示版)
世界热讯:【验证码逆向专栏】某验四代滑块验证码逆向分析
世界讯息:Dubbo 3 端口协议复用
水里也能开!仰望U8核心系统支持IP68防水:可浮水行驶
百万级纯电性能超跑!比亚迪仰望U9来了:零百加速2秒级、电动蝴蝶门
对标比亚迪仰望U8 东风猛士M-Terrain官图发布:超级硬汉
时隔18年再出续篇!经典老片《神话》续集定名《传说》
144MB缓存性能无解!Zen4架构AMD锐龙9 7950X3D比酷睿i9-13900K快了52%
每日快看:浅谈多项式与生成函数
hive调优之参数设置
如何接入畅联云平台管理物联网设备?
【速看料】IM通讯协议专题学习(七):手把手教你如何在NodeJS中从零使用Protobuf
荣耀Magic 5系列镜头模组曝光:经典圆形设计、配100X长焦
每日观点:地表最快!realme宣布首发量产240W满级秒充:充满不到10分钟
李国庆称腾讯京东有大公司病 当当就是失败的案例
98年哥哥返乡给15个弟妹买一车礼物:塞满整个后备箱
荣耀MagicOS获新浪2022科技风云榜年度智能操作系统奖
统计B站番剧真实评分
基础可视化图表之分组条形图
锐龙9 6900HX加持!魔方M600迷你主机图赏
【世界报资讯】便宜还好用:绿联iPhone全系钢化膜冲量3.6元/张
世界速看:折叠屏我只认OPPO Find N2:安卓阵营独一无二
环球聚焦:宝马展示i Vision Dee概念汽车:可变换车身颜色 有科幻味了
全球视点!员工:不怕大家拿任何手机跟一加11比精致度和质感
天天消息!RHEL/CentOS yum 源问题
记 对接拼多多官方代报 辽宁电子口岸联达通客户端 ic卡加签版
天天视讯!透过现象看本质,我找到了Netty粘包与半包的这几种解决方案。
天天快资讯丨天府可乐因破产传闻销量暴增 民族品牌不会轻易垮:请理性消费
144MB暴力缓存!AMD锐龙7000 3D缓存版杀来:16核心神奇120W
马斯克最“惨” 福布斯:2022年美国亿万富翁身价创纪录暴跌
全球即时看!独立包装、现货速发:掌护快速检测试剂盒2.9元/份
世界微头条丨李斌发蔚来全员信:列举8大问题 有同行比我们更出色
全球热议:比亚迪宋PLUS上月热销50006台:接棒哈弗H6成新一代神车
环球速看:从菜鸟到团队协同大神:产品经理工具技能修炼
当前聚焦:DTALK直播预约 | 金融行业嘉宾分享:金融机构数据治理实践路径
视焦点讯!ZooKeeper 避坑实践:SnapCount 设置不合理导致磁盘爆满,服务不可用
一纸死亡威胁:让安卓最良心的PS2模拟器凉凉了
世界讯息:年底发福利 马自达推出全系购车优惠:CX-5置换1万补贴
环球头条:AMD正式发布锐龙7000三款新U:一键能效暴涨47%!就看价格了