当前位置: 首页 > 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使两个设备都断开

 

相关文章:

  • 【嵌入式系统设计师(软考中级)】第二章:嵌入式系统硬件基础知识(2)
  • Concepts (C++20)
  • 如何在 Postman 中,自动获取 Token 并将其赋值到环境变量
  • 每日c/c++题 备战蓝桥杯 ([洛谷 P1226] 快速幂求模题解)
  • Java 富文本转word
  • java方法引用
  • static成员
  • jQuery的removeClass(),一次删除多个class
  • 4.2 Prompt工程与任务建模:高效提示词设计与任务拆解方法
  • 【学习笔记】文件包含漏洞--相关习题
  • 全面解析 UGC 平台物品冷启动策略
  • 【Linux内核】内核中的中断管理
  • Activepieces - 开源自动化工具
  • 【动手学大模型开发】什么是大语言模型
  • 【阿里云大模型高级工程师ACP习题集】2.4 自动化评测答疑机器人的表现(⭐️⭐️⭐️ 重点章节!!!)
  • Java Collections工具类指南
  • 计算机组成与体系结构:直接内存映射(Direct Memory Mapping)
  • Spring Boot YML配置值“011“在代码中变为9的问题解析
  • leetcode 2799. 统计完全子数组的数目 中等
  • 玩转Docker | Docker部署LMS轻量级音乐工具
  • 这个器官健康的人,不容易得抑郁症
  • 中宣部版权管理局:微短剧出海面临版权交易不畅、海外维权较难等难题
  • 《不眠之夜》上演8年推出特别版,多业态联动形成戏剧经济带
  • 朝中社发表评论文章,谴责美军部署B1-B轰炸机至日本
  • 上海市闵行区原二级巡视员琚汉铮接受纪律审查和监察调查
  • 生态环境部:我国正在开展商用乏燃料后处理厂的论证