蓝牙与WiFi

2023-05-16

蓝牙

透传

HAL_UART_Receive_IT(&huart2, (uint8_t*) &USART2_NewData, 1); //开启串口2接收中断
	RS485orBT = 0;//RS485orBT标志位为1时是RS485模式,为0时是蓝牙模块
if (USART2_RX_STA != 0) { //	串口2判断中断接收标志位[处理从蓝牙外部设备接收的字符]
					BUZZER_SOLO1(); //蜂鸣器发声[HAL库精准延时函数]
					BT_printf("%c", USART2_RX_BUF[0]); //蓝牙发送,仅限一个字符发送
					USART2_RX_STA = 0; //清除标志位,准备下一次接收
				}
				if (KEY_1()) {
					BUZZER_SOLO2();//提示音
					BT_printf("A");//向蓝牙发送A
				}
				if (KEY_2()) {
					BUZZER_SOLO2();
					BT_printf("B");
				}
if (KEY_1()) {
		BUZZER_SOLO1();
		LED_1(0);
		LED_2(0);
		BT_printf("AT+NAMECC2541"); //AT指令【修改模块的广播名CC2541】
	}
	if (KEY_2()) {
		BUZZER_SOLO2();
		LED_1(0);
		LED_2(0);
		BT_printf("AT+DISC"); //AT指令【断开手机连接】
	}

蓝牙APP控制

if (USART2_RX_STA & 0x8000) { //判断中断接收标志位(蓝牙模块BT,使用USART2)
			if ((USART2_RX_STA & 0x7FFF) == 3  	//判断接收数量3个
			&& USART2_RX_BUF[0] == '+' 	//判断接收第1个字符是不是+
			&& USART2_RX_BUF[1] == 'O' 	//判断接收第2个字符是不是O
			&& USART2_RX_BUF[2] == 'K')	//判断接收第3个字符是不是K
					{
				LED_1(1);	//LED1控制 //LED1亮,表示接收到+OK(成功)的回复
			} else if ((USART2_RX_STA & 0x7FFF) == 4	//判断接收数量4个
			&& USART2_RX_BUF[0] == '+'		//判断接收第1个字符是不是+
			&& USART2_RX_BUF[1] == 'E'		//判断接收第2个字符是不是E
			&& USART2_RX_BUF[2] == 'R'		//判断接收第3个字符是不是R
			&& USART2_RX_BUF[3] == 'R')		//判断接收第4个字符是不是R
					{
				LED_2(1);		//LED2控制	//LED2亮,表示接收到+ERR(失败)的回复
			} else if ((USART2_RX_STA & 0x7FFF) == 1)	//判断接收数量1个(手机控制程序)
					{
				switch (USART2_RX_BUF[0]) {	//判断接收数据的内容
				case 0x41:
					RELAY_1(1);	继电器的控制程序(0继电器放开,1继电器吸合)
					BT_printf("Relay ON");	//返回数据内容,在手机APP上显示
					break;
				case 0x44:
					RELAY_1(0);	继电器的控制程序(0继电器放开,1继电器吸合)
					BT_printf("Relay OFF");	//返回数据内容,在手机APP上显示
					break;
				case 0x42:
					LED_1(1);	//LED1控制
					BT_printf("LED1 ON");	//返回数据内容,在手机APP上显示
					break;
				case 0x45:
					LED_1(0);	//LED1控制
					BT_printf("LED1 OFF");	//返回数据内容,在手机APP上显示
					break;
				case 0x47:
					BUZZER_SOLO1();	//蜂鸣器输出单音的报警音
					BT_printf("BEEP1");	//返回数据内容,在手机APP上显示
					break;
				case 0x43:
					BUZZER_SOLO2();	//蜂鸣器输出单音的报警音
					BT_printf("BEEP2");	//返回数据内容,在手机APP上显示
					break;
				case 0x46:
					BT_printf("CPU Reset");	//返回数据内容,在手机APP上显示
					HAL_Delay(1000);	//延时
					NVIC_SystemReset();	//系统软件复位函数
					break;
				default:
					//冗余语句
					break;
				}
			}
			USART2_RX_STA = 0;	//标志位清0,准备下次接收
		}
		if (KEY_1())	//按下KEY1判断
		{
			BUZZER_SOLO2();	//提示音
			LED_1(0);	//LED1控制 //在蓝牙模块回复之前先将LED状态复位
			LED_2(0);	//LED2控制
			BT_printf("AT+NAMECC2541");	//向蓝牙模块发送AT指令(修改模块的广播名为CC2541)
		}
		if (KEY_2())	//按下KEY2判断
		{
			BUZZER_SOLO2();	//提示音
			LED_1(0);	//LED1控制 //在蓝牙模块回复之前先将LED状态复位
			LED_2(0);	//LED2控制
			BT_printf("AT+DISC");	//向蓝牙模块发送AT指令(断开与手机的连接)
		}

专业调试

uint8_t buf[7] = {0xA5,0x00,0x01,0x3B,0x00,0xFF,0x5A};//创建要发送和数组

改USART2中的结束符

if (USART2_RX_STA&0x8000){//判断中断接收标志位(蓝牙,使用USART2)
	if ((USART2_RX_STA&0x7FFF) == 6//判断接收数量6个
			&& USART2_RX_BUF[0] == 0xA5//判断第一个数据是不是包头0xA5
			&& USART2_RX_BUF[5] ==//判断接收第6个校验码是不是前四个数据之和
			(USART2_RX_BUF[1]+USART2_RX_BUF[2]+USART2_RX_BUF[3]+USART2_RX_BUF[4]%0x100))
	{
		if (USART2_RX_BUF[1]&0x01)//判断逻辑值中最低位是1则点亮LED
		{
			LED_1(1);
		}else{//0则熄灭
			LED_1(0);
		}
	}
	USART2_RX_STA = 0;
}
if (KEY_1()){
	BUZZER_SOLO2();
	buf[1] = 0x01;//可在计算校验码之前按实现需求修改数据值
	buf[5] = (buf[1]+buf[2]+buf[3]+buf[4]%0x100);//数据相加得出校验码,取最低8位
	HAL_UART_Transmit (&huart2,(uint8_t *)&buf,7,0xffff);//串口发送函数(串口号,内容,数量,溢出时间)
}
if (KEY_2()){
	BUZZER_SOLO2();
	buf[1] = 0x00;
	buf[5] = (buf[1]+buf[2]+buf[3]+buf[4]%0x100);
	HAL_UART_Transmit (&huart2,(uint8_t *)&buf,7,0xffff);
}

WIFI 控制ESP8266

首先用AT指令集连接WiFi后再用此程序

(此步要用USART1与USART3连接,进行串口通信才可以发送AT指令)

CUBE MX配置

USART3为异步模式(Asynchronous)

使能NVIC

	HAL_UART_Receive_IT(&huart3, (uint8_t*) &USART3_NewData, 1); //开启USART3接收中断
	USART3_RX_STA = 0; //标志位清0,准备下一次接收
	LED_1(0); //LED复位
	LED_2(0);

控制

AT+RST复位

AT+CWMODE=1 Station模式(3 AP+Station模式)[AP可开热点]

AT+CWLAP 扫描热点

AT+CWJAP_DEF=“A”,"0.123456789"接入热点

AT+CIPSEND=5 //5为数据数量【等>后,再发送数据】

AT+CIPCLOSED 与电脑服务器端的TCP连接断开

AT+CWQAP 断开与路由器连接

AT+CWSAP_DEF=“ESP8266”,"1234567890"11,2

AT+CIPMUX=1 多连接模式

AT+CIPSERVER=1,1001 开启服务器,端口号1001

AT+CIFSR 查询本机IP地址

while(1)中:

连接TCP的时候,IP与端口需自行正确配置

//TCP接收数据的处理
		//只有串口3接收到开头为“+IPD,“时才被识别为接收到数据,数据内容在USART3_RX_STA&0x3FFF。
		if (USART3_RX_STA & 0x8000)		      //判断中断接收标志位(WIFI模块使用USART3)
				{
			switch (USART3_RX_STA & 0x3FFF)		      //判断接收数据的内容
			{
			case 'A':
				RELAY_1(1);		      继电器的控制程序(0继电器放开,1继电器吸合)
				WIFI_TCP_SEND("Relay ON:OK!\r\n");		      //发送AT指令 TCP发送数据内容
				break;
			case 'B':
				RELAY_1(0);		      继电器的控制程序(0继电器放开,1继电器吸合)
				WIFI_TCP_SEND("Relay OFF:OK!\r\n");		      //发送AT指令 TCP发送数据内容
				break;
			case 'C':
				BUZZER_SOLO1();		      //蜂鸣器输出单音的报警音
				WIFI_TCP_SEND("Beep:OK!\r\n");		      //发送AT指令  TCP发送数据内容
				break;
			case 'R':
						BUZZER_SOLO2();		      //蜂鸣器输出单音的报警音
						WIFI_TCP_SEND("Beep:OK!\r\n");		      //发送AT指令  TCP发送数据内容
						break;
			case 'D':
				LED_1(1);		      //LED1独立控制函数(0为熄灭,其他值为点亮)
				WIFI_TCP_SEND("LED1 ON:OK!\r\n");		      //发送AT指令 TCP发送数据内容
				break;
			case 'E':
				LED_1(0);		      //LED1独立控制函数(0为熄灭,其他值为点亮)
				WIFI_TCP_SEND("LED1 OFF:OK!\r\n");		      //发送AT指令 TCP发送数据内容
				break;
			default:
				//冗余语句
				break;
			}
			USART3_RX_STA = 0;		      //标志位清0,准备下次接收
		}
		if (KEY_1())		      //按下KEY1判断
		{
			BUZZER_SOLO2();		      //提示音
			WIFI_printf("AT+CIPSTART=\"TCP\",\"192.168.70.37\",3456\r\n");//发送AT指令 连接TCP服务器(IP和端口号需按实际修改)
			HAL_Delay(100);		      //等待
		}
		if (KEY_2())		      //按下KEY2判断
		{
			BUZZER_SOLO2();		      //提示音
			WIFI_TCP_SEND("www.doyoung.net\r\n");		    //发送AT指令 TCP模式下的发送数据
			HAL_Delay(100);		      //等待
		}

驱动文件

wifi.c

#include "wifi.h"
//WIFI模块通信,使用UART3,这是专用的printf函数
//调用方法:WIFI_printf("123"); //向USART2发送字符123
void WIFI_printf (char *fmt, ...)
{
	char buff[USART3_REC_LEN+1];  //用于存放转换后的数据 [长度]
	uint16_t i=0;
	va_list arg_ptr;
	va_start(arg_ptr, fmt);
	vsnprintf(buff, USART3_REC_LEN+1, fmt, arg_ptr);//数据转换
	i=strlen(buff);//得出数据长度
	if(strlen(buff)>USART3_REC_LEN)i=USART3_REC_LEN;//如果长度大于最大值,则长度等于最大值(多出部分忽略)
    HAL_UART_Transmit(&huart3,(uint8_t *)buff,i,0xffff);//串口发送函数(串口号,内容,数量,溢出时间)
    va_end(arg_ptr);
}
//WIFI模块在TCP模式下的数据发送:TCP发送的规定是先发AT+CIPSEND=数量,等待返回“>“后再发送数据内容。
//调用方法:WIFI_TCP_SEND("123\r\n"); //TCP方式发送字符123和回车换行
void WIFI_TCP_SEND (char *fmt, ...)
{
	char buff[USART3_REC_LEN+1];  //用于存放转换后的数据 [长度]
	uint16_t i=0;
	va_list arg_ptr;
	va_start(arg_ptr, fmt);
	vsnprintf(buff, USART3_REC_LEN+1, fmt, arg_ptr);//数据转换
	i=strlen(buff);//得出数据长度
	if(strlen(buff)>USART3_REC_LEN)i=USART3_REC_LEN;//如果长度大于最大值,则长度等于最大值(多出部分忽略)
	WIFI_printf("AT+CIPSEND=%d\r\n",i);//先发送AT指令和数据数量
	HAL_Delay(100);//等待WIFI模块返回">",此处没做返回是不是">"的判断。稳定性要求高的项目要另加判断。
    HAL_UART_Transmit(&huart3,(uint8_t *)buff,i,0xffff);//发送数据内容(串口号,内容,数量,溢出时间)
    va_end(arg_ptr);
}
//所有USART串口的中断回调函数HAL_UART_RxCpltCallback,统一存放在【USART1.C】文件中。


wifi.h

#ifndef WIFI_WIFI_H_
#define WIFI_WIFI_H_
#include "stm32f1xx_hal.h" //HAL库文件声明
#include "../usart/usart.h"
#include "main.h"
#include <string.h>//用于字符串处理的库
#include <stdarg.h>
#include <stdlib.h>
#include "stdio.h"
extern UART_HandleTypeDef huart3;//声明UART2的HAL库结构体
void WIFI_printf (char *fmt, ...); //WIFI模块发送
void WIFI_TCP_SEND (char *fmt, ...);//在TCP模式下的发送数据(不处理返回状态的盲发)
#endif /* WIFI_WIFI_H_ */
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

蓝牙与WiFi 的相关文章

  • 为什么 Android 2.3 中包含的本机 SIP 堆栈无法在 3g 上工作?

    我想知道为什么 Android 框架 自 2 3 起 中包含的本机 SIP 堆栈不能在 3g 上工作 这是否与谷歌对其合作伙伴可能有的任何法律或限制有关 此外 有人知道是否有计划取消该限制吗 Thx In 姜饼 http androidxr
  • Android中如何获取wifi热点的IP?

    正如标题所说 我试图在将 wifi iface 配置为热点时获取其 IP 理想情况下 我想找到适用于所有手机的东西 当然 WifiManager 在从 AP 获取信息时毫无用处 幸运的是 我已经能够通过这样做来获取所有接口的 IP publ
  • Wi-Fi 直连技术

    我正在考虑创建一个通过 Wi Fi Direct 传输视频流的应用程序 我已经用谷歌搜索过 甚至在 Stackoverflow 中 但我还没有找到指定支持设备的列表 我的问题是 是否可以在 Samsung Galaxy Mini 带有 An
  • 无需连接WiFi即可获取MAC地址

    是否可以在未实际连接的情况下获取 WiFi MAC 地址 假设我有 Android 设备 A 我已经打开了 WiFi 因此我的 Android 设备现在能够检测到附近广播的 WiFi SSID 我附近有一些广播的 WiFi SSID 如下所
  • Android 2.2 wifi热点API

    我需要在 Android 2 2 Froyo 中进行什么 API 调用来创建 Wifi 热点 如网络共享和便携式热点设置项中所示 您可以致电 private boolean setWifiApEnabled WifiConfiguratio
  • 如何使用 iPhone 使用蓝牙或 wifi 与 OBD II 通信

    我喜欢为 iOS 创建一个简单的应用程序 它通过 ODB II Wifi 蓝牙设备从汽车读取数据并显示在 iPhone 屏幕上 但我不知道从哪里开始 请有人帮助我实现以下结果 我有蓝牙和 WiFi 适配器 第 1 步 将蓝牙或 Wifi 适
  • Android :: 如何断开与 wifi 网络的连接?

    我用谷歌搜索发现很多网站都在说 禁用 Wifi 无线电 但就我而言 我只想让 Android 设备断开与特定 wifi 网络 SSID 已知 的连接 而不关闭 WiFi 无线电 请给我一些关于这个问题的见解 哇 这不应该花一个月的时间才能得
  • 在监控模式下使用 libpcap 嗅探 wifi

    问题陈述 Calling pcap activate 结果是PCAP ERR RFMON NOTSUP错误 即不支持 RF 监控模式 Context 我正在编写一个小型 C 程序 其工作是在监视器模式下监听我的笔记本电脑的 wifi 卡 该
  • 如何使用Java连接wifi设备? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何在Java中在wifi范围内的设备之间建立连接 要通过网络 WiFi 电缆等 在两个设备之间建立连接 您需要编写 2 个软件 1
  • 通过发送意图来启动 Android WiFi 管理器?

    我正在开发一个应用程序 我想要一个按钮 打开Android内置的WiFi菜单 我真的不想自己实现扫描和连接代码 我可以发送任何打开此菜单的意图吗 你应该使用ACTION PICK WIFI NETWORK http developer an
  • 获取WIFI信号强度-寻求最佳方法(IOCTL、iwlist(iw)等)

    我想扫描从3个AP接收到的信号强度 如果每 300 毫秒 最多 500 毫秒 发生一次 我会很高兴 我在路由器上刷了 OpenWRT 我正在寻找一个好的工具来做到这一点 首先 我发现 iwconfig 可以工作 但仅限于我连接到的网络 所以
  • 如果未找到 Wi-Fi AP,则不会调用 NetworkCallback 的 onUnavailable() 方法

    我正在尝试将我的智能手机连接到 IOT 设备制作的 AP 我将connectivitymanager requestNetwork 与NetworkCallback 一起使用 一切正常 直到我关闭我的AP 并且显然requestNetwor
  • 我可以枚举可用的 WLAN 吗?

    我想获取我周围可用的 WLAN 的信息 例如 SSID 这可能吗 Edit 可能是 通过市场认证 的意思 不 这在当前的 API 集中不可用 而且我认为 Mango 集中也没有提到它
  • 测量 wifi 到 Iphone/Ipad 的信号强度

    我想从 iOS 设备获取当前的 Wifi 信号强度 Google 搜索仅显示适用于 Android 设备的解决方案 从文献中我了解到 Apple 不允许访问硬件 因此没有人可以通过他们的应用程序以 dbm 形式检索设备的信号强度 它是否正确
  • 如何捕获无线路由器的原始信号?

    我现在看到了几个项目 它们从典型无线路由器收集的无线电数据中获取新颖的空间信息 http wisee cs washington edu http wisee cs washington edu http www extremetech c
  • 是否可以强制通过 Wifi 或 TMobile 网络进行网络流量?

    我想知道使用 G1 是否可以强制网络流量通过 Wifi 或通过 Cell GSM 网络 我需要强制应用程序通过塔式网络连接以获取一些登录信息 这可能吗 有人对这如何可能有任何想法吗 我正在尝试使用 Android SDK 在应用程序内完成此
  • Android wifimanager总是返回true

    这简直要了我的命 任何帮助将不胜感激 我想使用 wifi 管理器连接到开放网络 我遇到的问题是该代码声称连接到任何网络 甚至是不存在的网络 下面是执行并使用网络 SSID 调用的完整代码 无论您传递给它什么字符串作为网络的 SSID 即使不
  • 我如何使用肘节检查连接性?

    我需要使用连接库检查应用程序内每个页面的连接性 所以我将在提供者内部使用一肘 问题是何时关闭流以便在用户关闭应用程序时可以处理它 像这样 import package connectivity connectivity dart overr
  • Android:扫描 Wifi 网络 + 可选列表

    我正在尝试创建一个应用程序 让您扫描可用的 wifi 网络 然后将它们显示在可选列表中 为此 我尝试使用以下代码 package android nacho WifiScan import java util List import and
  • 两个或多个 Android 设备之间的 WiFi 聊天

    我想开发一个聊天应用程序 使用 wifi 网络在两个或多个 Android 设备之间聊天 该应用程序应该能够相互发送或接收字符串 我有在pc和android之间使用蓝牙网络的经验 任何人都可以给我任何建议或正确的方向 提前致谢 您可以在两个

随机推荐

  • LCD工作原理及结构

    1 主流显示面板技术 xff1a LCD xff0c OLED xff0c MicroLED 2 主流显示屏的发展趋势 3 LCD堆叠结构 xff1a 背光 xff0c 下偏光片 xff0c TFT Glass xff0c CF Glass
  • OLED工作原理及结构

    1 主流显示面板技术 xff1a LCD xff0c OLED xff0c MicroLED 2 主流显示屏的发展趋势 3 OLED堆叠结构 xff1a 相比LCD xff0c OLED没了背光和下偏光片 4 OLED发光原理 xff1a
  • Git Fork操作与配置

    https blog csdn net Lu Ca article details 128612125 我理解的git fork xff1a 将别人 xff08 张三 xff09 仓库包括文件 xff0c 提交历史 xff0c issues
  • 背光的工作原理及结构

    1 什么是背光 xff1a LCD本身是不发光的 xff0c 因此它需要一个外部面光源系统来帮助其显示 xff0c 即背光源 xff08 Backlight xff09 xff1b 2 背光的种类 xff1a 从发光类型来分 xff0c 可
  • Microled简介及关键工艺(巨量转移)

    1 什么是Microled xff1f 通俗来讲 xff0c 将作为发光器件LED用作显示屏的像素 xff0c 固这种LED的尺寸就得做得很小 xff08 约 xff1c 100 m xff09 xff0c 这种技术就是Microled x
  • 数字电路基础-逻辑门电路

    1 门电路的概念 实现基本逻辑运算和复合运算的单元电路称为门电路 xff0c 常用的门电路有非门 与非门 或非门 与非门 与或非门等 2 基本逻辑门电路 a 与门 xff1a 全1出1 xff0c 有0出0 工作原理 xff1a 输入A B
  • 51单片机-控制LED灯

    目录 1 硬件设计 2 软件设计 2 1 点亮一颗LED灯 2 2 LED闪烁 2 3 LED流水灯 3 知识点 3 1 while函数的应用 3 2 常用数据类型 3 3 延时函数的自动生成 1 硬件设计 通过原理图分析 xff0c LE
  • 51单片机-74HC595移位寄存器

    目录 1 74HC595芯片介绍 1 1 引脚定义 1 2 工作原理 2 实际应用 2 1 控制数码管 2 2 点阵屏显示图形 2 3 点阵屏显示动画 3 知识点 3 1 位变量 xff08 sbit bit xff09 3 2 字模提取
  • 51单片机-独立按键控制LED灯

    目录 1 硬件设计 2 软件设计 2 1 独立按键控制LED闪烁 2 2 独立按键控制LED状态 2 3 独立按键控制LED显示二进制 2 4 独立按键控制LED移位 3 知识点 3 1 if语句的运用 3 2 常用运算符 1 硬件设计 轻
  • 51单片机-控制数码管

    目录 1 硬件设计 1 1 LED数码管介绍 1 2 原理图设计 2 软件设计 2 1 静态数码管显示 2 2 动态数码管显示 2 3 模块化编程 xff08 头文件 xff09 3 知识点 3 1 数组 3 2 子函数 3 3 switc
  • LCD的制作工艺

    目录 1 LCD简介 2 LCD制程 2 1 Array制程 2 1 1 像素电路 2 1 2 制程简介 2 2 Cell制程 2 3 Module组装 3 总结 1 LCD简介 LCD是目前显示领域的重要组成部分 xff0c 可通过如下链
  • 51单片机-LCD1602

    目录 1 硬件设计 1 1 LCD1602介绍 1 2 原理图 2 软件设计 2 1 控制原理 2 2 控制时序 2 3 指令集 2 4 程序设计 3 知识点 3 1 宏定义 3 2 指针与数组 3 3 for语句 1 硬件设计 1 1 L
  • 51单片机-矩阵键盘

    目录 1 硬件设计 2 软件设计 2 1 矩阵键盘扫描 2 2 矩阵键盘 密码锁 3 知识点 3 1 模块化编程的应用 3 2 include详解 1 硬件设计 矩阵键盘按键数量较多 xff0c 为了减少I O口的占用 xff0c 通常将按
  • 如何优雅的让fork后的仓库与原仓库同步

    https www cnblogs com tudou1179006580 p 14875486 html https github com selfteaching the craft of selfteaching issues 67
  • UDP——C语言socket编程

    UDP编程相比TCP来说相对简单主要用到sendto 和recvfrom 这两个函数 xff0c 接下来主要介绍一下这两个函数 头文件 span class token macro property span class token dir
  • 函数与宏定义

    前言 本文介绍函数与宏定义 一 函数的概念 1 函数的定义 自定义函数的形式 xff1a 存储类型符 返回值类型符 函数名 xff08 形参说明表 xff09 函数语句体 xff08 1 xff09 存储类型符 函数作用范围 xff0c 默
  • 51单片机-定时器中断

    目录 1 定时器 计数器 1 1 工作原理 1 2 相关寄存器 1 3 工作模式 xff08 模式1 xff09 2 中断系统 2 1 中断的概念 2 2 中断结构 2 3 中断源 2 4 相关寄存器 3 如何配置定时器中断 4 实际应用
  • 51单片机-串口通信

    目录 1 什么是通信 1 1 通信的概念 1 2 传送方式 1 3 同步方式 1 4 传送方向 1 5 校验方式 2 单片机串口介绍 2 1 硬件电路 2 2 电平标准 2 3 常见接口 2 4 内部结构 2 5 相关寄存器 2 6 工作模
  • I2C总线

    目录 1 硬件概述 1 1 常用器件 1 2 总线结构 1 3 工作原理 2 协议概述 2 1 传输格式 2 2 传输特点 2 3 读和写 2 4 时钟同步和总线仲裁 3 转换器概述 4 缓存器概述 1 硬件概述 1 1 常用器件
  • 蓝牙与WiFi

    蓝牙 透传 HAL UART Receive IT amp huart2 uint8 t amp USART2 NewData 1 开启串口2接收中断 RS485orBT 61 0 RS485orBT标志位为1时是RS485模式 xff0c