TCA9548A I2C 多路复用器 Arduino 使用相同地址 I2C 设备

news2025/1/26 15:40:14

在本教程中,我们将学习如何将 TCA9548A I2C 多路复用器与 Arduino 结合使用。我们将讨论如何通过整合硬件解决方案来使用多个具有相同地址的 Arduino 的 I2C 设备。通过使用 TCA9548A I2C 多路复用器,我们将能够增加 Arduino 的 I2C 地址范围,并能够连接 8 个具有相同地址的 I2C 设备。

TCA9548A 是一款 1 至 8 I2C 多路复用器。通过将设备连接到多路复用器并选择要通过多路复用器进行通信的设备,您可以在单个微控制器上使用最多 8 个具有相同地址的 I2C 从设备。

Arduino I2C 通信引脚

对于 I2C 通信,不同的 Arduino 板有不同的引脚专用为 SDA 和 SCL 引脚。下面的列表显示了各种板上的这些引脚号。

  1. 在 Arduino UNO 中,引脚 A4 = SDA,引脚 A5 = SCL
  2. 对于 Arduino Mega2560,引脚 20 = SDA,引脚 21 = SCL
  3. 在 Arduino Leonardo 中,引脚 2 = SDA,引脚 3 = SCL
  4. 对于 Arduino Due,引脚 20 = SDA,引脚 21 = SCL、SDA1、SCL。

在 Arduino 中使用多个不同地址从属 I2C 设备

在本节中,我们将首先使用默认的 I2C 引脚将三个不同的 I2C 设备(OLED、SHT32(温度传感器)和 BME280(温度传感器))与 Arduino 连接。然后我们将对我们的板进行编程以运行 I2C 扫描仪。

所需组件

  1. Arduino
  2. SSD1306 OLED显示屏
  3. BME280传感器
  4. SHT31传感器
  5. 面包板
  6. 连接线

Arduino 与 OLED、BME280 和 SHT31 的接口

带有 SHT31、BME280 和 OLED 硬件的 Arduino

让我们看看如何将 Arduino 与 OLED、BME280 模块和 SHT31 模块连接在一起。我们将使用一条公共 I2C 线来连接所有设备。Arduino 将充当主机,BME280 传感器、SHT31 传感器和 OLED 将充当从机。

我们使用的四个设备之间的连接如下表所示。

ArduinoSSD1306 OLED显示屏BME280SHT31
3.3VVCCVCCVCC
A4SDASDASDA
A5SCLSCLSCL
接地GNDGNDGND

我们使用了上表中指定的相同连接。

Arduino I2C 扫描仪 Arduino 草图

每个 I2C 设备都有一个与其关联的地址。Arduino 使用该地址通过 I2C 协议与从机进行通信。

现在复制此代码并将其上传到您的开发板以及已连接的所有 I2C 设备。

此代码将扫描与 Arduino 连接的任何 I2C 设备,并指定串行终端中具有地址的设备数量。

#include <Wire.h>
 
void setup() {
  Wire.begin();
  Serial.begin(115200);
  Serial.println("\nI2C Scanner");
    byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  nDevices = 0;
  for(address = 1; address < 127; address++ ) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address<16) {
        Serial.print("0");
      }
      Serial.println(address,HEX);
      nDevices++;
    }
    else if (error==4) {
      Serial.print("Unknown error at address 0x");
      if (address<16) {
        Serial.print("0");
      }
      Serial.println(address,HEX);
    }    
  }
  if (nDevices == 0) {
    Serial.println("No I2C devices found\n");
  }
  else {
    Serial.println("done\n");
  }
  delay(5000);  
  Serial.print("i2c devices found:");
  Serial.println(nDevices); 
}
 
void loop() {
      
}

Arduino I2C扫描仪串口终端

I2C 扫描器识别出 3 个连接到 I2C 接口的设备。OLED显示屏的I2C地址是0x3C,SHT31是0x44,BME280是0x76。

由于这三个 I2C 设备都有不同的地址,因此可以共享相同的 I2C 总线。

Arduino 在 OLED 上显示 BME280 和 SHT31 温度读数

从 I2C 扫描仪中可以看出,BME280、SHT31 和 OLED 具有不同的 I2C 地址,因此可以共享相同的 I2C 总线。让我们向您展示一个 Arduino 草图,它可以访问这两个传感器的温度读数并将其显示在 OLED 上。

我们将使用 Arduino IDE 对 Arduino 开发板进行编程。因此,您应该拥有最新版本的 Arduino IDE。

Arduino 多个具有不同地址的 I2C 设备 在 OLED 上显示温度

在 Arduino IDE 中安装 SSD1306 OLED 库

要在我们的项目中使用 OLED 显示屏,我们必须在 Arduino IDE 中安装 Adafruit SSD 1306 库。按照以下步骤即可成功安装。

打开 Arduino IDE 并单击 Sketch > Library > Manage Libraries。将打开以下窗口。

搜索库 Arduino IDE

在搜索选项卡中输入“SSD1306”并安装 Adafruit SSD1306 OLED 库。

安装OLED SSD1306库Arduino IDE

安装 BME280 Arduino 库

当我们将 BME280 传感器与 Arduino 连接时。因此,我们必须将 BME280 库安装到我们的模块中。该项目需要两个库:

  1. Adafruit_BME280 库
  2. Adafruit_传感器库

我们将使用 Arduino IDE 中的库管理器来安装最新版本的库。打开 Arduino IDE 并转到 Sketch > Include Libraries > Manage Libraries。 在搜索栏中输入 Adafruit BME280 库名称并安装它们。

Adafruit BME280 库 Arduino IDE

打开 Arduino IDE 并转到 Sketch > Include Libraries > Manage Libraries。 在搜索栏中输入 Adafruit 统一传感器库名称并安装。

Adafruit 统一传感器库安装

安装SHT31 Arduino库

由于我们将 SHT31 传感器模块与 Arduino 连接,因此我们必须安装库来访问传感器数据。该项目需要两个库:

  1. 阿达水果 SHT31
  2. Adafruit 总线IO

我们将使用 Arduino IDE 中的库管理器来安装最新版本的库。打开 Arduino IDE 并转到 Sketch > Include Libraries > Manage Libraries。 在搜索栏中输入 Adafruit SHT31 并安装最新版本。

安装 Adafruit SHT31 库

在搜索栏中输入 Adafruit BusIO 并安装它。

安装 Adafruit BusIO 库

Arduino 在 OLED 代码上显示 BME280 和 SHT31 温度读数

代码如何运作?

现在,让我们了解代码的每个部分是如何工作的。

代码首先包含代码正常功能所需的所有必要库。Wire.h 将允许我们通过 I2C 协议进行通信。其余的库是我们刚刚安装的用于 BME280 传感器、SHT31 传感器和 OLED 功能的库。

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include <Adafruit_SHT31.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

然后,我们通过将其设置在默认 I2C GPIO 引脚上来定义名为“bme”的 Adafruit_BME280 对象,并创建名为“sht31”的 Adafruit_SHT31 对象。

Adafruit_BME280 bme; 
Adafruit_SHT31 sht31 = Adafruit_SHT31();

现在,我们创建另一个名为 display 的对象,它将处理 OLED 显示。此外,通过将参数传递给 Adafruit_SSD1306() 函数来定义 OLED 显示屏的尺寸。

Adafruit_SSD1306 display = Adafruit_SSD1306(128, 32, &Wire);
setup()

打开串口通讯,波特率为115200。

Serial.begin(115200);

通过调用显示对象的 begin() 方法来初始化 OLED 显示。

display.begin(SSD1306_SWITCHCAPVCC, 0x3C); 

接下来,我们将通过调用clearDisplay()函数来清除OLED屏幕。此外,我们使用 setTextColor() 函数设置文本的颜色并传递 WHITE 作为参数。如果我们有深色背景,我们将以白色显示文本,如果我们有明亮背景,那么我们将以黑色显示文本。另外,我们使用 setTextSize() 设置字体大小。

  display.clearDisplay();
  display.display();
  display.setTextSize(1);
  display.setTextColor(WHITE);

然后,BME280 传感器使用进行初始化,如果发生故障,串行监视器上会打印一条错误消息。同样,SHT31 传感器也被初始化。如果传感器初始化不成功,串行监视器上将打印相关消息。

  bool status;
  status = bme.begin(0x76);  
  if (!status) {
    Serial.println("Could not find a valid BME280 sensor, check wiring!");
    while (1);
  }

  if (! sht31.begin(0x44)) {   
    Serial.println("Check circuit. SHT31 not found!");
    while (1) delay(1);
  }
loop()

在loop()函数中,我们分别使用bme.readTemperature()和sht31.readTemperature获取BME280和SHT31温度读数。这些信息每秒都会显示在 Arduino 串行监视器和 OLED 上。

void loop() { 
  
  display.setCursor(0,0);
  
  Serial.print("Temperature BME280 = "); Serial.print(bme.readTemperature()); Serial.println(" °C");
  display.print("Temperature: "); display.print(bme.readTemperature()); display.println(" C");

  display.setCursor(0,20);
   
  Serial.print("Temperature SHT31 = "); Serial.print(sht31.readTemperature()); Serial.println(" °C");
  display.print("Temperature: "); display.print(sht31.readTemperature()); display.println(" C");

  Serial.println();
  display.display();
  display.clearDisplay();

  delay(1000);
}

示范

要查看上述代码的演示,请将代码上传到 Arduino。但是,在上传代码之前,请确保从 Tools  >  Board 选择 Arduino 板,并从Tools  >  Port选择 Arduino 板连接的正确 COM 端口 。

一旦代码成功上传到开发板,OLED 将开始显示两个传感器的温度读数,如下所示:

Arduino 具有不同地址的多个 I2C 设备 在 OLED 演示上显示温度

此外,您还可以在Arduino串口终端中查看温度读数。记得将波特率设置为115200。

Arduino 多个不同地址的I2C设备 显示温度终端

串行监视器

TCA9548A 与 Arduino 具有相同地址的多个 I2C 设备

在上一节中,我们能够在 Arduino 的相同 I2C 引脚上连接三个不同的 I2C 设备。这是因为 Arduino 能够通过其唯一的地址来识别它们。但是,当我们想用Arduino连接多个设备进行I2C通信,但它们的地址相同时,会发生什么情况呢?例如,两个BME280传感器与Arduino连接或两个OLED与Arduino连接。

要在 Arduino 上使用相同的 I2C 设备,我们要么必须更改设备的 I2C 地址,要么使用 I2C 多路复用器。然而,更改设备的地址并不是那么简单,并且它只允许在同一 I2C 总线上使用有限的设备。因此我们可以使用多路复用器,例如。TCA9548A 允许最多 8 个具有相同地址的设备连接到同一 I2C 总线。因此,它的工作电压范围为 3-5.5 伏,因此可以方便地与具有 3.3/5V 逻辑引脚的微控制器一起使用。

下图显示了 TCA9548A 多路复用器,我们将其与具有相同地址的 I2C 设备一起使用,以便与 Arduino 进行通信。

TCA9548A 1 至 8 I2C 多路复用器 IC

TCA9548A 多路复用器

它是一种电子开关设备,使用户能够将多个 I2C 总线与其自身连接。所有具有相同地址的从站需要连接到不同的总线。为了与从机通信,连接到从机的总线由用户切换,然后寻址。

TCA9548A 多路复用器引脚分配

下图显示了用作 I2C 扩展器的 TCA9548A 多路复用器的引脚排列。

TCA9748A 多路复用器引脚分配

  • Vin:这是为模块提供电源的引脚。将Arduino的3.3V或5V引脚与此引脚连接。
  • GND:这是提供公共接地的引脚。
  • SDA:这是与主设备连接的I2C串行数据引脚。
  • SCL:这是与主设备连接的I2C串行时钟引脚。
  • RST:该引脚负责复位多路复用器。
  • A0、A1、A2:这三个引脚用于更改多路复用器的 I2C 地址。默认情况下,当这些引脚未连接时,其地址为 0x70。借助该模块,单个 I2C 地址最多可扩展为 8 个 I2C 地址。
  • SDx、SCx:这些是外部 I2C 通道通道 0 至通道 7。对于具有相同地址的每个 I2C 设备,将 SDA 引脚与 SDx 连接,将 SCL 引脚与 SCx 连接。

Arduino 使用 TCA9548A 多路复用器在 OLED 上显示文本

让我们向您展示如何使用 TCA9548A 多路复用器通过 Arduino 连接和编程具有相同地址 0x3C 的两个 OLED。我们需要以下组件:

所需组件

  1. Arduino
  2. 两个 SSD1306 OLED
  3. TCA9548A 多路复用器
  4. 四个 10k 欧姆上拉电阻
  5. 面包板
  6. 连接线

Arduino 与带有 OLED 的 TCA9548A 多路复用器的接口

让我们向您展示如何将 TCA9548A 多路复用器与 Arduino 和 OLED 连接。Arduino 将充当主机,OLED 将充当从机。

按照下面的示意图连接所有设备。

带有 TCA9748A 多路复用器和 OLED 的 Arduino 原理图

下表显示了 TCA9548A 与 Arduino 和两个 OLED 连接的引脚。

TCA9548A与其余设备的连接
vinArduino 的 3.3V,两个 OLED 的 VCC
GNDArduino 的 GND、两个 OLED 的 GND
SDAArduino的A4
SCLArduino的A5
SD0OLED1 的 SDA 带 10k 欧姆上拉电阻
SC0OLED1 的 SCL 带 10k 欧姆上拉电阻
SD1OLED2 的 SDA 带 10k 欧姆上拉电阻
SC1OLED2 的 SCL 带 10k 欧姆上拉电阻

带有 TCA9748A 多路复用器和 OLED 硬件的 Arduino

Arduino 使用 TCA9548A 多路复用器代码在 OLED 上显示文本

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

Adafruit_SSD1306 display = Adafruit_SSD1306(128, 32, &Wire, -1);

void TCA9548A(uint8_t bus) //activate particular channel
{
  Wire.beginTransmission(0x70);  // TCA9548A address is 0x70
  Wire.write(1 << bus);          // send byte to select bus
  Wire.endTransmission();
}

void setup()
{
  Serial.begin(115200);
  Wire.begin();
  delay(100);

  TCA9548A(0);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(20, 10);
  display.setTextColor(WHITE);
  display.println("OLED #1");
  display.display(); 

  TCA9548A(1);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(20, 10);
  display.setTextColor(WHITE);
  display.println("OLED #2");
  display.display(); 

}

void loop() {
  
}

该代码如何运作?

现在,让我们了解代码的每个部分是如何工作的。

代码首先包含正确代码功能所需的所有必要库。Wire.h 将允许我们通过 I2C 协议进行通信,Adafruit_GFX.h 和 Adafruit_SSD1306.h 是 OLED 库。

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

现在,我们创建一个名为 display 的对象,它将处理 OLED 显示。此外,通过将参数传递给 Adafruit_SSD1306() 函数来定义 OLED 显示屏的尺寸。

Adafruit_SSD1306 display = Adafruit_SSD1306(128, 32, &Wire, -1);

接下来,我们为 TCA9548A() 定义一个函数,它接受一个参数,即 I2C 总线通道。每当我们想要激活特定的 I2C 通道时就会调用此函数。

void TCA9548A(uint8_t bus) 
{
  Wire.beginTransmission(0x70);  // TCA9548A address is 0x70
  Wire.write(1 << bus);          // send byte to select bus
  Wire.endTransmission();
}
设置()

打开串口通信,波特率115200,发起I2C通信。

  Serial.begin(115200);
  Wire.begin();

接下来,我们通过调用 TCA9548A() 函数来激活 I2C 通道 0,并将 0 作为其中的参数传递。我们的第一个 OLED 与 I2C 通道 0 连接。之后我们初始化 OLED 显示、清屏、设置文本颜色、设置字体大小和光标位置。然后我们在显示屏上打印文本“OLED #1”。

  TCA9548A(0);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(20, 10);
  display.setTextColor(WHITE);
  display.println("OLED #1");
  display.display(); 

接下来,我们通过调用 TCA9548A() 函数作为传递 1 作为其中的参数来激活 I2C 通道 1。我们的第二个OLED与I2C通道1连接。之后我们初始化OLED显示屏,清除屏幕,设置文本颜色,设置字体大小和光标位置。然后我们在显示屏上打印文本“OLED #2”。

TCA9548A(1);
  display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
  display.clearDisplay();
  display.setTextSize(2);
  display.setCursor(20, 10);
  display.setTextColor(WHITE);
  display.println("OLED #2");
  display.display(); 

示范

要查看上述代码的演示,请将代码上传到 Arduino。但是,在上传代码之前,请确保从 Tools  >  Board 选择 Arduino 板,并从Tools  >  Port选择 Arduino 板连接的正确 COM 端口 。

一旦代码成功上传到开发板,两个 OLED 将开始显示各自的文本,如下所示:

带有 TCA9748A 多路复用器和 OLED 演示的 Arduino

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1279191.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

前端打包添加前缀

vue2添加前缀 router的base加上前缀 export default new Router({mode: history, // 去掉url中的#base: privateDeployUrl, // 这里加上前缀scrollBehavior: () > ({y: 0}),routes: constantRoutes })vue.config.js&#xff0c;publicPath属性加上前缀 publicPath: proces…

组件化编程

hello&#xff0c;我是小索奇&#xff0c;精心制作的Vue系列持续发放&#xff0c;涵盖大量的经验和示例&#xff0c;如果对您有用&#xff0c;可以点赞收藏哈~ 组件化编程 组件是什么&#xff1f; 一句话概括就是&#xff1a;实现特定功能的模块化代码单元 vm就是大哥&#xff…

Leetcode刷题详解——乘积最大子数组

1. 题目链接&#xff1a;152. 乘积最大子数组 2. 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;请你找出数组中乘积最大的非空连续子数组&#xff08;该子数组中至少包含一个数字&#xff09;&#xff0c;并返回该子数组所对应的乘积。 测试用例的答案是一个 32-位…

2023-12-03 LeetCode每日一题(可获得的最大点数)

2023-12-03每日一题 一、题目编号 1423. 可获得的最大点数二、题目链接 点击跳转到题目位置 三、题目描述 几张卡牌 排成一行&#xff0c;每张卡牌都有一个对应的点数。点数由整数数组 cardPoints 给出。 每次行动&#xff0c;你可以从行的开头或者末尾拿一张卡牌&#x…

[HTB][Sherlocks] Meerkat

作为一家快速发展的初创公司&#xff0c;Forela一直在利用商业管理平台。不幸的是&#xff0c;我们的文档很少&#xff0c;而且我们的管理员也不是最有安全意识的。作为我们的新安全提供商&#xff0c;我们希望您查看我们导出的一些PCAP和日志数据&#xff0c;以确认我们是否已…

Nginx实现多虚拟主机配置

Nginx实现多虚拟主机配置 Nginx为什么要进行多虚拟主机配置呢&#xff1f;what&#xff1f; Nginx实现多虚拟主机配置的主要原因是&#xff0c;一个服务器可能会承载多个网站或应用程序&#xff0c;这些网站或应用程序需要使用不同的域名或IP地址来进行访问。如果只有一个虚拟…

代码随想录第二十二天(一刷C语言)|组合总数电话号码的字母组合

创作目的&#xff1a;为了方便自己后续复习重点&#xff0c;以及养成写博客的习惯。 一、组合总数 思路&#xff1a;参考carl文档和视频 1、需要一维数组path来存放符合条件的结果&#xff0c;二维数组result来存放结果集。 2、targetSum 目标和&#xff0c;也就是题目中的…

Java基础-----Date类及其相关类(一)

文章目录 1. Date类1.1 简介1.2 构造方法1.3 主要方法 2. DateFormat 类2.1 简介2.2 实例化方式一&#xff1a;通过静态方法的调用2.2 实例化方式二&#xff1a;通过创建子类对象 3. Calendar类4. GregorianCalendar 1. Date类 1.1 简介 java.util.Date:表示指定的时间信息&a…

市面上的AR眼镜:优缺点分析

AR眼镜是近年来备受关注的科技产品之一。它通过将虚拟信息叠加到现实世界中&#xff0c;为用户提供全新的视觉体验。目前&#xff0c;市面上的AR眼镜主要分为两类&#xff1a;消费级AR眼镜和企业级AR眼镜。 消费级AR眼镜 消费级AR眼镜的特点是轻便、时尚、易于佩戴&#xff0…

DOM 事件的注册和移除

前端面试大全DOM 事件的注册和移除 &#x1f31f;经典真题 &#x1f31f;DOM 注册事件 HTML 元素中注册事件 DOM0 级方式注册事件 DOM2 级方式注册事件 &#x1f31f;DOM 移除事件 &#x1f31f;真题解答 &#x1f31f;总结 &#x1f31f;经典真题 总结一下 DOM 中如何…

【STM32】TIM定时器

第一部分&#xff1a;定时器基本定时的功能&#xff1b; 第二部分&#xff1a;定时器的输出比较功能&#xff1b; 第三部分&#xff1a;定时器输入捕获的功能&#xff1b; 第四部分&#xff1a;定时器的编码接口。 1 TIM简介 TIM&#xff08;Timer&#xff09;定时器&#…

计算机网络TCP篇②

一、TCP 重传、滑动窗口、流量控制、拥塞控制 1.1、重传机制 在 TCP 中&#xff0c;当发送端的数据达到接受主机时&#xff0c;接收端主机会返回一个确认应答消息&#xff0c;表示已收到消息。但是在复杂的网络中&#xff0c;并一定能顺利正常的进行数据传输&#xff0c;&…

从零开始搭建博客网站-----登陆页面

登录按钮以及背景图设置 安装element-plus和css插件 npm install element-plus --save npm install sass --save npm install sass-loader --save在main.js里引用 寻找背景图存入assets文件下&#xff0c;并且在Login.vue里设置背景图和登录按钮 设置的背景图的大小没有起…

avue-tabs设置默认选中的tab

文章目录 一、问题二、解决三、最后 一、问题 最近在用avue这个UI框架来开发页面&#xff0c;有用到avue-tabs这个tab切换组件。结果竟然发现element-ui中el-tabs的v-model在avue-tabs中竟然是没有用的&#xff0c;无法设置默认选中哪个tab。avue这个基于element-ui开发的UI框…

〖大前端 - 基础入门三大核心之JS篇㊹〗- DOM事件委托

说明&#xff1a;该文属于 大前端全栈架构白宝书专栏&#xff0c;目前阶段免费&#xff0c;如需要项目实战或者是体系化资源&#xff0c;文末名片加V&#xff01;作者&#xff1a;不渴望力量的哈士奇(哈哥)&#xff0c;十余年工作经验, 从事过全栈研发、产品经理等工作&#xf…

【Erlang进阶学习】2、匿名函数

受到其它一些函数式编程开发语言的影响&#xff0c;在Erlang语言中&#xff0c;将函数作为一个对象&#xff0c;赋予其“变量”的属性&#xff0c;即为我们的匿名函数 或 简称 fun&#xff0c;它具有以下特性&#xff1a; &#xff08;匿名函数&#xff1a;不是定义在Erlang模…

逻辑回归与正则化 逻辑回归、激活函数及其代价函数

逻辑回归、激活函数及其代价函数 线性回归的可行性 对分类算法&#xff0c;其输出结果y只有两种结果{0&#xff0c;1}&#xff0c;分别表示负类和正类&#xff0c;代表没有目标和有目标。 在这种情况下&#xff0c;如果用传统的方法以线性拟合 &#xff08; h θ ( x ) θ T…

Android HCI日志分析案例2

案例1--蓝牙音箱电量用完后&#xff0c;配对一直失败&#xff0c;提示PIN码不正确 基于MTK平台&#xff0c;通过MTKLogger开启保存HCI日志 问题定位分析 Android日志查看logcat 搜索到关键log 01-20 10:07:55.403760 978 1075 V bt_stack: [VERBOSE2:btm_inq.cc(2032)] …

Linux 多线程(C语言) 备查

基础 1&#xff09;线程在运行态和就绪态不停的切换。 2&#xff09;每个线程都有自己的栈区和寄存器 1&#xff09;进程是资源分配的最小单位&#xff0c;线程是操作系统调度执行的最小单位 2&#xff09;线程的上下文切换的速度比进程快得多 3&#xff09;从应用程序A中启用应…

flink源码分析之功能组件(四)-slot管理组件I

简介 本系列是flink源码分析的第二个系列&#xff0c;上一个《flink源码分析之集群与资源》分析集群与资源&#xff0c;本系列分析功能组件&#xff0c;kubeclient&#xff0c;rpc&#xff0c;心跳&#xff0c;高可用&#xff0c;slotpool&#xff0c;rest&#xff0c;metrics&…