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);//?aà?Dèòa????×a??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使兩個設備都斷開

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/78539.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/78539.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/78539.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Taro on Harmony :助力業務高效開發純血鴻蒙應用

背景 純血鴻蒙逐漸成為全球第三大操作系統&#xff0c;業界也掀起了適配鴻蒙原生的浪潮&#xff0c;用戶遷移趨勢明顯&#xff0c;京東作為國民應用&#xff0c;為鴻蒙用戶提供完整的購物體驗至關重要。 &#xfeff; &#xfeff;&#xfeff; 去年 9 月&#xff0c;京東 AP…

gem5-gpu教程05 內存建模

memory-modeling|Details on how memory is modeled in gem5-gpu gem5-gpu’s Memory Simulation gem5-gpu在很大程度上避開了GPGPU-Sim的單獨功能模擬,而是使用了gem5的執行中執行模型。因此,當執行存儲/加載時,內存會被更新/讀取。沒有單獨的功能路徑。(順便說一句,這…

【python】lambda用法(結合例子理解)

目錄 lambda 是什么? 為什么叫 lambda? 語法 舉例 1. 最簡單的 lambda:單個數字處理 2. 用 lambda 排序一組字符串(按照長度排序) 3. 在列表里找出絕對值最小的數字 4. 給 map() 用 lambda 5. 組合使用:篩選出偶數 lambda 和 def 的對比 lambda 適合用在什么地…

【ROS2】機器人操作系統安裝到Ubuntu22.04簡介(手動)

主要參考&#xff1a; https://book.guyuehome.com/ROS2/1.系統架構/1.3_ROS2安裝方法/ 官方文檔&#xff1a;https://docs.ros.org/en/humble/Installation.html 虛擬機與ubuntu系統安裝 略&#xff0c;見參考文檔 ubutun換國內源&#xff0c;略 1. 設置本地語言 確保您有…

C 調用 C++:extern “C” 接口詳解與實踐 C/C++混合編譯

C 調用 C&#xff1a;extern “C” 接口詳解與實踐 核心問題在于 C 編譯器會對函數名進行“修飾”&#xff08;Name Mangling&#xff09;以支持函數重載等特性&#xff0c;而 C 編譯器則不會。此外&#xff0c;C 語言本身沒有類、對象等概念。為了解決這個問題&#xff0c;我…

汽車制造行業如何在數字化轉型中抓住機遇?

近年來&#xff0c;隨著新一輪科技革命和產業變革的深入推進&#xff0c;汽車制造行業正迎來一場前所未有的數字化轉型浪潮。無論是傳統車企還是新勢力品牌&#xff0c;都在積極探索如何通過數字化技術提升競爭力、開拓新市場。那么&#xff0c;在這場變革中&#xff0c;汽車制…

k8s學習記錄(五):Pod親和性詳解

一、前言 上一篇文章初步探討了 Kubernetes 的節點親和性&#xff0c;了解到它在 Pod 調度上比傳統方式更靈活高效。今天我們繼續討論親和性同時Kubernetes 的調度機制。 二、Pod親和性 上一篇文章中我們介紹了節點親和性&#xff0c;今天我們講解一下Pod親和性。首先我們先看…

HarmonyOS:Navigation實現導航之頁面設置和路由操作

導讀 設置標題欄模式設置菜單欄設置工具欄路由操作頁面跳轉頁面返回頁面替換頁面刪除移動頁面參數獲取路由攔截 子頁面頁面顯示類型頁面生命周期頁面監聽和查詢 頁面轉場關閉轉場自定義轉場共享元素轉場 跨包動態路由系統路由表自定義路由表 示例代碼 Navigation組件適用于模塊…

雪花算法

目錄 一、什么是雪花算法 二、使用雪花算法 ?三、使用UUID 使用自增主鍵是數據庫中常用的唯一標識&#xff0c;今天嘗試使用mybatisplus來實現三種方式的主鍵ID 使用起來也很簡單 用注解指定一下使用那種方式的主鍵 一、什么是雪花算法 一種特殊的算法可以計算得到一個唯…

HarmonyOs @hadss/hmrouter路由接入

參考文檔&#xff1a;官方文檔 在根目錄oh-package.json5配置 {"dependencies": {"hadss/hmrouter": "^1.0.0-rc.11"} }加入路由編譯插件 hvigor/hvigor-config.json文件 {"dependencies": {"hadss/hmrouter-plugin": &…

C++學習筆記(三十八)——STL之修改算法

STL 算法分類&#xff1a; 類別常見算法作用排序sort、stable_sort、partial_sort、nth_element等排序搜索find、find_if、count、count_if、binary_search等查找元素修改copy、replace、replace_if、swap、fill等修改容器內容刪除remove、remove_if、unique等刪除元素歸約for…

Crawl4AI 部署安裝及 n8n 調用,實現自動化工作流(保證好使)

Crawl4AI 部署安裝及 n8n 調用&#xff0c;實現自動化工作流&#xff08;保證好使&#xff09; 簡介 Crawl4AI 的介紹 一、Crawl4AI 的核心功能 二、Crawl4AI vs Firecrawl Crawl4AI 的本地部署 一、前期準備 二、部署步驟 1、檢查系統的網絡環境 2、下載 Crawl4AI 源…

32單片機——外部中斷

STM32F103ZET6的系統中斷有10個&#xff0c;外部中斷有60個 1、中斷的概念 中斷是為使單片機具有對外部或內部隨機發生的事件實時處理而設置的&#xff0c;中斷功能的存在&#xff0c;很大程度上提高了單片機處理外部或內部事件的能力 eg&#xff1a;&#xff1a;你打開火&…

UG NX二次開發(C#)-獲取具有相同屬性名稱的體對象

文章目錄 1、前言2、在UG NX中的屬性的賦予3、通過UG NX二次開發獲取相同屬性的體對象1、前言 UG NX中每個對象都可以屬于屬性的,包括體、面、邊、特征、基準等。在QQ群中有個群有提出一個問題,就是獲取相同屬性的體對象,然后將這個體對象導出到一個part文件中。我們今天先…

手動實現legend 與 echarts圖交互 通過元素和js事件實現圖標某項的高亮 顯示與隱藏

通過html實現legend的樣式 提供調用echarts的api實現與echarts圖表交互的效果 實現餅圖element實現類似于legend與echartstu表交互效果 效果圖 配置代碼 <template><div style"height: 400px; width: 500px;background-color: #CCC;"><v-chart:opti…

SpringBoot與BookKeeper整合,實現金融級別的日志存儲系統

BookKeeper的優勢 高吞吐量和低延遲 分布式架構: Apache BookKeeper采用分布式的架構設計&#xff0c;能夠支持高并發的寫入和讀取操作。 批量寫入: 支持批量寫入日志條目&#xff0c;顯著提高寫入效率。 異步I/O: 使用異步I/O操作&#xff0c;減少等待時間&#xff0c;提升…

【Bug】 [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed

當你在進行深度學習相關操作時&#xff0c;若因缺少本地的 CA 證書而無法下載資源&#xff0c;下面為你介紹幾種解決辦法&#xff1a; 方法一&#xff1a;更新 CA 證書 在大多數 Linux 發行版中&#xff0c;你可以使用包管理器來更新 CA 證書。例如&#xff0c;在基于 Debian…

Vue3中AbortController取消請求的用法詳解

在 Vue3 中&#xff0c;AbortController 用于取消 fetch 請求&#xff0c;避免組件卸載后仍執行異步操作導致的潛在問題&#xff08;如內存泄漏或更新已銷毀組件的狀態&#xff09;。以下是詳細用法和最佳實踐&#xff1a; 一、基本用法 創建 AbortController 實例 在組件 setu…

【刷題Day26】Linux命令、分段分頁和中斷(淺)

說下你常用的 Linux 命令&#xff1f; 文件與目錄操作&#xff1a; ls&#xff1a;列出當前目錄的文件和子目錄&#xff0c;常用參數如-l&#xff08;詳細信息&#xff09;、-a&#xff08;包括隱藏文件&#xff09;cd&#xff1a;切換目錄&#xff0c;用于在文件系統中導航m…

Spring Boot 參考文檔導航手冊

&#x1f4da; Spring Boot 參考文檔導航手冊 &#x1f5fa;? ? 新手入門 &#x1f476; 1?? &#x1f4d6; 基礎入門&#xff1a;概述文檔 | 環境要求 | 安裝指南 2?? &#x1f527; 實操教程&#xff1a;上篇 | 下篇 3?? &#x1f680; 示例運行&#xff1a;基礎篇 …