STM32第十六天藍牙模塊

一:藍牙模塊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. 自動連接模式(透傳模式)

    • 模塊默認工作狀態

    • 自動搜索并連接配對設備

    • 建立雙向數據傳輸通道(串口透傳)

    • 指示燈狀態:紅燈快閃(約1秒2次)

  2. AT模式(配置模式)

    • 用于參數配置的專用模式

    • 通過AT指令修改名稱、波特率、配對密碼等

    • 不支持數據傳輸

    • 指示燈狀態:慢閃(約2秒1次)

AT模式進入方法
方法1:原始AT模式(永久配置狀態)
項目說明
進入條件上電前按住按鍵或將EN引腳接3.3V高電平
指示燈慢閃(持續狀態)
波特率固定38400
特性模塊始終處于AT命令狀態,適合批量燒錄配置
退出方式必須斷電重啟(不按按鍵)

?

方法2:臨時AT模式(動態切換狀態)
項目說明
進入條件正常啟動后(紅燈快閃時),按住按鍵或拉高EN引腳至3.3V
指示燈快閃→慢閃(狀態切換)
波特率默認96000(可修改)
特性僅當按鍵/EN保持高電平時處于AT狀態,松開即返回透傳模式
退出方式松開按鍵/EN引腳拉低
關鍵注意事項
  1. 波特率匹配

    • 原始模式:必須使用38400

    • 臨時模式:默認96000(除非已修改)

    • 不匹配將導致AT指令無響應

  2. 電氣特性

    • EN引腳需穩定接入3.3V(不可浮空)

    • 電壓超過3.3V可能損壞模塊

  3. 指令格式要求

    • 所有AT指令必須以換行符結束(\r\n

    • 參數需嚴格遵循格式(如AT+NAME="HC05"

  4. 配置保存機制

    • 原始模式:配置即時生效(也需要重啟加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?

核心原因:
  1. 雙波特率機制

    • AT模式波特率:固定38400(進入配置模式時使用)

    • 工作模式波特率:可配置(透傳模式使用的波特率)

  2. AT+UART? 命令的本質

    • 查詢的不是當前AT模式波特率

    • 查詢的是透傳模式(工作模式)的波特率設置

?

  • ??AT+UART??只顯示工作模式波特率,不顯示AT模式波特率

  • ? AT模式波特率固定為38400且不可更改

  • ? 您看到的9600是模塊在透傳模式下的通信波特率

  • ? 您的所有AT命令執行成功(每個都返回OK)

使用建議:
  1. 配置時

    • 始終使用38400與AT模式通信

    • AT命令只修改透傳模式參數

  2. 透傳使用時

    • 使用配置的波特率(您最后設為9600)

    • 需與配對設備保持相同波特率

提示:當模塊無響應時,優先檢查:

  1. AT模式必須用38400

  2. 透傳模式用配置的波特率(如9600)

  3. EN引腳保持穩定連接

?2:AT+ROLE=0為藍牙模式的從模式,解釋一下什么是從模式和代碼

什么是從模式(Slave Mode)?

當設置?AT+ROLE=0?時,HC-05 模塊被配置為從模式,這是藍牙通信中的被動角色:

特性說明
角色定位被動等待連接(類似"服務員")
連接行為無法主動掃描/連接其他設備,只能被主設備(Master)發現并連接
典型應用作為外圍設備(如傳感器、執行器)與手機/電腦配對
工作狀態啟動后廣播自身存在(可被手機藍牙列表檢測到)
連接限制同一時間只能被一個主設備連接(1:1連接)

??對比主模式(AT+ROLE=1:主設備可主動掃描連接多個從設備(類似"顧客")?

3:設置密碼為4位數?

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

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

相關文章

時序數據庫IoTDB用戶自定義函數(UDF)使用指南

1. 編寫UDF時序數據庫IoTDB為用戶提供了編寫UDF的JAVA API,用戶可以自主實現UDTF(用戶自定義轉換函數)類,IoTDB將通過類加載機制裝載用戶編寫的類。Maven依賴如果使用Maven,可以從Maven庫中搜索以下依賴,并…

Linux國產與國外進度對壘

Linux國產與國外進度對壘 引言國產Linux的發展現狀國外Linux的發展現狀技術對比國產Linux的挑戰與機遇國外Linux的優勢與局限結論 引言 簡述Linux在全球操作系統市場中的地位國產Linux的發展背景與意義國外主流Linux發行版的現狀 國產Linux的發展現狀 主要國產Linux發行版介…

Jenkins-Email Extension 插件插件

Editable Email Notification Editable Email Notification 是 Jenkins 的 Email Extension 插件的核心功能,用于自定義郵件通知,包括郵件主題、內容、收件人、發件人等 屬性 1.Project From 項目發件人,設置郵件的發件人地址 **注意&…

windows系統下將Docker Desktop安裝到除了C盤的其它盤中

windows系統下安裝docker會自動安裝到C盤,可以采用下面的方法將其安裝到其它盤中1、先下載Docker Desktop安裝程序Docker Desktop Installer.exe,比如你下載到了C:\Users\YourUsername\Downloads 文件夾中。 2、打開 PowerShell 進入C:\Users\YourUser…

視頻工具箱 1.1.1 |小而美的視頻處理工具,支持多種常用功能

VideoTools是一款基于FFmpeg的小而美的視頻處理工具,專為需要快速高效地進行視頻編輯的用戶設計。這款工具無需安裝,體積僅約200KB,提供了視頻壓縮、格式轉換、轉GIF、修改分辨率、加速播放以及音頻提取等多種常用功能。其用戶界面簡潔直觀&a…

無人機集群搜索技術全面解析

無人機集群搜索是指通過多架無人機協同工作,實現對目標區域的高效覆蓋與快速探測。這項技術通過模擬自然界生物群體的集體行為,利用分布式控制和自主決策算法,使無人機集群能夠自組織地完成復雜搜索任務。下面從核心技術、應用場景、算法實現…

【Elasticsearch】深度分頁及其替代方案

深度分頁及其替代方案 1.深度分頁2.為什么不推薦深度分頁2.1 性能問題(核心原因)2.2 資源消耗對比2.3 實際限制 3.深度分頁的替代方案3.1 方案一:Search After(推薦)3.1.1 為什么 Search After 性能更高3.1.2 技術原理…

論文閱讀筆記——VGGT: Visual Geometry Grounded Transformer

VGGT 論文 輸入是 N 個 RGB 圖像 I i ∈ R 3 H W I_i\in\mathbb{R}^{3HW} Ii?∈R3HW 的序列 ( I i ) i 1 N (I_i)^N_{i1} (Ii?)i1N?,觀察相同 3D 場景。 VGGT 的 Transformer 是一個映射函數,將此序列映射為一組對應的 3D 標注, f ( …

【嵌入式電機控制#11】PID控制入門:對比例算法應用的深度理解

接下來內容需要數學功底,并且有現成結論的內容不做推導,重在講解工程實踐中的方法論,建議控制類專業或學習過相關理論的人閱讀 一、開閉環系統 (1)開環控制系統:被控對象輸出對控制器的輸出沒有影響 &…

多視圖幾何:本質矩陣與基礎矩陣

文章目錄 1. 前置知識1.1. 向量叉乘1.2. 混合積1.3. 引理證明 2. 本質矩陣3. 基礎矩陣4. 應用例子 1. 前置知識 1.1. 向量叉乘 假設 a ( a x a y a z ) \mathbf{a} \begin{pmatrix} a_x \\ a_y \\ a_z \end{pmatrix} a ?ax?ay?az?? ? 以及 b ( b x b y b z ) \mat…

Hive集群之間遷移的Linux Shell腳本

新舊 Hive 集群之前數據遷移單表腳本 migrate_hive_single_table.sh #!/bin/bash#配置參數 OLD_NAMENODE"hdfs://<old-namenode>:<old-port>" EXPORT_PATH"/tmp/hive-export/dm" NEW_DB"dm_events" TABLE_NAME"dm_usereventfi…

新時代的開始,華為開源倉頡編程語言!

7月30日&#xff0c;華為即將開源自研的倉頡編程語言。 倉頡這個名字很有意思。傳說中的倉頡創造了漢字&#xff0c;開啟了中華文明的文字時代。華為用這個名字&#xff0c;體現了對中華文化的致敬。從2020年開始研發&#xff0c;到去年首次亮相&#xff0c;再到現在的全面開源…

【python實用小腳本-128】基于 Python 的 Hacker News 爬蟲工具:自動化抓取新聞數據

引言 在技術社區中&#xff0c;Hacker News 是一個匯聚最新技術文章和討論的熱門平臺。許多開發者和技術愛好者依賴它來獲取行業動態和前沿資訊。然而&#xff0c;手動瀏覽和篩選這些文章可能耗時且低效。本文將介紹一個基于 Python 的 Hacker News 爬蟲工具&#xff0c;它能夠…

mac 電腦安裝Homebrew來安裝npm與node成功后,安裝nvm的流程

文章目錄 前言一、卸載node(如果沒下載可以忽略這步)1.官網下載安裝包的2. homebrew安裝的 二、安裝Homebrew(1) 命令安裝&#xff08;2&#xff09;出現上面提示&#xff0c;執行對應的命令&#xff08;3&#xff09;校驗是否安裝成功 三&#xff1a;安裝node&#xff08;Home…

根據無人機傾斜攝影osgb做的3dmax模型3dtiles制作,導出.b3dm加載到谷歌地圖cesiumlab

根據無人機傾斜攝影osgb做的3dmax模型3dtiles制作&#xff0c;導出.b3dm加載到谷歌地圖cesiumlab 根據無人機傾斜攝影osgb做的3dmax模型3dtiles制作&#xff0c;導出.b3dm加載到谷歌地圖cesiumlab

Yocto項目:嵌入式Linux開發的“萬能烹飪手冊”

目錄 一.Yocto是什么? 二.Yocto如何運作&#xff1f; 2.1 三大核心工具 2.2 實例 三.為什么開發者愛用Yocto&#xff1f; 3.1 ?自由定制&#xff0c;拒絕“全家桶”?? 3.2 跨平臺支持&#xff1a;從x86到火星芯片? 3.3 工業級可靠性? PetaLinux是Xilinx官方推出的…

【nosql】有哪些非關系型數據庫?

非關系型數據庫Nosql 分類 鍵值存儲 (Key-Value Store): 代表: Redis, DynamoDB, RocksDB, etcd核心優勢: 極致簡單、超高讀寫性能&#xff08;尤其內存型&#xff09;、高吞吐。場景: 緩存、會話存儲、配置、計數器、分布式協調、簡單消息隊列。 列式 / 寬列存儲 (Wide-Colu…

Redis存儲Cookie實現爬蟲保持登錄 requests | selenium

前言 前面已經介紹了requests和selenium這兩種方式的基礎知識和模擬登錄,但是我們需要每次都進行登錄,這明顯是很麻煩并且不合理的,所以這次我分享一下怎么可以讓我們的程序進行一次登錄之后,和普通瀏覽器一樣下次不進行登錄直接進行對網站數據的爬取 下面的我分享的內容需要…

leetcode:474. 一和零[01背包][動態規劃]

學習要點 給定背包容量&#xff0c;裝滿背包最多有多少個物品深入理解01背包深入理解動態規劃 題目鏈接 474. 一和零 - 力扣&#xff08;LeetCode&#xff09; 題目描述 解法:01背包 class Solution { public:int findMaxForm(vector<string>& strs, int m, int …

UE5 使用過程遇到的問題

切換緩存位置 進入界面&#xff0c;選擇-編輯-編輯器偏好設置搜索緩存&#xff0c;找到通用全局&#xff0c;修改本地DCC路徑到要切換的位置 閃退報錯 Fatal: Failed to get dll export function: cuvidGetDecoderCaps [NVDEC] 因為NVIDIA驅動沒有卸載干凈&#xff0c;使用D…