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

STM32 串口USART

 

目录

常见的通信方式

串行通信和并行通信

全双工,半双工和单工通信 

同步通信和异步通信 

通信速率  

常见的通信协议

串口基础知识

电平特性

串口传输协议

STM32F103的USART资源

端口引脚 

数据寄存器单元  

发送接收控制单元 

实现串口发送

printf重定向

实现串口中断接收

实现串口发送接收控制LED灯

蓝牙模块HC-05

硬件接线

AT设置工作模式

基本配置(所有AT命令都必须换行) 

AT命令的详细说明

蓝牙项目步骤 

ESP8266-01S wifi模块

ESP8266-01s的三种工作模式

引脚接线图​编辑

烧录固件

AT指令

ESP8266-01s wifi功能介绍

根据AT指令使用示例查看TCP Client模式下怎么使用

根据AT指令使用示例查看UDP 传输模式下怎么使用

固定远端的 UDP 通信

可变远端的 UDP 通信

透传

TCP Client 单连接透传

UDP 透传

多连接 TCP Server


常见的通信方式

串行通信和并行通信

串行通信:速度比并行慢(并行是很多排数据,串行是一排数据),但是占用的硬件资源少(占用引脚较少,如果是多个IO口),通常只需要时钟线,一两根数据线还 有片选线即可。

如下列图片;只靠一根线发送010101....过去并且还得有时钟

 并行通信:速度快,但是需要很多根数据线、地址线等。

如下图D0-D7一起发送01,相对于上面串行通信是单车道,并行通信是八车道,车流量肯定比串行的快但是缺点占用很多数据线

全双工,半双工和单工通信 

全双工:同一时刻双方可以互相发送数据、接收数据(像微信)

半双工:同一时刻只能有一方可以给另外一方发送数据,即此发彼收,此收彼发

单工:只能由发送方数据发送给接收方  

同步通信和异步通信 

同步通信和异步通信都是针对串行通信而言

异步通信

        1.数据是以字符为单位组成字符帧传输的。(相当是以字符为单位发送的;一个字符两个字符三个字符)

        2.字符帧由发送端一帧一帧的发送,每帧数据均是低位在前,高位在后,通过传输线被接收端一帧一帧的接收。(低位”(Least Significant Bit,LSB)指的是二进制数中权值最小的位,通常位于二进制数的最右侧(最末尾))

        3.发送端和接收端可以有各自独立的时钟来控制数据的发送和接收,这两个时钟各自独立,互不同步。

        4.接收端依靠字符帧格式来判断发送端是何时开始和结束发送的。(相当于说我们发送的数据一定有开始发送的数据信号,结束时有结束的数据信号,表示我是什么时候开始什么时候结束)

        5.字符帧也叫做数据帧,由起始位,数据位,奇偶校验位,停止位等部分组成, 是异步通信的一个重要指标。(起始位是第一位表示我们的数据没有丢失,数据位我们发送几位的数据,奇偶校验位是校验数据是否发错了或丢失了,停止位一般是最后一个用来表示数据已经发送完成)

        6.同步通信的另一个重要指标是波特率。(波特率:发送速度的快慢)

同步通信

        1.同步是指在约定的通信速率下,发送端和接收端的时钟信号和相位始终保持一 致(),保证通信双方在发送和接收数据时具有完全一致的定时关系。

        2.同步通信把许多字符组成一个信息帧(相当于这一帧数据有很多字节),每帧的开始用同步字符来表示。

        3.在绝大多数场合下,发送端和接收端,采用的都是同一个时钟,所以在传送数据的同时还要发送时钟信号,以便接收端可以使用时钟信号来确定每一个信息位。

        4.同步通信一次通信只能传送一帧信息。  

通信速率  

对于同步通信,通信速率由时钟信号决定,时钟信号越快(时钟频率),传输速度越快。

对于异步通信来说,需要收发双方提前统一通信速率,这也就是我们串口调试时,波 特率不对显示乱码的原因。

 1.比特率:系统在单位时间内传输的比特率(二进制0或1)个数(传输字节的个数),通常用Rb表示,单 位是比特(bit/s),缩写为bps。

2.波特率:系统在单位时间内传输的码元个数,通常用RB来表示,单位是波特(Bd)

3.码元有N个状态时,比特率与波特率的关系式:RB=Rb x log2N

常见的通信协议

通信协议是设备或系统间 “沟通的语言”,没有协议,数据传输将混乱无序。它确保不同厂商的设备能互相识别和协作,就像人类使用共同的语言规则(如语法、词汇、对话流程)才能交流一样。

串口UART能输出三种电平分别是TTL RS232 RS485

串口基础知识

电平特性

串口物理接口与电平标准,TTL 电平(单片机常用)需要对应的串口线连接在一起

TTL(Transistor-Transistor Logic,晶体管 - 晶体管逻辑) 指的是 UART 接口使用的一种电平标准,用于定义信号的逻辑高(1)和逻辑低(0)对应的电压范围。

电平转换芯片,有的模块是不能直接用TTL电平的,比如是这种距离几十米的场景,就会用其他工控协议如RS485同时转换为TTL电平

嵌入式设备内部通信

单片机(如 STM32、Arduino)的 UART 接口直接输出 TTL 电平,可与其他支持 TTL 的设备(如蓝牙模块、WiFi 模块、传感器)的 UART 引脚直接连接,仅需连接 TX(发送)、RX(接收)、GND(地) 三根线(全双工模式)

与 PC 通信时需电平转换

PC 的串口(如老式 COM 口)使用 RS-232 电平(逻辑 1 为 - 3V~-15V,逻辑 0 为 + 3V~+15V),与 TTL 电平不兼容。因此,单片机通过 UART 与 PC 通信时,需通过 USB 转 TTL 模块(如 CH340、CP2102 芯片)将 TTL 电平转换为 USB 信号,再由 PC 驱动识别。

串口传输协议

串口设备连接示意图:

参数概念:

波特率:一般选波特率都会有9600,19200,115200等选项,其实意思就是每秒传输这么多个码元。

起始位:先发出一个逻辑 ‘0’的信号,表示传输数据的开始。

数据位:可以是5~8位逻辑 “0” 或“1”,先传输Bit0,再传输bit1,以此类推。

校验位:数据位加上这一位之后,使得“1”的位数应为偶数(偶校验)或者奇数(奇校 验),以此来校验数据传送的正确性,校验位是可选的,可以不传输。 

停止位:它是一个字符数据的结束标志,数据线变回逻辑“1”。  

1. 波特率(Baud Rate)

  • 定义:每秒传输的码元(Symbol)数量。在串口通信(如 UART)中,码元通常是二进制位(0 或 1),因此波特率等于每秒传输的比特数(Bit/s)。
  • 常见值:9600、19200、115200 等,这些是工业和嵌入式领域的标准波特率,由历史习惯和硬件兼容性决定。
    • :波特率 115200 表示每秒传输 115200 个二进制位。
  • 注意:收发双方的波特率必须一致,否则会导致数据错位(如把起始位识别为数据位)。

2. 起始位(Start Bit)

  • 作用:标志一帧数据的开始,让接收端同步数据传输的起点。
  • 格式:固定为 1 个逻辑 0(低电平),长度为 1 个波特率周期(如波特率 9600 时,持续约 104μs)。
  • 示例帧结构:起始位→数据位→校验位(可选)→停止位。

3. 数据位(Data Bits)

  • 长度:5~8 位(常见 7 位或 8 位),具体由通信协议决定(如 ASCII 码常用 7 位,Unicode 常用 8 位)。
  • 传输顺序:从 最低有效位(LSB,Bit0)到最高有效位(MSB,如 Bit7),逐位发送。
    • :数据 0x45(二进制 01000101)传输顺序为:1→0→1→0→0→0→1→0(假设 8 位数据位)。

4. 校验位(Parity Bit,可选)

  • 功能:检测数据传输中的单比特错误(无法纠错,且只能检测奇数个错误)。
  • 类型
    • 偶校验(Even):数据位 + 校验位中 “1” 的总数为偶数(如数据位有 3 个 “1”,校验位为 1,总 4 个 “1”)。
    • 奇校验(Odd):数据位 + 校验位中 “1” 的总数为奇数(如数据位有 2 个 “1”,校验位为 1,总 3 个 “1”)。
    • 无校验(None):不传输校验位,直接发送数据位和停止位(最常用,如 USB 转串口默认无校验)。
  • 注意:校验位的选择需收发双方一致,否则无法正确检测错误。

5. 停止位(Stop Bit)

  • 作用:标志一帧数据的结束,为接收端提供帧间隔时间,准备接收下一帧。
  • 长度:可配置为 1 位、1.5 位或 2 位逻辑 1(高电平),具体取决于波特率和硬件设计(通常 1 位最常用)。

    • :波特率 9600、1 位停止位时,停止位持续约 104μs(与起始位时长相同)。

 6. 完整数据帧示例(以 8 位数据位、无校验、1 位停止位为例)

| 起始位(0) | 数据位(Bit0~Bit7) | 停止位(1) |
|------------|-------------------|------------|
|   1位      |      8位          |   1位      |
  • 一帧总长度:1(起始)+8(数据)+0(无校验)+1(停止)=10 位。
  • 传输时间:10 / 波特率(如波特率 115200 时,一帧约 86.8μs)。

STM32F103的USART资源

1. STM32103有三个通用同步异步收发器USART,两个通用异步收发器UART,USART 也可以当作UART使用。

2. 通常使用的是UART功能,USART在某些场合会使用到,选择通信方式使用场合决定。

3. 可以通过电平转化芯片变为RS232/RS485电平。

正常c8t6是只有串口123

STM32F103的UART框图 

端口引脚 

                                                  

                                                       

                                                             

1. TX:数据发送端口

2. RX:数据接收端口

3. SW_RX:在单线和智能卡模式下接收数据,属于内部端口,没有实际的外部引脚

4. RTS:在硬件流控制下用于指示设备准备好可以接收数据了,低电平表示可以接收数据。

5. CTS:在硬件流控制下用于指示设备以及发送完数据了,如果是高电平那么在本次数据发送完成后会阻塞下一次的传输,只有在低电平的时候才允许下一次传输。

6. CK:同步时钟端口,在同步通信模式下使用,用于输出同步时钟信号。  

数据寄存器单元  

1. TDR:发送数据寄存器

2. RDR:接收数据寄存器

3. 在UART外设中只有一个寄存器USART_DR,是一个双向寄存器,取决于CPU是读这个 寄存器还是写这个寄存器;如果是读就是RDR,如果是写就是TDR。   

发送接收控制单元 

1. CR1/CR2/CR3:控制寄存器,控制各种使能,比如UART使能、收发中断使能、DMA 使能等等。

2. SR:状态寄存器:用来表明UART的收发状态和错误状态等等。

3. GTPR:Smartcard和IrDA模式下专用的寄存器 

 1. fPCLK:外设总线时钟,USART1在APB2,最高可取72MHZ,剩下四个在APB1,最高可 取36MHZ

2. USARTDIV:USART/UART时钟分频器

3. DIV_Mantissa:BBR寄存器的高12bit,用于存放波特率设置的整数部分

4. DIV_Fraction:BRR寄存器的低4bit.用于存放波特率设置值的小数部分,每一位对应 的精度是1/2的四次方 = 0.0625

5. 波特率计算公司:baudrate=fPCLK / USARTDIV * 16

实现串口发送

软件流程设计

        初始化系统

        初始化GPIO、串口外设时钟

        初始化串口引脚

        初始化串口的外设

串口发送

初始化GPIO、串口外设时钟

因为从原理图上可以见得TXD和RXD分别接在芯片的PA9和PA10F分别对应引脚TX是发送数据对于IO来说是输出RX是接收数据对于IO来说是输入
初始化时钟分别是引脚时钟和串口时钟(查看结构图串口1在APB1还是APB2)
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);

 初始化串口引脚

关于引脚的输入输出模式参考中文参考手册8.1.11外设的GPIO配置

	//A9 TXGPIOInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIOInitStruct.GPIO_Pin = GPIO_Pin_9;GPIOInitStruct.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIOInitStruct);//A10 RXGPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIOInitStruct.GPIO_Pin = GPIO_Pin_10;GPIOInitStruct.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIOInitStruct);

 初始化串口的外设 在stm32f10x_usart.h中

    多少波特率(一般没有,直接赋值)USART_Initstruct.USART_BaudRate = 115200;是否有硬件流控制USART_Initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;串口的模式是输入还是输出USART_Initstruct.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;校验位,是否对数据进行校验USART_Initstruct.USART_Parity = USART_Parity_No;停止位USART_Initstruct.USART_StopBits = USART_StopBits_1;串口数据的字节数USART_Initstruct.USART_WordLength = USART_WordLength_8b;这里初始化完串口 还要使能USART_Init(USART1,&USART_Initstruct);USART_Cmd(USART1, ENABLE);

串口发送

在stm32f10x_usart.c的文件中找到串口发送数据函数
第一个参数是串口1,串口2....
第二个参数是typedef unsigned short     int uint16_t; 表示只能用无符号短整形类型的
USART_SendData(USART_TypeDef* USARTx, uint16_t Data)USART_SendData(USART1,'a');
#include "stm32f10x.h"
#include "usart.h"void my_usart_init()
{GPIO_InitTypeDef GPIOInitStruct;USART_InitTypeDef USART_InitStrucr;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);GPIOInitStruct.GPIO_Mode = GPIO_Mode_AF_PP;GPIOInitStruct.GPIO_Pin = GPIO_Pin_9;GPIOInitStruct.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIOInitStruct);GPIOInitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIOInitStruct.GPIO_Pin = GPIO_Pin_10;GPIOInitStruct.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOA,&GPIOInitStruct);USART_InitStrucr.USART_BaudRate = 115200;USART_InitStrucr.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStrucr.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_InitStrucr.USART_Parity = USART_Parity_No;USART_InitStrucr.USART_StopBits = USART_StopBits_1;USART_InitStrucr.USART_WordLength = USART_WordLength_8b;USART_Init(USART1,&USART_InitStrucr);USART_Cmd(USART1, ENABLE);
}
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "bear.h"
#include "key.h"
#include "relay.h"
#include "shake.h"
#include "usart.h"int  main()
{my_usart_init();while(1){USART_SendData(USART1,'a');}}

只能发送字符 不能发送字符串

如果要发送字符串,首先我们得要自己去定义一个,有个隐藏bug,我们在发送数据的时候是先发送到移位寄存器再发送出去的(bug:我们怎么确保我们的数据能够发送出去),所有除了要发送数据的函数,还有USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);(串口获取标志位状态)用这个函数第一个参数是串口几第二个参数是标志位

        USART_FLAG_TXE:  Transmit data register empty flag(发送数据寄存器为空的标志位,在发送字符的时候可以用这个判断是否发送完成)
        USART_FLAG_TC:   Transmission Complete flag(发送完成,是指发送移位寄存器为空)
        USART_FLAG_RXNE: Receive data register not empty flag(接收数据寄存器不为空)
        USART_FLAG_IDLE: Idle Line detection flag(空闲的标志位)

别忘记添加到usart.h中

void My_Usart_Send_Byte(USART_TypeDef* USARTx, uint8_t Data)
{while(USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);//如果这里面的内容是真的,说明我们目前发送的数据寄存器不为空USART_SendData(USARTx, Data);
}void My_Usart_Send_String(USART_TypeDef* USARTx, const uint8_t* str)
{uint8_t i = 0;while(str[i] != '\0')/一直发送,直到发送到结束符就不发送了{My_Usart_Send_Byte(USARTx, str[i]);i++;}while(USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET);
}
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "bear.h"
#include "key.h"
#include "relay.h"
#include "shake.h"
#include "usart.h"void delay(uint16_t time) 
{uint16_t i = 0;while (time--) {i = 12000;while (i--);}
}int main()
{        my_usart_init();发送字符My_Usart_Send_Byte(USART1, 'A');delay(1);//添加延迟,确保数据发送完成My_Usart_Send_Byte(USART1, 'B');delay(1);My_Usart_Send_Byte(USART1, 'C');delay(1);//发送字符串My_Usart_Send_String(USART1, "DFG \r\n");}

printf重定向

printf重定向介绍

C语言里面的printf函数默认输出设备是显示器,如果要实现printf函数输出在串口或者LCD显示屏上,必须要重定义标志库函数里调用的与输出设备相关的函数,比如printf输出到串口,需要将fputc里面的输出指向串口(为什么要修改fputc,因为printf函数里面会调用一个函数是fputs所以我们重新写fputs函数,我们就能实现printf的输出改变)

调用printf函数需要加上stdio.h库,在库中找到int fputc(int /*c*/, FILE * /*stream*/)函数,第一个参数是要输出的内容,第二个参数是指针

int fputc(int ch, FILE * p)
{USART_SendData(USART1,(u8)ch);//ÕâÀïÐèÒªÇ¿ÖÆ×ª»»uint8_t = unsigned charwhile(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET){}return ch}

 main函数中记得添加stdio.h库函数

int main()
{my_usart_init();while (1){printf("shao rou \r\n");}
}

实现串口中断接收

软件流程设计

        初始化系统

                初始化GPIO、串口时钟

                初始化GPIO、串口引脚

                初始化串口中断接收外设、NVIC嵌套中断控制器

        编写串口中断函数

 初始化GPIO 串口时钟、初始化GPIO 串口引脚

void my_usart_init()
{GPIO_InitTypeDef GPIO_Initstruct;USART_InitTypeDef USART_Initstruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1, ENABLE);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOA, &GPIO_Initstruct);GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOA, &GPIO_Initstruct);USART_InitStructure.USART_BaudRate = 115200;USART_Initstruct.USART_WordLength = USART_WordLength_8bUSART_Initstruct.USART_StopBits = USART_StopBits_1;USART_Initstruct.USART_Parity = USART_Parity_No;USART_Initstruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_Initstruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_Init(USART1, &USART_Initstruct);USART_Cmd(USART1, ENABLE);    }

初始化串口中断接收外设、NVIC嵌套中断控制器

    NVIC_InitTypeDef NVIC_Initstruct;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//串口中断配置(中断条件),USART_IT_RXNE接收寄存器不为空USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//这里配置串口1的外设通道, 去主函数找NVIC_Initstruct.NVIC_IRQChannel = USART1_IRQn;NVIC_Initstruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority = 0;NVIC_Initstruct.NVIC_IRQChannelSubPriority = 0;NVIC_Init(&NVIC_Initstruct);

   编写串口中断函数

先在misc.h中找到串口中断函数原型USART1_IRQHandler()

再根据获取中断标志位函数USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)判断是否中断

如果确定进入if函数,那我们的数据从哪来(就好比外部按键按下中断发生,使LED点亮,低电平从哪里来:从gpio.h库函数(相对于的外设库)中的获得低电平函数GPIO_ResetBits)

从usart.h库函数发送数据函数SendData(USART_TypeDef* USARTx, uint16_t Data);

和接收数据函数ReceiveData(USART_TypeDef* USARTx);

int main() 
{my_usart_init();printf("shao rou \r\n");}void USART1_IRQHandler()
{char str;//串口接收的都是字符数据,定义一个变量去存储我们串口接收到的数据//先判断是否发送中断,之前将中断时说过 每一个外设里都有一个中断标志位函数
//串口获取中断标志位函数,第一个参数是串口几,第二个参数是串口的标志位(这里用的中断接收标志位)
//接收数据寄存器不为空说明数据寄存器里有数据,则发生中断if(USART_GetITStatus(USART1, USART_IT_RXNE)  != RESET ){
//我们的数据通过串口中断之后通过接收数据函数会给到我们str =  USART_ReceiveData(USART1);printf("%c \r\n",str);
//记得清除中断USART_ClearITPendingBit(USART1, USART_IT_RXNE);}}

接收到的数据我们串口发送给单片机的数据会立马又发回给串口 

我们发送1到接收数据寄存器里,此时if函数判断接收数据寄存器里有数据则发送中断,将这个1赋值给了字符,printf函数又把这个字符通过串口发送到了上位机

(基本的上位机和下位机的实验)

 实现串口发送接收控制LED灯

 通过发送1或0 来控制灯实现亮或者灭

软件流程设计

        初始化系统

                初始化GPIO、串口外设、LED时钟

                初始化串口和LED引脚

        串口发送控制LED灯

先将LDE函数写入main.c函数中,记得提前将灯初始化灭掉

中断控制语句中

int main() 
{my_usart_init();printf("shao rou \r\n");}
void USART1_IRQHandler()
{char str;if(USART_GetITStatus(USART1, USART_IT_RXNE)  != RESET ){str =  USART_ReceiveData(USART1);printf("receive date: %c \r\n",str);if(str == '0')//如果输入0 LED灯亮{GPIO_ResetBits(GPIOA, GPIO_Pin_1);printf("LED IS ON \r\n");}if(str == '1')//如果输入1 LED灯灭{GPIO_SetBits(GPIOA, GPIO_Pin_1);printf("LED IS OFF \r\n");}USART_ClearITPendingBit(USART1, USART_IT_RXNE);}}

蓝牙模块HC-05

                                            

硬件接线

AT设置工作模式

1.自动连接模式,又称为透传模式。(可以被我们所以设备找到的,比如说手机可以连接到蓝牙模块,电脑也可以,有蓝牙功能都能连接)
2.AT模式(AT mode)(这个模块可以通过AT模式的调试跟开发,直接不连接单片机了直接通过转串口模块接到电脑,电脑打开新的串口调试助手,通过助手发送AT指令)

进入AT模式的两种方法:

1.按住引脚或EN引脚拉高(接入3.3V),此时灯是慢闪,进入AT模式,(前提)波特率默认是 38400;
这个模式我们叫做原始模式,原始模式下一直处于AT命令模式状态。

2.HC-05上电开机,红灯快闪,按住按键或EN引脚拉高(接入3.3V),HC-05进入AT命令模式,默认波特率是9600;这种模式下是正常模式,正常模式下只有按住按键或拉高EN引脚才处于AT命令状态。

进入方式与 LED 状态

  1. 原始模式(方法 1)

    • 操作方式上电前按住按键或拉高 EN 引脚(3.3V),模块直接进入 AT 模式。
    • LED 状态慢闪(2 秒一次),明确指示当前处于 AT 命令模式。
    • 模块状态未配对且未连接,属于初始配置状态,适合批量或首次参数设置。
  2. 正常模式(方法 2)

    • 操作方式:模块正常上电后(红灯快闪,表示等待配对),按住按键或拉高 EN 引脚临时进入 AT 模式。
    • LED 状态
      • 部分资料描述 LED 仍保持快闪(1 秒两次),但需通过波特率 9600 发送 AT 指令。
      • 也有资料指出进入 AT 后 LED 变为慢闪,可能因模块版本或操作细节差异导致。
    • 模块状态:可能已配对或连接,需注意若模块处于已连接状态,需重新上电才能进入 AT 模式。

注意:如果波特率没有设置正确,AT命令是执行无效的。

基本配置(所有AT命令都必须换行) 

\r\n就不用输入了,勾选发送新行就行了 

正常模式下是9600,AT模式波特率固定为 38400,8位数据位,1位停止位,无奇偶校验的通信方式
发送 AT\r\n,回复 OK
发送 AT+UART?\r\n ,回复 +UART9600,0,0
发送 AT+UART=115200,0,0\r\n, 回复OK。

一、基础指令:AT\r\n → 回复 OK

作用:

  • AT 指令的心跳测试,验证模块是否处于 AT 命令模式且串口通信正常。

  • 所有 AT 指令需以 \r\n(回车换行)结尾,模块收到合法指令后返回 OK 表示解析成功。

回复含义:

  • OK 表明模块已正确接收并执行指令,当前处于 AT 模式,可继续发送其他配置指令。

二、查询 UART 配置:AT+UART?\r\n → 回复 +UART9600,0,0

指令解析:

  • AT+UART? 是查询 UART(串口)参数的指令,用于获取模块当前的串口通信配置。

回复参数含义(+UART<波特率>,<数据位>,<停止位/校验位>):

  1. 9600:当前串口波特率为 9600bps(即每秒传输 9600 位数据)。

  2. 0:数据位为 8 位(HC-05 固定为 8 位,此参数实际固定为 0,不可修改)。

  3. 0

    • 停止位为 1 位(0 表示 1 位停止位,1 表示 2 位停止位)。

    • 无奇偶校验(HC-05 默认不启用校验,此参数同时表示校验方式为 “无”)。

关键结论:

  • 模块当前串口配置为 9600 波特率、8 位数据位、1 位停止位、无奇偶校验,与正常模式下的默认波特率一致(验证了前文 “正常模式默认波特率 9600” 的设定)。

三、修改 UART 配置:AT+UART=115200,0,0\r\n → 回复 OK

指令解析:

  • AT+UART=<波特率>,<数据位>,<停止位/校验位> 是设置 UART 参数的指令,用于修改模块的串口通信配置

如果我们要连接其他设备还有配置其他模块,如下: 

发送 AT+NAME="XXXX”,修改蓝牙模块名称为XXXX
发送 AT+ROLE=0,蓝牙模式即为从模式(从模式下的蓝牙设备是被其他设备(主设备)主动连接的设备。它处于等待连接状态,响应主设备的连接请求和指令,不能主动发起连接。例如,蓝牙耳机通常工作在从模式,等待手机等主设备来连接它,然后根据手机发送的指令进行操作,如播放音乐、接听电话等。)
发送 AT+CMODE=1,蓝牙连接模式为任意地址连接模式,也就是说该模块可以被任意蓝牙设备连接
发送 AT+PSWD=1234,蓝牙配对密码为 1234

发送AT+UART=9600,0,0蓝牙通信串口波特率为9600,停止位1位,无校验位

配置完成,需要重启一次

AT命令的详细说明


AT+ROLE设置主从模式:AT+ROLE?是查询主从状态;AT+ROLE=1是设成主,AT+ROLE=0是设成从,AT+ROLE=2设成回环角色(Slave-Loop(回环角色)--被动连接,接收远程蓝牙主设备数据并将数据原样返回给远程蓝牙)。

AT+RESET: HC-05复位

AT+VERSION?:获取HC-05的软件版本号,只能获取,不能修改。

AT+ORGL:恢复出厂默认设置,当把模块设置乱了,使用此命令进行恢复默认值,

AT+ADDR?:获取HC-05的蓝牙地址码,只能获取,不能修改。

AT+NAME?:获取HC-05的名字,AT+NAME=BSP-06,修改模块的名字为BSP-06,具体名字自行修改。

AT+CLASS?:设置查询设备的类型,尽量不要去修改此参数。默认是1F00。

AT+IAC?:查询设置查询访问码,默认是9E8B33,尽量不要去修改此参数。

AT+PSWD?:查询设置配对密码,AT+PSWD=“0000",密码要有双引号,密码是四位数字

AT+UARI: AT+UART?是查询当前模块的波特率, AT+UART=波特率是设置,

AT+CMODE:AT+CMODE?是查询当前连接模式。

AT+CMODE=0,1,2(0-一指定蓝牙地址连接模式(指定蓝牙地址由绑定指令设置)1-一任意蓝牙地址连接模式(不受绑定指令设置地址的约束)2--回环角色(Slave-Loop)默认连接模式:0)。

AT+BIND:AT+BIND?查询当前绑定地址,AT+BIND=NAP, UAP, LAP (用逗号隔开)。

AT+RMADD:从蓝牙配对列表中删除所有认证设备.

AT+STATE? :获取蓝牙模块工作状态.

AT+LINK=NAP,UAP,LAP:与远程设备建立连接。

AT+DISC:断开连接.

AT+RNAME? NAP, UAP, LAP:获取远程蓝牙设备名称.

AT+ADCN?:获取蓝牙配对列表中认证设备数。

AT+MRAD?获取最近使用过的蓝牙认证设备地址。

AT+INOM:设置查询模式,

AT+INOM=1.9,48(1-帶RSSI信号强度指示9:超过9个蓝牙设备响,应则终止查询,48:设定超时为48*1.28=61.44秒)

蓝牙项目步骤 

当我们的手机发送指令给蓝牙的时候,蓝牙模块会发送信息通过串口2发送给单片机,同时单片机通过串口1把数据发送到电脑

1.蓝牙模块AT模式基础配置 。

        蓝牙连接 ch340模块接线 TX、RX、VCC、GND、EN五根引脚 。

                                

        AT指令配置波特率、蓝牙名称、从模式、配对密码 ·

发送 AT+UART=115200,0,0将波特率设置为115200

发送 AT+NAME="SHAOROU”,修改蓝牙模块名称为SHAOROU

发送 AT+ROLE=0,蓝牙模式即为从模式

发送 AT+CMODE=1

发送 AT+PSWD=1234,蓝牙配对密码为 1234(密码四位数任意选择)

发送AT+UART=9600,0,0

重启一次:发送AT+RESET(HC-05复位)

2.蓝牙硬件连接32单片机

 因为这个电源线是默认通过转串口模块连接串口1的

所以蓝牙模块连接串口2对应PA2和PA3,串口2在APB1总线下别忘跟换时钟

3.初始化蓝牙连接串口的时钟,引脚和外设配置 

extern void my_usart2_init()
{GPIO_InitTypeDef GPIO_InitStructure;USART_InitTypeDef USART_InitStructure;NVIC_InitTypeDef NVIC_Initstruct;NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);//串口2的时钟在APB1总线下RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE);//PA2 TXGPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;  // TXGPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);//PA3 RXGPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;  // RXGPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);USART_InitStructure.USART_BaudRate = 9600;//和刚刚在串口调节助手上配置的波特率一样USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;USART_InitStructure.USART_Parity = USART_Parity_No;USART_InitStructure.USART_StopBits = USART_StopBits_1;USART_InitStructure.USART_WordLength = USART_WordLength_8b;USART_Init(USART2, &USART_InitStructure);USART_Cmd(USART2, ENABLE);USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);NVIC_Initstruct.NVIC_IRQChannel = USART2_IRQn;NVIC_Initstruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority = 0;NVIC_Initstruct.NVIC_IRQChannelSubPriority = 0;NVIC_Init(&NVIC_Initstruct);}
int main() 
{my_usart2_init();Led_Init();my_usart_init();printf("shao rou \r\n");while (1){}}
void USART2_IRQHandler()
{static char str;if(USART_GetITStatus(USART2, USART_IT_RXNE)  != RESET ){str =  USART_ReceiveData(USART2);printf("receive date: %c \r\n",str);if(str == '1'){GPIO_ResetBits(GPIOA, GPIO_Pin_1);printf("LED IS ON \r\n");}if(str == '0'){GPIO_SetBits(GPIOA, GPIO_Pin_1);printf("LED IS OFF \r\n");}USART_ClearITPendingBit(USART2, USART_IT_RXNE);}}

4.串口接收中断服务函数实现数据的接收和发送。(利用蓝牙调试助手app)

                    

ESP8266-01S wifi模块

                                                           

                                 

         ESP8266是实现wifi通讯的一个模块种类,有很多分类包含esp8266-12、esp8266-12E、ESP8266-015、esp32等等。esp8266-01由一颗esp8266作为主控再由一块fash作为存储芯片组成,带有板载芯片供电采用3.3V电压使用串口进行烧写程序和AT指令集调试,注意芯片一旦烧写了程序便不可使用AT指令集,需要重新刷回AT指令固件才可以使用AT指令集。

        WiFi通信的频段和蓝牙一样,都是2.4G免费频段,我们使用ESP8266-01S樟块,这款WiFi模块的林片是乐鑫公司设计的,中安信可公司生产的模组。相当于ARM公司设计芯片,ST公司生产STM32单片机。ESP8266-01S是基于乐鑫ESP8266芯片制造的一款WiFi通信模组,其内部集成了802.11b/g/n协议栈和TCP/P协议栈,具备完整的Wi-Fi和网络功能。但是多数人都喜欢拿它来做WiFi通信使用。

ESP8266-01s的三种工作模式

STA模式(station)

工作在STA模式下的ESP8266-01S模块就像你的手机一样,它可以接收你家无线路由器发出的WiF信号,实现了ESP8266-01S模块通过接收路由器的信号而能够上网,跟手机连WFi上网没区别,当然如果把ESP8266-01S模块按正确方式接在STM32单片机上,就可以实现STM32控制的比如灯、继电器、舵机等具有开关功能的远程控制。

AP模式(Wireless Access Point

工作在AP模式下的ESP8266-01S模块就像是一个手机热点一样,也像你家的简易版无线路由器,你自己的手机、Pad、笔记本电脑等都可以连接到此“热点",从而实现了手机、电脑等设备可以和ESP8266-01S模块进行局域网的无线通信。在AP模式下的ESP8266-01S模块是一个无线网络的创建者,可以理解为此时ESP8266-01S模块是被别的设备连接,即此时的ESP8266-01S模块是一个服务器端,为被他人连接的模式。 

STA+AP模式

两种模式共存,ESP8266-01S模块既可以通过路由器连接到互联网,也可以作为WiFi热点使其他设备连接到这个ESP8266-01S模块,实现广域网与局域网的无缝切换。

引脚接线图

 IO2就正常引脚使用,IO0烧录时接GND,运行时高挂,EN引脚接3.3V有效

电源供电不足会导致固件程序烧录失败烧录固件的时候会出现一直在等待上电情况,建议采用外部专用电源,使用TTL转串口模块烧录时可以用万用表测试一下TTL转USB模块的3.3V供电是不是达到了稳定的3.3V,如果没有的话需要把ESP8266-01S的VCC接到5V上。 该模块出厂时默认自带出厂固件的,但如果进行其他开发需要烧录固件,比如如果想用机智云结合ESP8266-01S开发就需要烧录机智云的固件(这个可以在机智云网站找到),如果想用ESP8266-01S把STM32的数据传到阿里云上,就需要烧录MQT的固件,因为传数据到阿里云上需要用到MQTT协议。

烧录固件

下载烧录固件软以及烧录固件程序、烧录完成测试 

AT指令

        CR(iarriage return):表示回车r
        LF(Line Feed):表示换行 \n
1.DOS和windows采用回车+换行(CR+LF)表示下一行
2.Unix/linux采用换行符(LF)表示下一行
3.MAC OS系统采用回车符(CR)表示下一行  

如何烧录?

                        

 按照上述表格要求与转串口模块接线进行烧录工作

在文件中找到烧录工具

 点击ok

选择AT固件,同时勾选40MHz,QIO,DoNotBin.并选择COM4,波特率是115200,然后点START开始烧录

弹出所烧录的信息

测试烧录固件完成,只需按时上表接四根线,插入电脑打开安信可串口助手

发送AT恢复ok烧录成功

因为这个wifi芯片是乐鑫的,所以要根据乐鑫的技术手册发送AT指令

ESP8266-01s wifi功能介绍

想象有一个大型的信息交流中心,也就是路由器,它就像是一个繁忙的邮局,能接收和分发各种信息包裹。现在有两台 “信息传递者”,一台是个人电脑(PC),另一台是 ESP8266 设备,它们都来到这个 “邮局”,登记并加入了这个信息交流网络。

在 PC 这边,你使用了一个专门的工具,这个工具就像是一个特殊的接待处,它可以设立一个 “接待站点”,也就是 TCP 服务器。这个 “接待站点” 有特定的地址和规则,就像邮局的窗口有编号,并且规定了如何接收和处理信件一样。

ESP8266 设备就像是一个带着信息包裹的送信人,它可以按照 “接待站点” 的地址和规则,把信息包裹准确地送到 PC 设立的 TCP 服务器那里。同时,PC 也可以通过这个 “接待站点” 给 ESP8266 设备回复信息,这样两者之间就可以进行顺畅的信息交流了。

总结来说,就是 PC 和 ESP8266 设备先连接到同一个网络(路由器),然后 PC 使用工具建立了一个可以接收和发送信息的站点(TCP 服务器),方便它们之间进行数据的传输和交互。

以下是将上述内容中TCP换为UDP后的解释: 还是以大型信息交流中心路由器比作邮局,PC和ESP8266设备作为两台“信息传递者”,它们都连接到了这个“邮局”所在的网络。 在PC端,使用网络调试工具建立一个UDP“服务站”。UDP就像是一种比较“随意”的信息传递方式,与TCP那种严谨的“接待站点”(TCP服务器)有所不同。UDP更像是一个开放的信息投递点,它没有像TCP那样严格的连接建立和确认机制。 当ESP8266设备要向PC发送信息时,它就像一个直接把信件扔到UDP“服务站”投递点的人,不关心投递点是否准备好接收,也不管信件是否能准确无误地被收到。同样,PC也可以通过这个UDP“服务站”向ESP8266设备发送信息,也是以一种相对随意的方式,不保证信息一定能送达对方,也不要求对方给出确认收到的回复。 也就是说,PC和ESP8266设备连接到同一网络(路由器)后,PC使用工具建立了一个基于UDP的信息交互点(UDP“服务站”),它们之间通过这种相对宽松、不那么可靠的方式进行数据的传输和交互,速度可能会比较快,但可能会存在信息丢失或出错的情况。

需要用的乐鑫的AT指令集和AT指令使用示例

根据AT指令使用示例查看TCP Client模式下怎么使用

1.配置 WiFi 模式

AT+CWMODE=3(既是客户端同时也是路由器下的wifi模式)

响应 :OK

2. 连接路由器

AT+CWJAP="SSID","password"

响应 :OK

(分为AT+CWJAP_CUR—临时连接 AP和AT+CWJAP_DEF—连接 AP,保存到 Flash,如果用临时连接指令下电的时候就不会默认连接了,如果使用第二个指令下电然后上电会自动连接wifi) 

CUR可填可不填,ssid是wifi的账号 pwd是wifi的密码,后面的中括号是可选项

3. 查询 ESP8266 设备的 IP 地址

 AT+CIFSR

响应 :

+CIFSR:APIP,"192.168.4.1"

+CIFSR:APMAC,"1a:fe:34:a5:8d:c6"

+CIFSR:STAIP,"192.168.3.133"

+CIFSR:STAMAC,"18:fe:34:a5:8d:c6"

OK  

因为我们选的是模式3,所以有两种模式,连接wifi之后当AP模式下(路由器模式下)的wifi的IP地址是多少MAC值是多少

以及当我是客户端模式下的wifi的IP地址是多少MAC值是多少

4. PC 与 ESP8266 设备连接同⼀路由器,在 PC 端使⽤⽹络调试⼯具,建⽴⼀个 TCP 服 务器。

-假设,PC 创建的服务器 IP 地址为 192.168.3.116,端⼝为 8080。

5. ESP8266 设备作为 TCP client 连接到上述服务器

AT+CIPSTART="TCP","192.168.3.116",8080  

响应 :

OK

6. ESP8266 设备向服务器发送数据

AT+CIPSEND=4 (目前是单连接)

>test

响应 : Recv 4 bytes

        SEND OK

注意: • 发送数据时,如果输⼊的字节数超过了设置⻓度(n):

        - 系统将提示 busy,并发送数据的前 n 个字节,发送完成后响应 SEND OK。

        - 超出⻓度的部分数据被认为是⽆效数据,不被接受。 

 发送1234时不能选择新行,回车也算一个

 根据AT指令使用示例查看UDP 传输模式下怎么使用

 UDP 传输不区分 server 或者 client ,由指令 AT+CIPSTART 建⽴传输。

1. 配置 WiFi 模式

AT+CWMODE=3

响应 :OK

2. 连接路由器

AT+CWJAP="SSID","password"

响应 :OK

3. 查询 ESP8266 设备的 IP 地址

AT+CIFSR

响应 :

+CIFSR:APIP,"192.168.4.1"
+CIFSR:APMAC,"e2:98:06:25:38:94"
+CIFSR:STAIP,"172.20.10.4"
+CIFSR:STAMAC,"e0:98:06:25:38:94"

OK

4. PC 与 ESP8266 设备连接同⼀路由器,在 PC 端使⽤⽹络调试⼯具,建⽴⼀个 UDP 传 输。 -

+CIFSR:STAIP,"172.20.10.4"这是ESP8266 设备以 STA方式连接到 Wi-Fi 后获取到的 IP 地址 ,也就是说,这个 172.20.10.4 是你当前设备在连接到 Wi-Fi 网络后被分配到的网络地址,就如同你在一个小区里有了一个特定的门牌号。,这意味着你的电脑在连接到同一个 Wi-Fi 网络(或者处于同一个局域网内)时,被分配到了 172.20.10.6 这个地址。

远端输入要与之通信的设备(如电脑)在该网络下的 IP 地址

假设,PC 创建的 UDP ⾃身 IP 地址为 192.168.101.116,端⼝为 8080。

5. 后⽂将基于前述步骤,介绍两种 UDP 通信的示例。

固定远端的 UDP 通信

1. 使能多连接

AT+CIPMUX=1

响应 :OK

 2. 创建 UDP 传输。例如,分配连接号为 4,指令如下:

AT+CIPSTART=4,"UDP","192.168.101.110",8080,1112,0

这里输入远端地址是相当于esp8266设备来说,电脑是远端的,所以连接远端地址要输入电脑的IP地址

响应 :

4,CONNNECT

OK

 3. 发送数据

AT+CIPSEND=4,7

由于是多连接,查看参数需要多加个网络连接ID号4

可变远端的 UDP 通信

这里可变的是端口而不是IP地址

与上面固定远端的UDP通信少了个步骤,可变远端的UDP通信是单连接(需要先配置成单连接AT+CIPMUX=1)

1. 创建 UDP 传输。

AT+CIPSTART="UDP","192.168.101.110",8080,1112,2

响应 : CONNNECT OK

 2. 发送数据

AT+CIPSEND=7

响应 : Recv 7 bytes SEND OK

这里发送给上面的端口,如果有两个端口的话可以进行更改

3. 发送数据到其他指定远端。例如,发数据到 192.168.101.111, 端⼝ 1000。

(可以同样IP的其他端口号发送数据)

AT+CIPSEND=7,"192.168.101.110",1000

响应 : Recv 7 bytes SEND OK

怎么实现可变远端呢?

这是正常情况下 ,现在将开个副本,将端口改变(两个远端都是连接esp8266的),从串口调节助手发送数据也能接收

现在不指定远端端口,发送数据,被8081端口接收到实现可变远端

4. 断开 UDP 传输  

AT+CIPCLOSE

响应 : CLOSED OK

透传

透传,即透明传输,指的是在通讯或数据传输过程中,不对传输的内容进行任何修改、处理或解释,而是将数据或信号原样传递、转发或传输到目的地址或设备。这种传输方式确保了数据的准确性和完整性,特别是在需要直接将数据传递给下游设备或系统时。

ESP8266 AT 默认仅在 TCP client 单连接或 UDP 传输模式时,⽀持透传。

TCP Client 单连接透传

1.配置 WiFi 模式

AT+CWMODE=3

响应 :OK

2.连接路由器

AT+CWJAP="SSID","password"

响应 :OK

3.查询 ESP8266 设备的 IP 地址 

AT+CIFSR

响应 :

+CIFSR:APIP,"192.168.4.1"

+CIFSR:APMAC,"1a:fe:34:a5:8d:c6" +CIFSR:STAIP,"192.168.3.133"

+CIFSR:STAMAC,"18:fe:34:a5:8d:c6"

OK

4.PC 与 ESP8266 设备连接同⼀路由器,在 PC 端使⽤⽹络调试⼯具,建⽴⼀个 TCP 服务器。 打开侦听

-假设,PC 创建的服务器 IP 地址为 192.168.3.116,端⼝为 8080。

5. ESP8266 设备作为 TCP client 连接到上述服务器

AT+CIPSTART="TCP","192.168.3.116",8080

响应 :OK

6.使能透传模式

AT+CIPMODE=1

响应 :OK

7. ESP8266 设备向服务器发送数据  

AT+CIPSEND(这里没有规定能发送多长字节)

注意这里透传模式下发送数据的最大长度

 

8.退出发送数据:

在透传发送数据过程中,若识别到单独的⼀包数据 “+++”,则退出透传发送。

如果使⽤键盘打字输⼊ “+++” ,可能耗时太⻓,不被认为是连续的三个 “+”,建议使⽤串⼝⼯具⼀次性发送 “+++”,并请注意不要携带空格或换⾏符等不可⻅字符。

之后,请⾄少间隔 1 秒,再发下⼀条 AT 指令。

注意:只是退出了透传模式下的传输数据状态

9.退出透传模式

AT+CIPMODE=0

响应 :OK

10.断开 TCP 连接

响应 : CLOSED OK

UDP 透传

1.配置 WiFi 模式

AT+CWMODE=3

响应 :OK

2.连接路由器

AT+CWJAP="SSID","password"

响应 :OK

3.查询 ESP8266 设备的 IP 地址 

AT+CIFSR

响应 :

+CIFSR:APIP,"192.168.4.1"

+CIFSR:APMAC,"1a:fe:34:a5:8d:c6" +CIFSR:STAIP,"192.168.3.133"

+CIFSR:STAMAC,"18:fe:34:a5:8d:c6"

OK

4. ESP8266 与 PC 对应端⼝建⽴固定对端的 UDP 传输  

AT+CIPSTART="UDP","192.168.4.2",1001,2233,0  

 响应 :OK

然后在服务器上点连接

5. 使能透传模式

AT+CIPMODE=1

 响应 :OK

6. ESP8266 设备向服务器发送数据

AT+CIPSEND  

7.退出发送数据:

在透传发送数据过程中,若识别到单独的⼀包数据 “+++”,则退出透传发送。

如果使⽤键盘打字输⼊ “+++” ,可能耗时太⻓,不被认为是连续的三个 “+”,建议使⽤串⼝⼯具⼀次性发送 “+++”,并请注意不要携带空格或换⾏符等不可⻅字符。

之后,请⾄少间隔 1 秒,再发下⼀条 AT 指令。

注意:只是退出了透传模式下的传输数据状态

8.退出透传模式

AT+CIPMODE=0

响应 :OK

9.断开 UDP 连接

响应 : CLOSED OK

多连接 TCP Server

ESP8266 AT 仅⽀持建⽴⼀个 TCP 服务器,且必须使能多连接,即允许连接多个 TCP client。

1. 配置 WiFi 模式

AT+CWMODE=3

响应 :OK

2. 使能多连接

AT+CIPMUX=1

响应 :OK

3. 建⽴ TCP server服务器(这里esp充当服务器)

AT+CIPSERVER=1,(记得设置端口号)端口号9898

响应 :OK

4.连接路由器并查询地址

AT+CWJAP="SSID","password"

AT+CIFSR

5.在 PC 端使⽤⽹络调试⼯具,建⽴⼀个 TCP client,连接 ESP8266 的 TCP server。

记得点连接

6.设置 TCP 服务器超时时间 

AT+CIPSTO 

响应:OK

这里是设置了十秒,超过十秒就会自动断开 

 

 7. 接收数据。 当 ESP8266 设备接收到服务器发来的数据,将提示如下信息:

8. 发送数据并实现变端

AT+CIPSEND=0, 4(表示给网络连接号0的设备发送四位的数据)

AT+CIPSEND=1, 4(表示给网络连接号1的设备发送四位的数据)

这里PC端是设备 

 

 9. 断开 UDP 传输

AT+CIPCLOSE=0

 分别发送AT+CIPCLOSE=0和AT+CIPCLOSE=1使两个设备都断开

 

相关文章:

STM32 串口USART

目录 常见的通信方式 串行通信和并行通信 全双工&#xff0c;半双工和单工通信 同步通信和异步通信 通信速率 常见的通信协议 串口基础知识 电平特性 串口传输协议 STM32F103的USART资源 端口引脚 数据寄存器单元 发送接收控制单元 实现串口发送 printf…...

数字IC后端项目典型问题之后端实战项目问题记录(2025.04.24)

今天给大家分享下近两天小编帮助学员解决的几个经典后端项目问题。希望能够对大家的学习和工作有所帮助。 Q1:在做a7top顶层物理验证Calibre LVS检查时提示NOT COMPARED&#xff0c;请问是什么原因&#xff1f; 我们在用calibre检查LVS后&#xff0c;其结果基本上就是以下三种…...

关于边缘计算盒子的外部接口保护

边缘计算盒子是一种基于边缘计算和人工智能技术的智能设备&#xff0c;它内置了灵活可配的多样化AI算法库&#xff0c;所以也被称为AI算法盒子或智能边缘分析一体机&#xff0c;可以将数据处理和分析的能力推至离数据源最近的边缘位置&#xff0c;提供高效的数据处理和实时响应…...

OCP考试需要注意什么?

一、OCP考试需要准备的资料 身份证件&#xff1a;携带有效的身份证件&#xff08;如身份证、护照等&#xff09;&#xff0c;以便在考试当天进行身份验证。确保身份证件在考试当天仍然有效&#xff0c;并且与报名时使用的证件一致。 准考证&#xff1a;打印并携带准考证&…...

git Http改用户下载

用原先别人账号,无权下更新 http方式设置自己账号 例如 git fetch --all 提示没有权限从 http://192.168.1.2/gitlab/项目路径.git下载 git remote set-url origin http://your-username192.168.1.2/gitlab/项目路径.git your-username修改成自己的git账号 需要输入一个Tok…...

postgres 导出导入(基于数据库,模式,表)

在 PostgreSQL 中&#xff0c;导出和导入数据库、模式&#xff08;schema&#xff09;或表的数据可以使用多种工具和方法。以下是常用的命令和步骤&#xff0c;分别介绍如何导出和导入整个数据库、特定的模式以及单个表的数据。 一、导出数据 1. 使用 pg_dump 导出整个数据库…...

把dll模块注入到游戏进程的方法_挂起进程注入

一. 概述 挂起进程注入是指在创建进程的时候把运行状态设置为挂起,然后创建一个远程线程,来注入。挂起进程注入作为远线程注入的一个补充,可以在进程创建的时候就注入,从而注入时间较早,不宜被拦截。易知挂起进程注入的局限性也就是如果进程已经启动,那么这种注入方式就…...

TypeScript 开发实战:如何安全替换字符串中的关键字

在 TypeScript 开发中&#xff0c;我们经常需要处理字符串替换的场景。最近我在开发一个表达式解析功能时&#xff0c;遇到了一个有趣的挑战&#xff1a;如何将用户输入的简化数学表达式&#xff08;如"sin"&#xff09;替换为标准形式&#xff08;如"Math.sin&…...

ES6 模块化 与 CommonJS 的核心概念解析

以下是关于 ES6 模块化 与 CommonJS 的核心概念解析、知识点总结及使用场景说明&#xff1a; 1. ES6 模块化与 CommonJS 是什么&#xff1f; ES6 模块化&#xff08;ECMAScript Modules, ESM&#xff09; 定义&#xff1a;ES6 标准引入的模块系统&#xff0c;使用 import 和 …...

【踩坑记录】stm32 jlink程序烧录不进去

最近通过Jlink给STM32烧写程序时一直报错&#xff0c;但是换一个其他工程就可以烧录&#xff0c;对比了一下jink配置&#xff0c;发现是速率选太高了“SW Device”&#xff0c;将烧录速率调整到10MHz以下就可以了...

CS144 Lab 6 实战记录:构建 IP 路由器

1 实验背景与目标 在 CS144 的 Lab 6 中&#xff0c;我们需要在之前实现的 NetworkInterface&#xff08;Lab 5&#xff09;基础上构建一个完整的 IP 路由器。路由器的主要任务是根据路由表将接收到的 IP 数据报转发到正确的网络接口&#xff0c;并发送给正确的下一跳&#xf…...

AI与智能能源管理:如何通过AI优化能源分配和消耗?

引言&#xff1a;能源管理面临的新挑战 在“双碳”目标持续推进的背景下&#xff0c;能源管理已经不再是简单的节电节水问题&#xff0c;而是关乎可持续发展和企业长期竞争力的核心议题。无论是工业园区、写字楼&#xff0c;还是家庭用户&#xff0c;能源的使用正在变得越来越复…...

【蓝桥杯】产值调整

产值调整 题目描述 偏远的小镇上&#xff0c;三兄弟共同经营着一家小型矿业公司“兄弟矿业”。公司旗下有三座矿山&#xff1a;金矿、银矿和铜矿&#xff0c;它们的初始产值分别用非负整数 A A A、 B B B 和 C C C 表示。这些矿山的产出是小镇经济的核心&#xff0c;支撑着…...

使用Next.js构建单页面React应用

最近遇到一个问题 突然要一个单页面的项目 用惯了Next.js 而 create-react-app 又不推荐且不灵活 最终找发现Nextjs也支持单页面应用 以下是使用Next.js构建单页面React应用过程 1 正常创建项目 (我选择的是Pages Router 而非 AppRoute) 2 修改配置文件 next.config.ts impor…...

Python字符串三剑客:len()、split()、join()深度解析

目录 一、len()&#xff1a;字符串的"测谎仪" 二、split()&#xff1a;字符串的"解剖刀" 参数解析&#xff1a; 实战场景&#xff1a; 三、join()&#xff1a;字符串的"缝合怪" 性能优势&#xff1a; 实战案例&#xff1a; 高级技巧&…...

大模型是如何生成内容的?

大模型&#xff08;如 GPT、Claude、LLaMA 等&#xff09;生成内容的过程&#xff0c;其实就是一个 逐词预测上下文推理 的过程。我们可以把它想象成一个“超级自完成引擎”&#xff1a;每一步都在问自己—— “在目前上下文下&#xff0c;最合理的下一个词是什么&#xff1f;”…...

Python元组全面解析:从基础到高级应用指南

一、元组基础概念与核心特性 1.1 元组的本质定义 元组&#xff08;Tuple&#xff09;是Python中重要的不可变序列类型&#xff0c;由多个元素组成的有序集合。其核心特性表现在&#xff1a; 元素按插入顺序存储&#xff0c;支持索引访问所有元素存储在连续内存空间&#xff…...

Docker部署DeepSeek常见问题及解决方案

在使用Docker部署DeepSeek的过程中,许多开发者可能会遇到一些常见问题。本文整理了几个高频问题及其解决方案,帮助大家更顺利地完成部署。 镜像拉取失败 问题现象 执行 docker pull 命令时,提示超时或镜像不存在。 可能原因 1. 网络环境不稳定,导致连接Docker Hub失败…...

身份证实名认证接口数字时代的信任基石-node.js实名认证集成

在互联网深度渗透生活的当下&#xff0c;从线上购物、社交娱乐到金融理财、政务办理&#xff0c;每一次指尖的触碰都在虚拟世界中留下痕迹。身份证实名认证作为连接现实身份与网络身份的桥梁&#xff0c;正以其不可替代的作用&#xff0c;重塑着数字时代的信任体系。它不仅是保…...

多维时序 | LightGBM多变量时序预测(Matlab完整源码和数据,适合基础小白研究)

多维时序 | LightGBM多变量时序预测&#xff08;Matlab完整源码和数据&#xff0c;适合基础小白研究&#xff09; 目录 多维时序 | LightGBM多变量时序预测&#xff08;Matlab完整源码和数据&#xff0c;适合基础小白研究&#xff09;效果一览基本介绍程序设计参考资料 效果一览…...

强化学习(Reinforcement Learning, RL)和深度学习(Deep Learning, DL)

强化学习&#xff08;Reinforcement Learning, RL&#xff09;和深度学习&#xff08;Deep Learning, DL&#xff09;是人工智能领域两个重要的研究方向&#xff0c;虽然二者可以结合&#xff08;如深度强化学习&#xff09;&#xff0c;但其核心思想、目标和应用场景存在本质区…...

图论---Prim堆优化(稀疏图)

题目通常会提示数据范围&#xff1a; 若 V ≤ 500&#xff0c;两种方法均可&#xff08;朴素Prim更稳&#xff09;。 若 V ≤ 1e5&#xff0c;必须用优先队列Prim vector 存图。 #include <iostream> #include <vector> #include <queue> #include <…...

【优秀三方库研读】【C++基础知识】odygrd/quill -- 折叠表达式

compute_encoded_size_and_cache_string_lengths 方法中这段代码是一个C的折叠表达式&#xff08;fold expression&#xff09;的应用&#xff0c;用于计算多个参数编码后的总大小。下面我将详细解释这段代码的每个部分&#xff0c;并说明为什么这样写。 代码如下&#xff1a; …...

优化Nginx的下载功能

缘起&#xff1a; 我购置了一台阿里云ECS&#xff0c;其EIP带宽3m/s&#xff0c;但是在其上的作为下载文件的服务器nginx提供的下载速度仅有几百KB。 分析&#xff1a; 既然没有达到带宽瓶颈&#xff0c;肯定存在优化的空间。浮现脑海的想法&#xff0c;nginx没有进行最佳配置…...

Vue3集成浏览器API实时语音识别

效果示例 用法 <!-- 浏览器语音识别 --> <BrowserSpeechRecognitionModal v-if"showModal" :isOpen"showModal" close"showModal false" confirm"handleRecognitionResult" />const showModal ref(false); const input…...

Python3 基础:函数定义与调用

Python3 基础&#xff1a;函数定义与调用 什么是函数&#xff1f;一、函数的定义二、函数的调用三、函数参数3.1位置参数3.2关键字参数3.3默认参数值3.4可变数量的参数args&#xff1a;接收任意数量的位置参数**kwargs&#xff1a;接收任意数量的关键字参数 3.5 综合使用各种参…...

Vue 2 的响应式 API 和 Vue 3 的组合式 API 的详细对比,从核心机制、使用方式、代码示例及优缺点展开

以下是 Vue 2 的响应式 API 和 Vue 3 的组合式 API 的详细对比&#xff0c;从核心机制、使用方式、代码示例及优缺点展开&#xff1a; 1. Vue 2 的响应式 API 核心机制 基于 Object.defineProperty&#xff1a; 通过劫持对象的 getter 和 setter 实现数据变化追踪。限制&…...

修改了Element UI中组件的样式,打包后样式丢失

修改了Element UI中组件的样式&#xff0c;在本地运行没有问题&#xff0c;但是打包到线上发现样式丢失&#xff08;样式全部不生效、或者有一部分生效&#xff0c;一部分不生效&#xff09;&#xff0c;问题在于css的加载顺序导致代码编译后样式被覆盖了&#xff0c; 解决办法…...

大模型工业化元年:GPT-5开启通用AI新纪元,中国技术如何破局?

过去一周&#xff0c;AI领域的焦点无疑是OpenAI发布的GPT-5预览版&#xff0c;以及全球大模型技术从实验室迈向工业化的关键转折。这场变革不仅标志着通用人工智能&#xff08;AGI&#xff09;的进一步逼近&#xff0c;更掀起了全球产业链的竞争与反思。本文将从技术突破、产业…...

离线电脑安装python包

离线电脑安装python第三方库 在联网电脑上下载Python包 使用pip安装所需的包&#xff0c;例如 pip install requests numpy导出已安装的包列表 pip freeze > requirements.txt根据requirements.txt下载包及其所有依赖项到指定目录&#xff1a; pip download -r require…...

【Unity AR开发插件】一、高效热更新:Unity AR 插件结合 HybridCLR 与 ARFoundation 的开源仓库分享

摘要 本篇博客详细介绍了我基于 HybridCLR 与 AR Foundation 的 Unity AR 开发插件&#xff0c;旨在为开发者提供高效的跨平台热更新方案。文章从背景与动机出发&#xff0c;覆盖一键安装工具、环境配置、热更新数据制作与示例程序运行等核心模块&#xff0c;并展示代码结构与使…...

深入浅出学会函数(下)

5. return语句 在函数的设计中&#xff0c;函数中经常会出现return语句&#xff0c;这里讲一下return语句使用的注意事项。 return 后面可以是一个数值&#xff0c;也可以是一个表达式&#xff0c;如果是表达式先执行表达式&#xff0c;再返回表达式的结果。return 后面也可以…...

架构-软件工程

一、软件过程模型&#xff08;核心高频考点&#xff09; 1. 瀑布模型 知识点&#xff1a;严格分阶段&#xff08;需求→设计→编码→测试→维护&#xff09;&#xff0c;前一阶段输出是后一阶段输入&#xff0c;阶段间因果紧密&#xff0c;适合需求明确且稳定的项目。缺点&am…...

Redis 及其在系统设计中的作用

什么是Redis Redis 是一个开源的内存数据结构存储系统&#xff0c;可用作数据库、缓存和消息代理。它因其快速的性能、灵活性和易用性而得到广泛应用。 Redis 数据存储类型 Redis 允许开发人员以各种数据结构&#xff08;例如字符串、位图、位域、哈希、列表、集合、有序集合…...

运维打铁:Centos 7 使用yum安装 mysql5.7

文章目录 一、安装前信息说明二、安装步骤1. 下载并安装官网 RPM 安装包2. 修改配置文件 /etc/my.cnf3. 创建 MySQL 数据相关目录并授权4. 启动 MySQL 服务 三、修改数据库访问密码1. 修改配置文件 /etc/my.cnf2. 重启 MySQL 服务3. 登录数据库并修改密码4. 恢复配置文件并重启…...

第二章:MCP服务器分类

Chapter 2: MCP服务器分类 &#x1f31f; 从上一章到本章 在第一章&#xff1a;Model Context Protocol (MCP)中&#xff0c;我们学习了如何通过MCP让LLM安全访问文件系统。现在&#xff0c;让我们想象一个更复杂的需求&#xff1a;假设你需要让LLM同时处理文件、查询数据库、…...

遨游三防|30200mAh、双露营灯三防平板,见证堆料天花板

在工业4.0与智能化转型的浪潮中&#xff0c;专业设备对性能、防护及场景适应性的要求日益严苛。遨游通讯作为国家级高新技术企业&#xff0c;依托“危、急、特”场景的深耕经验&#xff0c;推出的旗舰级产品AORO-P300三防平板&#xff0c;以30200mAh超大容量电池、双露营灯设计…...

OFDM 信道表示(3)

上节我们令得到频域相关系数与PDP是一对傅里叶变换对。这次我们令即只考虑同一个RE上随时间变化得过程。 为接收信号自相关函数&#xff0c;令即为上式 所以可得Doppler 功率谱和子相关函数一对傅里叶变换对。 上面给出多径DPL信道接受信号表示&#xff0c;其中为t时间多径时延…...

MongoDB副本集搭建与核心机制

一、节点架构解析 1.1 节点角色分工 主节点&#xff08;Primary&#xff09; 唯一写入口&#xff1a;处理所有写操作&#xff08;插入/更新/删除&#xff09; Oplog生成器&#xff1a;记录操作日志到local.oplog.rs集合 同步中枢&#xff1a;向所有从节点推送oplog变更 典型…...

深度学习-数值稳定性和模型初始化

到目前为止&#xff0c;我们实现的每个模型都是根据某个预先制定的分布来初始化模型的参数&#xff0c;有人会认为初始化方案时理所当然的&#xff0c;忽略了如何做出这些选择的细节&#xff0c;甚至有人可能会觉得&#xff0c;初始化方案的选择并不是特别重要&#xff0c;实际…...

详解Linux中的定时任务管理工具crond

在 Linux 容器环境中&#xff0c;/etc/cron.d/ 目录可能不存在&#xff0c;特别是在精简的容器镜像&#xff08;如 Alpine、BusyBox 或某些定制化的镜像&#xff09;中。这是因为容器通常追求轻量级&#xff0c;默认不包含完整的 cron 系统&#xff08;如 cronie 或 vixie-cron…...

【element plus】解决报错error:ResizeObserver loop limit exceeded的问题

当我们在使用element plus框架时&#xff0c;有时会遇到屏幕突然变暗&#xff0c;然后来一句莫名其妙的报错ResizeObserver loop limit exceeded&#xff0c;其实这是因为改变屏幕大小时el-table导致的报错 网上给出了几种解决方案&#xff0c;我试了其中两种可以实现 方案一&…...

GD32E23x flash作为静态存储的读写操作

目录 一、前言 二、GD32E23x flash扇区地址划分 三、GD32E23x 固件库下载 四、GD32E23x falsh擦写操作函数封装 五&#xff0c;引用示例 一、前言 在只有芯片没有外部存储时需要存储一些配置信息&#xff0c;使用flash进行存储是很好的选择了&#xff0c;在GD32E23x中以flash…...

空闲列表:回收和再利用

空闲列表&#xff1a;回收和再利用 手动与自动内存管理 手动管理&#xff1a;程序员需要明确地分配和释放内存。自动管理&#xff1a;例如使用垃圾收集器(GC)&#xff0c;它能够自动检测并回收未使用的对象&#xff0c;不需要程序员干预。 对于某些数据结构如B树&#xff0c;…...

功能脑网络较新的方法[和ai讨论的方向和学习资源]

文章目录 前言和回顾代码实现ai 提问大脑连通性分析方法扩展与分类指南一、现有方法的补充与分类1. 补充的其他连通性方法2. 分类框架 二、近年来的新方法&#xff08;2019年后&#xff09;1. 相位动力学扩展2. 信息论与复杂度3. 基于图论与网络科学4. 动态系统与因果推断 三、…...

【MongoDB + Spark】 技术问题汇总与解决方案笔记

场景背景 最近练手项目&#xff1a;Spark 结合 MongoDB 构建商品推荐系统的过程中&#xff0c;过程中出现多种环境配置与兼容性问题&#xff0c;主要涉及 MongoDB 连接、版本兼容性、Casbah 驱动使用问题等。汇总调试过程中遇到的常见错误及其解决方案&#xff0c;供参考复用。…...

给git配置SSH(github,gitee)

更多个人笔记&#xff1a;&#xff08;仅供参考&#xff0c;非盈利&#xff09; gitee&#xff1a; https://gitee.com/harryhack/it_note github&#xff1a; https://github.com/ZHLOVEYY/IT_note 本文基于mac&#xff0c;linux和win可以参考 个人同时配置gitee和github的ss…...

Linux基础使用-笔记

1. 文件和目录操作 查看当前目录&#xff1a;pwd 命令用于显示当前工作目录的完整路径。 pwd切换目录&#xff1a;cd 命令用于切换工作目录。 # 切换到指定目录 cd /home/user/Documents # 切换到上一级目录 cd .. # 切换到用户主目录 cd ~列出目录内容&#xff1a;ls 命令用…...

什么是Maven

Maven的概念 Maven是一个一键式的自动化的构建工具。Maven 是 Apache 软件基金会组织维护的一款自动化构建工具&#xff0c;专注服务于Java 平台的项目构建和依赖管理。Maven 这个单词的本意是&#xff1a;专家&#xff0c;内行。Maven 是目前最流行的自动化构建工具&#xff0…...

DNS主从同步及解析

DNS 域名解析原理 域名系统的层次结构 &#xff1a;DNS 采用分层树状结构&#xff0c;顶级域名&#xff08;如.com、.org、.net 等&#xff09;位于顶层&#xff0c;下面是二级域名、三级域名等。例如&#xff0c;在域名 “www.example.com” 中&#xff0c;“com” 是顶级域名…...