一:藍牙模塊HC-05 1:硬件引腳配置: | 標號 | PIN | 說明 | |------|-------|---------------------------------------| | 1 | START | 狀態引出引腳(未連接/連接輸出信號時) | | 2 | RXE | 接收端 | | 3 | TXE | 發送端 | | 4 | GND | 模塊供電負載 | | 5 | VCC | 模塊供電正極 | | 6 | EN | 繼電器(需進入命令模式時撥3.3V) |
(上表中VCC接5v,EN接3.3v,START不接)?
2:AT設置工作橫式 ·
1.自動連接橫式,又稱為透傳模式。
2.AT橫式 (AT mode)進入AT橫式的兩種方法:
1.按住引腳或EN引腳拉高 (接入3.3V),此時燈是慢閃,進入AT模式,波特率默認是38400;這個模式我們叫做原始模式,原始模式下一直處于AT命令模式狀態。
2.HC-05上電開機,紅燈快閃,按住按鍵戲EN引腳拉高 (接入3.3V) , HC.05進入AT命令模式,默認波特率是9600, 這種模式下是正常模式,正常模式下只有按住按鍵或拉高EN引1腳才處于AT命令狀態。
|注意:如果波待率沒有設置正確,AT命令是執行無效的。
(
HC-05 藍牙模塊工作模式詳解
工作模式分類
-
自動連接模式(透傳模式)
-
模塊默認工作狀態
-
自動搜索并連接配對設備
-
建立雙向數據傳輸通道(串口透傳)
-
指示燈狀態:紅燈快閃(約1秒2次)
-
-
AT模式(配置模式)
-
用于參數配置的專用模式
-
通過AT指令修改名稱、波特率、配對密碼等
-
不支持數據傳輸
-
指示燈狀態:慢閃(約2秒1次)
-
AT模式進入方法
方法1:原始AT模式(永久配置狀態)
項目 | 說明 |
---|---|
進入條件 | 上電前按住按鍵或將EN引腳接3.3V高電平 |
指示燈 | 慢閃(持續狀態) |
波特率 | 固定38400 |
特性 | 模塊始終處于AT命令狀態,適合批量燒錄配置 |
退出方式 | 必須斷電重啟(不按按鍵) |
?
方法2:臨時AT模式(動態切換狀態)
項目 | 說明 |
---|---|
進入條件 | 正常啟動后(紅燈快閃時),按住按鍵或拉高EN引腳至3.3V |
指示燈 | 快閃→慢閃(狀態切換) |
波特率 | 默認96000(可修改) |
特性 | 僅當按鍵/EN保持高電平時處于AT狀態,松開即返回透傳模式 |
退出方式 | 松開按鍵/EN引腳拉低 |
關鍵注意事項
-
波特率匹配
-
原始模式:必須使用38400
-
臨時模式:默認96000(除非已修改)
-
不匹配將導致AT指令無響應
-
-
電氣特性
-
EN引腳需穩定接入3.3V(不可浮空)
-
電壓超過3.3V可能損壞模塊
-
-
指令格式要求
-
所有AT指令必須以換行符結束(
\r\n
) -
參數需嚴格遵循格式(如
AT+NAME="HC05"
)
-
-
配置保存機制
-
原始模式:配置即時生效(也需要重啟加
AT+RESET
) -
臨時模式:需發送
AT+RESET
保存配置
-
)
?
3.基本配置(所有AT命令都必須換行)
正常模式下是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+NAME="XXXX",修改藍牙模塊名稱為XXXX
·發送 AT+ROLE=0, 藍牙模式即為從模式
。發送AT+CMODE=1, 藍牙連接模式為任意地址連接模式,也就是說該模塊可以被任意藍牙設備連接
。發送 AT+PSWD=1234, 藍牙配對密碼為 1234
·發送 AT+UART=9600, 0, 0, 藍牙通信串口波特率為 9600,停止位1位,無校驗位
配置完成,需要重啟一次?AT+RESET
4:?藍牙項目步驟
·1.藍牙模塊AT模式基礎配置
。 1.藍牙連接 ch340模塊接線 TX,RX、VCC、GND、EN五根引腳
。 2.AT指令配置波特率、藍牙名稱、從模式、配對密碼
?2.藍牙硬件連接32單片機TX,RX、VCC、GND、四根引腳
·3.初始化藍牙連接申口的時鐘,引腳和外設配置
·4.串口接收中斷服務函數實現數據的接收和發送
usart.c
#include "stm32f10x.h"
#include "usart.h"
#include "stdio.h"void my_usart2_Init()//千萬不要和32庫里面串口定于的名字一樣,不然會報錯
{GPIO_InitTypeDef my_usart_Initstruct;USART_InitTypeDef USART_Initstruct;NVIC_InitTypeDef NVIC_Initstruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE );NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);my_usart_Initstruct.GPIO_Pin=GPIO_Pin_2 ;my_usart_Initstruct.GPIO_Mode=GPIO_Mode_AF_PP ;my_usart_Initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA, &my_usart_Initstruct);my_usart_Initstruct.GPIO_Pin=GPIO_Pin_3;my_usart_Initstruct.GPIO_Mode=GPIO_Mode_IN_FLOATING ;GPIO_Init(GPIOA, &my_usart_Initstruct);USART_Initstruct.USART_BaudRate=9600;USART_Initstruct.USART_HardwareFlowControl= USART_HardwareFlowControl_None ;USART_Initstruct.USART_Mode= USART_Mode_Rx | USART_Mode_Tx;USART_Initstruct.USART_Parity= USART_Parity_No;USART_Initstruct.USART_StopBits=USART_StopBits_1 ;USART_Initstruct.USART_WordLength=USART_WordLength_8b;USART_Init(USART2,&USART_Initstruct );USART_Cmd(USART2, ENABLE);USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);NVIC_Initstruct.NVIC_IRQChannel= USART2_IRQn ;NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority=0;NVIC_Initstruct.NVIC_IRQChannelSubPriority=0;NVIC_Initstruct.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_Initstruct);}void my_usart_Init()//千萬不要和32庫里面串口定于的名字一樣,不然會報錯
{GPIO_InitTypeDef my_usart_Initstruct;USART_InitTypeDef USART_Initstruct;NVIC_InitTypeDef NVIC_Initstruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_USART1,ENABLE);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);my_usart_Initstruct.GPIO_Pin=GPIO_Pin_9 ;my_usart_Initstruct.GPIO_Mode=GPIO_Mode_AF_PP ;my_usart_Initstruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA, &my_usart_Initstruct);my_usart_Initstruct.GPIO_Pin=GPIO_Pin_10 ;my_usart_Initstruct.GPIO_Mode=GPIO_Mode_IN_FLOATING ;GPIO_Init(GPIOA, &my_usart_Initstruct);USART_Initstruct.USART_BaudRate=115200;USART_Initstruct.USART_HardwareFlowControl= USART_HardwareFlowControl_None ;USART_Initstruct.USART_Mode= USART_Mode_Rx | USART_Mode_Tx;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);USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);NVIC_Initstruct.NVIC_IRQChannel= USART1_IRQn ;NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority=0;NVIC_Initstruct.NVIC_IRQChannelSubPriority=0;NVIC_Initstruct.NVIC_IRQChannelCmd=ENABLE;NVIC_Init(&NVIC_Initstruct);}
void My_Usart_Send_Byte(USART_TypeDef* USARTx, uint16_t Data)
{USART_SendData( USARTx, Data);while(USART_GetFlagStatus( USARTx, USART_FLAG_TXE) != SET);}void My_Usart_Send_Sting(USART_TypeDef* USARTx,char * str)
{uint16_t i=0;do{My_Usart_Send_Byte(USARTx,*(str+i));i++;}while(*(str+i) != '\0');while(USART_GetFlagStatus( USARTx, USART_FLAG_TC) != SET);}int fputc(int ch, FILE * p)
{USART_SendData( USART1, (u8)ch);while(USART_GetFlagStatus( USART1, USART_FLAG_TXE) != SET);return ch;}void USART1_IRQHandler()
{char str;if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET){str=USART_ReceiveData(USART1);printf("shuju=%c\r\n",str);if(str=='0'){GPIO_ResetBits( GPIOA, GPIO_Pin_1);printf("LED IS ON\r\n");}if(str=='1'){GPIO_SetBits( GPIOA, GPIO_Pin_1);printf("LED IS OFF\r\n");}USART_ClearITPendingBit(USART1,USART_IT_RXNE);}}void USART2_IRQHandler()
{char str;if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET){str=USART_ReceiveData(USART2);printf("shuju=%c\r\n",str);if(str=='0'){GPIO_ResetBits( GPIOA, GPIO_Pin_1);printf("LED IS ON\r\n");}if(str=='1'){GPIO_SetBits( GPIOA, GPIO_Pin_1);printf("LED IS OFF\r\n");}USART_ClearITPendingBit(USART2,USART_IT_RXNE);}}
?usart.h
#ifndef USART_H_
#define USART_H_void my_usart_Init(void);void my_usart2_Init(void);
void My_Usart_Send_Byte(USART_TypeDef* USARTx, uint16_t Data);
void My_Usart_Send_Sting(USART_TypeDef* USARTx, char * str);#endif
main.c
#include "stm32f10x.h"
#include "main.h"
#include "led.h"
#include "Bear.h"
#include "key.h"
#include "relay.h"
#include "shake.h"
#include "wireless.h"
#include "exti_key.h"
#include "usart.h"
#include "stdio.h"void delay(uint16_t time)//延時1ms 軟件延時粗延時
{uint16_t i=0;while(time --){i=12000;while(i --);}}int main()
{my_usart_Init();my_usart2_Init();LED_Init();// My_Usart_Send_Byte( USART1, 'A');
// My_Usart_Send_Byte( USART1, 'B');
// My_Usart_Send_Byte( USART1, 'C');// My_Usart_Send_Sting( USART1, "kobe \r\n");printf("kobe is king \r\n");while(1){
// USART_SendData( USART1, 'A');}}
今日心得
1:用戶提到AT模式使用的是38400波特率,但查詢UART設置時返回的卻是9600?
核心原因:
-
雙波特率機制:
-
AT模式波特率:固定38400(進入配置模式時使用)
-
工作模式波特率:可配置(透傳模式使用的波特率)
-
-
AT+UART? 命令的本質:
-
查詢的不是當前AT模式波特率
-
查詢的是透傳模式(工作模式)的波特率設置
-
?
-
??
AT+UART?
?只顯示工作模式波特率,不顯示AT模式波特率 -
? AT模式波特率固定為38400且不可更改
-
? 您看到的9600是模塊在透傳模式下的通信波特率
-
? 您的所有AT命令執行成功(每個都返回OK)
使用建議:
-
配置時:
-
始終使用38400與AT模式通信
-
AT命令只修改透傳模式參數
-
-
透傳使用時:
-
使用配置的波特率(您最后設為9600)
-
需與配對設備保持相同波特率
-
提示:當模塊無響應時,優先檢查:
AT模式必須用38400
透傳模式用配置的波特率(如9600)
EN引腳保持穩定連接
?2:AT+ROLE=0為藍牙模式的從模式,解釋一下什么是從模式和代碼
什么是從模式(Slave Mode)?
當設置?AT+ROLE=0
?時,HC-05 模塊被配置為從模式,這是藍牙通信中的被動角色:
特性 | 說明 |
---|---|
角色定位 | 被動等待連接(類似"服務員") |
連接行為 | 無法主動掃描/連接其他設備,只能被主設備(Master)發現并連接 |
典型應用 | 作為外圍設備(如傳感器、執行器)與手機/電腦配對 |
工作狀態 | 啟動后廣播自身存在(可被手機藍牙列表檢測到) |
連接限制 | 同一時間只能被一個主設備連接(1:1連接) |
??對比主模式(AT+ROLE=1
):主設備可主動掃描連接多個從設備(類似"顧客")?
3:設置密碼為4位數?