head:
title: 手把手教你玩轉(zhuǎn)藍(lán)牙模塊(原理+驅(qū)動(dòng))
description:
手把手教你玩轉(zhuǎn)藍(lán)牙模塊(原理+驅(qū)動(dòng))
作為嵌入式開發(fā)工程師,藍(lán)牙模塊怎能少呢卵蛉?
藍(lán)牙模塊廣泛應(yīng)用在各種電子器件,比如手機(jī)凯砍、藍(lán)牙耳機(jī)/音箱见剩、藍(lán)牙手環(huán)剃法、掃地機(jī)器人,等等勾栗。大家在學(xué)嵌入式的時(shí)候惨篱,玩過的智能家居、智能小車围俘、無人機(jī)砸讳,都有藍(lán)牙模塊的應(yīng)用。
所以界牡,藍(lán)牙模塊的學(xué)習(xí)勢在必行簿寂。
藍(lán)牙模塊的學(xué)習(xí)其實(shí)也沒大家想的那么難,只需要你玩好串口就行了欢揖,再加上會(huì)一些 AT 指令陶耍,你就可以稱得上藍(lán)牙高手了。但關(guān)于藍(lán)牙協(xié)議棧她混,那學(xué)起來估計(jì)沒一年半載下不來。
對于初學(xué)者來講泊碑,只需要懂得如何使用這個(gè)藍(lán)牙模塊坤按,就已經(jīng)綽綽有余了。
1. 源碼下載及前置閱讀
本文首發(fā) 良許嵌入式網(wǎng) :https://www.lxlinux.net/e/ 馒过,歡迎關(guān)注臭脓!
本文所涉及的源碼及安裝包如下(由于平臺(tái)限制,請點(diǎn)擊以下鏈接閱讀原文下載):
https://www.lxlinux.net/e/stm32/bluetooth-turorial.html
如前面所述腹忽,玩藍(lán)牙模塊就是玩串口来累,所以大家一定要先把串口玩好。如果你不懂得如何玩串口窘奏,可以看下面這篇文章:
STM32串口接收不定長數(shù)據(jù)(接收中斷+超時(shí)判斷):https://www.lxlinux.net/e/stm32/stm32-usart-receive-data-using-rxne-time-out.html
如果你是個(gè)零基礎(chǔ)的小白嘹锁,連 STM32 都沒見過,我也給你準(zhǔn)備了一個(gè)保姆級教程着裹,手把手教你搭建好 STM32 開發(fā)環(huán)境领猾,并教你如何下載程序,簡直業(yè)界良心骇扇!
零基礎(chǔ)快速上手STM32開發(fā)(手把手保姆級教程):https://www.lxlinux.net/e/stm32/stm32-quick-start-for-beginner.html
如果你連代碼都不知道怎么燒錄到 STM32 的摔竿,可以參考下文,提供了 5 種代碼燒錄方式:
STM32下載程序的五種方法:https://www.lxlinux.net/e/stm32/five-ways-to-flash-program-to-stm32.html
2. 藍(lán)牙模塊介紹
2.1 型號介紹
現(xiàn)在市面上流行的藍(lán)牙模塊有很多少孝,例如廣州匯承公司的藍(lán)牙模塊應(yīng)用非常的廣泛继低,它們公司生產(chǎn)的 HC 系列的藍(lán)牙模塊如下圖所示:
型號 | 主/從機(jī) | 通信協(xié)議 | 工作頻段 | 通信距離 | 嵌入方式 | 空中速率 | 尺寸 |
---|---|---|---|---|---|---|---|
HC-02 | 從機(jī) | 藍(lán)牙2.0 / 藍(lán)牙4.0 | 2.4G | 10米 | 貼片 | 2Mbps | 26.9 * 13 * 2 mm |
HC-04 | 從機(jī) | 藍(lán)牙2.0 / 藍(lán)牙4.0 | 2.4G | 10米 | 貼片 | 60KB/s | 18.5 * 13 * 2 mm |
HC-05 | 主從機(jī)一體 | 藍(lán)牙2.0 | 2.4G | 10米 | 貼片 | 2Mbps | 27.0 * 13 * 2 mm |
HC-06 | 主從機(jī)一體 | 藍(lán)牙2.0 | 2.4G | 10米 | 貼片 | 2Mbps | 27.0 * 13 * 2 mm |
HC-08 | 主從機(jī)一體 | 藍(lán)牙4.0 | 2.4G | 80米 | 貼片 / 焊接 | 1Mbps | 26.9 * 13 * 2 mm |
HC-09 | 主從機(jī)一體 | 藍(lán)牙4.0 | 2.4G | 60米 | 貼片 / 焊接 | 3KB/s | 18.5 * 13 * 2 mm |
HC-42 | 主從機(jī)一體 | 藍(lán)牙5.0 | 2.4G | 40米 | 貼片 / 焊接 | 1Mbps / 2Mbps | 26.9 * 13 * 2 mm |
這些藍(lán)牙模塊,在主/機(jī)稍走、工作頻段袁翁、通信距離冷溃、空中速率等方面都存在差異,大家可以根據(jù)自己的業(yè)務(wù)需求進(jìn)行選擇梦裂。
對于初學(xué)者而言似枕,HC-08 是一款非常適合入門的藍(lán)牙模塊,本文就是以 HC-08 作為對象年柠,介紹藍(lán)牙模塊的玩法凿歼。
HC-08 采用 TI CC25540 芯片方案,藍(lán)牙 BLE4.0 主從一體冗恨,通過 BLE 的軟件連接答憔,傳輸速率 1Mbps ,傳輸距離 80m 掀抹,低功耗虐拓,詳細(xì)參數(shù)如下:
2.2 引腳介紹
HC-08 藍(lán)牙模塊是通過串口與單片機(jī)進(jìn)行通信,這個(gè)模塊既可以作為主機(jī)也可以作為從機(jī)(通過 AT 指令配置)傲武。有些藍(lán)牙模塊不支持主機(jī)(如 HC-02 蓉驹、HC-04),所以在使用時(shí)需要注意區(qū)分揪利。
HC-08 藍(lán)牙模塊實(shí)物圖如下所示:
可以看到态兴,HC-08 模塊一共有 6 個(gè)引腳,下面詳細(xì)介紹各個(gè)引腳的作用疟位。
- STATE:狀態(tài)輸出引腳瞻润。未連接時(shí),則為低電平甜刻。連接成功時(shí)绍撞,則為高電平〉迷海可以在程序中作指示引腳使用傻铣;
- RXD:串口接收引腳。接單片機(jī)的 TX 引腳(如果是5V MCU尿招,需串聯(lián)一個(gè) 220R 電阻)矾柜;
- TXD:串口發(fā)送引腳。接單片機(jī)的 RX 引腳;
- GND:接地電源就谜;
- VCC:輸入 3.2~6V 的電源(注意怪蔑,上面一層郵票口的模塊不能接 5V 的電源,需要底板降壓至 3.3V)丧荐;
- KEY:主機(jī)用于清除配對的從機(jī)地址記憶(需要拉高電平 200ms 以上)缆瓣。
上面的「連接」是指模塊通過藍(lán)牙協(xié)議連接上主機(jī)或從機(jī),并非物理意義上的連接虹统。下同弓坞。
正常通信下隧甚,只需接 RXD、TXD渡冻、GND戚扳、VCC 四條線就夠了。
藍(lán)牙模塊上還有一個(gè) LED燈和一個(gè)小按鍵 (按鍵控制著引腳 KEY )族吻。默認(rèn)情況下帽借,當(dāng) LED燈閃爍時(shí)表示藍(lán)牙模塊當(dāng)前為從機(jī),正在等待連接超歌。而長亮的時(shí)候就代表已經(jīng)有主機(jī)連接上該模塊砍艾,可以正常進(jìn)行透傳通訊了。
當(dāng)按鍵按下后巍举,主機(jī)將清除已被記錄的從機(jī)地址脆荷。另外,也可使用 AT+CLEAR
指令懊悯,實(shí)現(xiàn)「主機(jī)清除已記錄的從機(jī)地址」的功能蜓谋。
注意,在硬件接線的時(shí)候藍(lán)牙模塊的 TXD 要和單片機(jī)的 RXD 相連接定枷,藍(lán)牙模塊的 RXD 要和單片機(jī)的 TXD 相連接孤澎,也就是所謂的「交叉接線」。
3. 基本玩法
3.1 主/從機(jī)模式
3.1.1 主機(jī)模式
當(dāng)藍(lán)牙模塊處于主機(jī)模式的時(shí)候欠窒,可以與一個(gè)從機(jī)進(jìn)行連接。在此模式下可以對周圍設(shè)備進(jìn)行搜索并選擇需要連接的從機(jī)進(jìn)行連接退子。理論上岖妄,一個(gè)藍(lán)牙主端設(shè)備,可同時(shí)與 7 個(gè)藍(lán)牙從端設(shè)備進(jìn)行通訊寂祥。
一個(gè)具備藍(lán)牙通訊功能的設(shè)備荐虐,可以在兩個(gè)角色之間進(jìn)行切換。比如:平時(shí)工作在從機(jī)模式丸凭,等待其它主機(jī)來連接福扬;在需要時(shí),可轉(zhuǎn)換為主機(jī)模式惜犀,向其它設(shè)備發(fā)起連接铛碑。一個(gè)藍(lán)牙設(shè)備以主機(jī)模式發(fā)起連接時(shí),需要知道對方的藍(lán)牙地址虽界,配對密碼等信息汽烦,配對完成之后,可直接發(fā)起連接莉御。
3.1.2 從機(jī)模式
當(dāng)藍(lán)牙模塊處于從機(jī)模式的時(shí)候撇吞,只能被主機(jī)搜索俗冻,不能主動(dòng)搜索。從機(jī)與主機(jī)連接以后牍颈,也可以和主機(jī)進(jìn)行發(fā)送和接收數(shù)據(jù)迄薄。
3.3.3 兩種工作模式有什么區(qū)別呢?
主機(jī)是指能夠搜索別人并主動(dòng)建立連接的一方煮岁,從機(jī)則不能主動(dòng)建立連接讥蔽,只能等待主機(jī)連接自己。
- 如何進(jìn)入從機(jī)模式人乓?
HC-08 上電之后勤篮,默認(rèn)情況下就是從機(jī)模式。如果需要手動(dòng)配置色罚,可以使用 AT+ROLE=S
指令碰缔。
- 如何進(jìn)入主機(jī)模式?
我們需要通過 AT 指令 AT+ROLE=M
來設(shè)置藍(lán)牙模塊為主機(jī)模式戳护。
3.2 什么是AT指令金抡?
AT 指令(AT Commands)最早是由發(fā)明撥號調(diào)制解調(diào)器的賀氏公司為了控制撥號調(diào)制解調(diào)器而發(fā)明的控制協(xié)議。后來隨著網(wǎng)絡(luò)帶寬的升級腌且,速度很低的撥號調(diào)制解調(diào)器基本退出市場梗肝,但是 AT 指令被保留了下來。
在嵌入式開發(fā)中铺董,經(jīng)常是使用 AT 命令去控制各種通訊模塊巫击,比如 WiFi 模塊、藍(lán)牙模塊精续、GPRS 模塊等等坝锰。一般就是主芯片通過硬件接口(比如串口、SPI)發(fā)送 AT 指令給通訊模塊重付,模塊接收到數(shù)據(jù)之后回應(yīng)響應(yīng)的數(shù)據(jù)顷级。
3.3 常用的AT指令
AT 指令分為四種類型:
類型 | 格式 | 功能 |
---|---|---|
測試指令 | AT + < X > = ? | 查詢設(shè)置命令或內(nèi)部程序設(shè)置的參數(shù)及其取值范圍 |
查詢指令 | AT + < X > ? | 返回參數(shù)的當(dāng)前值 |
設(shè)置指令 | AT + < X > = < ... > | 設(shè)置用戶自定義的參數(shù)值 |
執(zhí)行指令 | AT + < X > | 執(zhí)行受模塊內(nèi)部程序控制的變參數(shù)不可變 |
藍(lán)牙模塊的 AT 指令相較于 ESP8266 要少非常多,后者有近百條∪返妫現(xiàn)在舉例一些常用指令弓颈,并使用這些指令一步一步的通過串口實(shí)現(xiàn)藍(lán)牙模塊的收發(fā)數(shù)據(jù)。
序號 | AT指令(小寫 x 表示參數(shù)) | 作用 | 默認(rèn)狀態(tài) | 主/從生效 |
---|---|---|---|---|
1 | AT | 檢測串口是否正常工作 | - | M/S |
2 | AT+RX | 查看模塊基本參數(shù) | - | M/S |
3 | AT+DEFAULT | 恢復(fù)出廠設(shè)置 | - | M/S |
4 | AT+RESET | 模塊重啟 | - | M/S |
5 | AT+VERSION | 獲取模塊版本删掀、 日期 | - | M/S |
6 | AT+ROLE=x | 主/從角色切換 | S | M/S |
7 | AT+NAME=xxx | 修改藍(lán)牙名稱 | HC-08 | M/S |
8 | AT+ADDR=xxxxxxxxxxxx | 修改藍(lán)牙地址 | 硬件地址 | M/S |
9 | AT+RFPM=x | 更改無線射頻功率 | 0(4dBm) | M/S |
10 | AT+BAUD=xx,y | 修改串口波特率 | 9600,N | M/S |
11 | AT+CONT=x | 是否可連接 | 0(可連) | M/S |
12 | AT+AVDA=xxx | 更改廣播數(shù)據(jù) | - | S |
13 | AT+MODE=x | 更改功耗模式 | 0 | S |
14 | AT+AINT=xx | 更改廣播間隔 | 320 | M/S |
15 | AT+CINT=xx,yy | 更改連接間隔 | 6,12 | M/S |
16 | AT+CTOUT=xx | 更改連接超時(shí)時(shí)間 | 200 | M/S |
17 | AT+CLEAR | 主機(jī)清除已記錄的從機(jī)地址 | - | M |
18 | AT+LED=x | LED 開/關(guān) | 1 | M/S |
19 | AT+LUUID=xxxx | 搜索 UUID | FFF0 | M/S |
20 | AT+SUUID=xxxx | 服務(wù) UUID | FFE0 | M/S |
21 | AT+TUUID=xxxx | 透傳數(shù)據(jù) UUID | FFE1 | M/S |
22 | AT+AUST=x | 設(shè)置自動(dòng)進(jìn)入睡眠的時(shí)間 | 20 | S |
常用AT指令說明
請注意翔冀,只有當(dāng)藍(lán)牙模塊未連接上主/從機(jī),通過串口發(fā)送的數(shù)據(jù)才會(huì)被識(shí)別為 AT
指令爬迟。否則一旦連接上主/從機(jī)橘蜜,則發(fā)送的字符串則被視為普通數(shù)據(jù),直接透傳給對方。
-
測試指令
指令 響應(yīng) 功能 說明 AT OK 測試指令 最基礎(chǔ)的測試指令
當(dāng)模塊連接上 MCU 之后计福,我們不知道模塊是否連接到位跌捆、是否有虛連、模塊是否正常工作象颖,我們可以發(fā)送 AT
這條指令進(jìn)行測試佩厚,如果接收到 OK
響應(yīng),則代表模塊一切正常说订,可以進(jìn)行后續(xù)的操作了抄瓦。
-
模塊重啟指令
指令 響應(yīng) 功能 說明 AT+RESET OK 重啟藍(lán)牙模塊 藍(lán)牙模塊會(huì)自動(dòng)重啟,重啟 200ms 后可執(zhí)行新的操作 -
恢復(fù)出廠設(shè)置指令
指令 響應(yīng) 功能 說明 AT+DEFAULT OK 恢復(fù)出廠設(shè)置 注:不會(huì)清除主機(jī)已記錄的從機(jī)地址陶冷!若要清除钙姊,請?jiān)谖催B線狀態(tài)下使用 AT+CLEAR 指令進(jìn)行清除。<br />藍(lán)牙模塊會(huì)自動(dòng)重啟埂伦,重啟 200ms 后可進(jìn)行新的操作煞额。 -
更改功耗模式指令
指令 響應(yīng) 功能 說明 AT+MODE=? 0/1/2 獲取當(dāng)前功耗模式 獲取當(dāng)前功耗模式 AT+MODE=0 OK 更改功耗模式(僅限從機(jī)) 全速功耗模式(出廠默認(rèn)) AT+MODE=1 OK 更改功耗模式(僅限從機(jī)) 一級節(jié)能模式 AT+MODE=2 OK 更改功耗模式(僅限從機(jī)) 二級節(jié)能模式(睡眠模式)
節(jié)能模式說明:
一級節(jié)能模式是模塊最主要的低功耗模式沾谜,可為透傳提供低功耗待機(jī)膊毁,也可以作為低功耗的廣播數(shù)據(jù);
二級節(jié)能模式是睡眠模式基跑,在睡眠下時(shí)不可發(fā)現(xiàn)婚温、不可連接,串口喚醒后可發(fā)現(xiàn)媳否、可連接栅螟。
兩種節(jié)能模式都可以通過串口發(fā)送 1 個(gè)字節(jié)以上的數(shù)據(jù)來喚醒,但喚醒后前面幾個(gè)字節(jié)的數(shù)據(jù)可能會(huì)亂碼篱竭。
-
修改模塊角色指令
指令 響應(yīng) 功能 說明 AT+ROLE=嵌巷? Master/Slave 獲取當(dāng)前模塊的主從機(jī)狀態(tài) 獲取當(dāng)前的藍(lán)牙模塊為主機(jī)/從機(jī)模式 AT+ROLE=M Master 設(shè)置為主機(jī)模式 設(shè)置后模塊將自動(dòng)重啟,重啟 200ms 后可進(jìn)行新的操作 AT+ROLE=S Slave 設(shè)置為從機(jī)模式 設(shè)置后模塊將自動(dòng)重啟室抽,重啟 200ms 后可進(jìn)行新的操作 -
設(shè)置 LED 開/關(guān)指令
指令 響應(yīng) 功能 說明 AT+LED=? OK+LED=靡努? 查詢LED工作模式 查詢LED當(dāng)前的工作模式 AT+LED=0 OK+LED=0 設(shè)置LED工作模式 設(shè)置LED的工作模式為關(guān)閉 AT+LED=1 OK+LED=1 設(shè)置LED工作模式 設(shè)置LED的工作模式為打開
使用指令關(guān)閉LED后再打開坪圾,需要重啟藍(lán)牙模塊才能生效
-
修改藍(lán)牙地址指令
指令 響應(yīng) 功能 說明 AT+ADDR=? (當(dāng)前藍(lán)牙模塊MAC地址) 獲取藍(lán)牙模塊MAC地址 地址必須為 12 位的 0~F 數(shù)字或大寫字符惑朦,即 16 進(jìn)制字符兽泄。 AT+ADDR=xxx OKsetADDR 修改藍(lán)牙模塊的MAC地址 建議不要修改模塊的 MAC 地址,避免沖突 -
查看軟件版本指令
指令 響應(yīng) 功能 說明 AT+VERSION HC-08V3.1, 2017-07-07 獲取軟件版本和發(fā)布日期 獲取軟件版本和發(fā)布日期 -
查看當(dāng)前基本參數(shù)
指令 響應(yīng) 功能 說明 AT+RX Name:HC-08 查詢模塊的基本參數(shù) 藍(lán)牙名是用戶設(shè)定的名字 Role:Slave 模塊角色(主/從) Baud:9600,NONE 串口波特率漾月,校驗(yàn)位 Addr:xx,xx,xx,xx,xx,xx 藍(lán)牙地址 PIN :000000 藍(lán)牙密碼(密碼無效) -
修改藍(lán)牙名稱指令
指令 響應(yīng) 功能 說明 AT+NAME=? OK+NAME=HC-08 獲取藍(lán)牙當(dāng)前名稱 獲取藍(lán)牙模塊的當(dāng)前名稱 AT+NAME=xxx OKsetNAME 設(shè)置藍(lán)牙名稱 設(shè)置藍(lán)牙模塊的名稱 -
設(shè)置模塊是否可連接指令
指令 響應(yīng) 功能 說明 AT+CONT=病梢? Connectable/Non-Connectable 獲取藍(lán)牙模塊當(dāng)前是否可連接 設(shè)置可連接性,不可連接時(shí)主要用于廣播數(shù)據(jù) AT+CONT=0 OK 設(shè)置“可連接”成功 設(shè)置“可連接”成功 AT+CONT=1 OK 設(shè)置“不可連接”成功 設(shè)置“不可連接”成功 模式 主機(jī) 從機(jī) 可連接 中心(Central)可連接,連線后進(jìn)入普通透傳模式 外設(shè)(Peripheral)可連接蜓陌,連線后進(jìn)入普通透傳模式 不可連接 觀察者(Observer)當(dāng)前模塊不能連接到其它模塊或者設(shè)備觅彰,但是會(huì)自動(dòng)掃描 HC-08 從機(jī)的廣播數(shù)據(jù)包,固定 2s 刷新一次 廣播者(Broadcaster)不會(huì)和主機(jī)連接钮热,但可以結(jié)合低功耗模式 1填抬,實(shí)現(xiàn)廣播數(shù)據(jù)包發(fā)送 -
設(shè)置連接超時(shí)指令
指令 響應(yīng) 功能 說明 AT+CTOUT=? OK+CTOUT=200(默認(rèn)) 查詢連接超時(shí)時(shí)間 查詢連接超時(shí)時(shí)間,單位 10ms隧期,范圍 103200(100ms32s)飒责。默認(rèn)為200 AT+CTOUT=100 OK+CTOUT=100 設(shè)置連接超時(shí)時(shí)間 設(shè)置連接超時(shí)時(shí)間為100ms -
設(shè)置自動(dòng)進(jìn)入睡眠時(shí)間指令
指令 響應(yīng) 功能 說明 AT+AUST=? OK+AUST=20 查詢自動(dòng)睡眠定時(shí) (默認(rèn) 20s,該時(shí)間越小則越省電)設(shè)置的時(shí)間范圍為:1s~300s 仆潮。在低功耗模式下宏蛉,激活模塊后如無操作,x 秒后將返回用戶原先所設(shè)置的低功耗模式 AT+AUST=100 OK+AUST=100 設(shè)置自動(dòng)睡眠時(shí)間 設(shè)置自動(dòng)睡眠時(shí)間為100s -
修改串口波特率指令
指令 響應(yīng) 功能 說明 AT+BAUD=xx,y xx, y 設(shè)置串口 設(shè)置串口性置,參數(shù)如下表格 AT+BAUD=拾并? 9600,NONE 查詢串口設(shè)置 查詢串口設(shè)置 xx 為串口波特率蚌讼,y 為校驗(yàn)位
參數(shù) 串口波特率(xx) 參數(shù) 校驗(yàn)位(y) 1200 1200bps N 無校驗(yàn)NONE 2400 2400bps E 偶校驗(yàn)EVEN 4800 4800bps O 奇校驗(yàn)ODD 9600 9600bps(默認(rèn)波特率) 19200 19200bps 38400 38400bps 57600 57600bps 115200 115200bps
3.4 通信示意圖
4. 項(xiàng)目實(shí)戰(zhàn)
4.1 硬件準(zhǔn)備
- STM32核心板
本文使用的是 STM32F103C8T6 最小系統(tǒng)板辟灰,價(jià)格很便宜,普遍 5~8 元篡石。
<img src="https://lxlinux.superbed.verylink.top/item/656d4d04c458853aef905452.jpg" style="zoom:50%;" />
- ST-Link V2
ST-Link 是一種用于 STM32 微控制器的調(diào)試和編程工具芥喇,它可以通過 SWD 或 JTAG 接口與開發(fā)板進(jìn)行通信。一般價(jià)格在 6~8 元左右凰萨。
<img src="https://lxlinux.superbed.verylink.top/item/65222a41c458853aefb2ce8a.jpg" style="zoom:50%;" />
- USB轉(zhuǎn)TTL
這玩意兒大家應(yīng)該非常熟悉了继控,通常我們用它來打印單片機(jī) log。
當(dāng)然胖眷,配合上位機(jī)(比如串口調(diào)試助手)武通,我們也可以使用它對一些模組進(jìn)行調(diào)試,比如:wifi模塊珊搀、4G模組冶忱、藍(lán)牙,等等境析。
當(dāng)然價(jià)格也很便宜囚枪,普遍 5~8 元。
如果對這個(gè)工具使用不熟悉的小伙伴劳淆,可以閱讀下文:
零基礎(chǔ)快速上手STM32開發(fā)(手把手保姆級教程):https://www.lxlinux.net/e/stm32/stm32-quick-start-for-beginner.html
<img src="https://lxlinux.superbed.verylink.top/item/6523c525c458853aef551a73.jpg" style="zoom:67%;" />
- 藍(lán)牙模塊
本文使用的是 HC-08 藍(lán)牙模塊链沼,價(jià)格普遍 5~20 元左右。
<img src="https://lxlinux.superbed.verylink.top/item/6576bf2ec458853aefd0c3b7.jpg" style="zoom: 25%;" />
4.2 PC串口助手調(diào)試
在項(xiàng)目開始前沛鸵,我們需要使用 USB 轉(zhuǎn) TTL 工具對我們的藍(lán)牙模塊進(jìn)行測試括勺,確保藍(lán)牙模塊工作正常。
硬件接線如下表格所示:
HC-08 | USB轉(zhuǎn)TTL |
---|---|
RXD | TXD |
TXD | RXD |
GND | GND |
VCC | 3V3 |
線路接好之后如下圖所示:
線路接好之后,將 USB 轉(zhuǎn) TTL 工具插入電腦疾捍,在串口助手輸入指令 AT
奈辰,模塊正常情況下會(huì)返回 OK
。
<img src="https://lxlinux.superbed.verylink.top/item/6577c680c458853aef84dbf1.jpg" style="zoom: 50%;" />
接著我們輸入 AT+VERSION
拾氓,獲取藍(lán)牙模塊的版本信息冯挎,結(jié)果如下:
<img src="https://lxlinux.superbed.verylink.top/item/6577c72ec458853aef874003.jpg" style="zoom: 50%;" />
在使用串口調(diào)試藍(lán)牙模塊的過程中,有可能會(huì)出現(xiàn)波特率正常咙鞍、驅(qū)動(dòng)正常房官、藍(lán)牙模塊正常,且可以被手機(jī)連接上续滋,但是輸入 AT 指令翰守,卻沒有返回的情況,出現(xiàn)這種情況可以試試換個(gè)串口助手疲酌。
4.3 硬件接線
藍(lán)牙模塊確認(rèn)正常之后蜡峰,我們就可以使用單片機(jī)通過編程的方式來操作藍(lán)牙模塊。
本文使用 串口2 連接藍(lán)牙朗恳,串口1 連接 USB 轉(zhuǎn) TTL 來打印 log湿颅。
HC-08 | STM32 | USB轉(zhuǎn)TTL |
---|---|---|
VCC | 3.3V | VCC |
RXD | A2 | |
TXD | A3 | |
GND | GND | GND |
A10 | TXD | |
A9 | RXD |
燒錄的時(shí)候接線如下表,如果不會(huì)燒錄的話可以看我之前的文章 STM32下載程序的五種方法:https://www.lxlinux.net/e/stm32/five-ways-to-flash-program-to-stm32.html粥诫。
ST-Link V2 | STM32 |
---|---|
SWCLK | SWCLK |
SWDIO | SWDIO |
GND | GND |
3.3V | 3V3 |
接好之后像這樣油航,我這里使用了面包板,用公對母的杜邦線將他們串在了一起
4.4 藍(lán)牙收發(fā)代碼編寫
藍(lán)牙模塊通過串口與 MCU 進(jìn)行通訊怀浆,所以第一步需要先做好串口的配置谊囚。
關(guān)于串口的配置,我寫過一篇文章手把手教你玩串口执赡,大家可以移步下文查看:
STM32串口接收不定長數(shù)據(jù)(接收中斷+超時(shí)判斷):https://www.lxlinux.net/e/stm32/stm32-usart-receive-data-using-rxne-time-out.html
具體代碼如下:
uint8_t bt_uart_rx_buf[BT_RX_BUF_SIZE];
uint8_t bt_uart_tx_buf[BT_TX_BUF_SIZE];
uint16_t bt_uart_rx_len = 0;
void bt_init(uint32_t baudrate)
{
bt_uart_handle.Instance = BT_INTERFACE; /* BT */
bt_uart_handle.Init.BaudRate = baudrate; /* 波特率 */
bt_uart_handle.Init.WordLength = UART_WORDLENGTH_8B; /* 數(shù)據(jù)位 */
bt_uart_handle.Init.StopBits = UART_STOPBITS_1; /* 停止位 */
bt_uart_handle.Init.Parity = UART_PARITY_NONE; /* 校驗(yàn)位 */
bt_uart_handle.Init.Mode = UART_MODE_TX_RX; /* 收發(fā)模式 */
bt_uart_handle.Init.HwFlowCtl = UART_HWCONTROL_NONE; /* 無硬件流控 */
bt_uart_handle.Init.OverSampling = UART_OVERSAMPLING_16; /* 過采樣 */
HAL_UART_Init(&bt_uart_handle); /* 使能BT */
}
void bt_rx_clear(void)
{
memset(bt_uart_rx_buf, 0, sizeof(bt_uart_rx_buf)); //清空接收緩沖區(qū)
bt_uart_rx_len = 0; //接收計(jì)數(shù)器清零
}
void BT_IRQHandler(void)
{
uint8_t receive_data = 0;
if(__HAL_UART_GET_FLAG(&bt_uart_handle, UART_FLAG_RXNE) != RESET){ //獲取接收RXNE標(biāo)志位是否被置位
if(bt_uart_rx_len >= sizeof(bt_uart_rx_buf)) //如果接收的字符數(shù)大于接收緩沖區(qū)大小镰踏,
bt_uart_rx_len = 0; //則將接收計(jì)數(shù)器清零
HAL_UART_Receive(&bt_uart_handle, &receive_data, 1, 1000); //接收一個(gè)字符
bt_uart_rx_buf[bt_uart_rx_len++] = receive_data; //將接收到的字符保存在接收緩沖區(qū)
}
if (__HAL_UART_GET_FLAG(&bt_uart_handle, UART_FLAG_IDLE) != RESET) //獲取接收空閑中斷標(biāo)志位是否被置位
{
printf("recv: %s\r\n", bt_uart_rx_buf); //將接收到的數(shù)據(jù)打印出來
bt_rx_clear();
__HAL_UART_CLEAR_IDLEFLAG(&bt_uart_handle); //清除UART總線空閑中斷
}
}
通過這幾個(gè)函數(shù),我們就可以讀取藍(lán)牙返回的數(shù)據(jù)沙合,并保存在數(shù)組 bt_uart_rx_buf
里奠伪。
如果需要通過串口向藍(lán)牙模塊發(fā)送數(shù)據(jù),可以使用下面函數(shù):
void bt_send(char *fmt, ...)
{
va_list ap;
uint16_t len;
va_start(ap, fmt);
vsprintf((char *)bt_uart_tx_buf, fmt, ap);
va_end(ap);
len = strlen((const char *)bt_uart_tx_buf);
HAL_UART_Transmit(&bt_uart_handle, bt_uart_tx_buf, len, HAL_MAX_DELAY);
}
至此首懈,藍(lán)牙模塊的初始化芳来、發(fā)送、接收部分就做好了猜拾。
在 main 函數(shù)里,我們可以先調(diào)用 bt_init()
函數(shù)進(jìn)行初始化佣盒,然后調(diào)用 bt_send()
函數(shù)發(fā)送數(shù)據(jù)挎袜,如下:
int main(void)
{
HAL_Init(); /* 初始化HAL庫 */
sys_stm32_clock_init(RCC_PLL_MUL9); /* 設(shè)置時(shí)鐘,72M */
delay_init(72); /* 初始化延時(shí)函數(shù) */
usart_init(115200); /* 串口1波特率設(shè)為115200 */
bt_init(9600); /* 串口2波特率設(shè)為9600 */
printf("藍(lán)牙實(shí)驗(yàn)……\r\n");
while(1)
{
bt_send("bt send\r\n");
delay_ms(1000);
}
}
4.5 通過手機(jī)藍(lán)牙助手發(fā)送數(shù)據(jù)到電腦的串口助手
接著我們打開電腦串口軟件。設(shè)置串口助手波特率 115200 (你們不一定要用我這款,隨便的串口助手都可以)盯仪,選擇串口號紊搪,最后打開串口開始準(zhǔn)備接收數(shù)據(jù)。
這個(gè)串口工具接收的是 MCU 串口 1 的數(shù)據(jù)全景,也就是 log 耀石。藍(lán)牙接收到數(shù)據(jù)后,我們使用串口 1 打印到下面的串口助手里爸黄。
<img src="https://lxlinux.superbed.verylink.top/item/6577caedc458853aef93c636.jpg" style="zoom:50%;" />
然后打開手機(jī)藍(lán)牙助手準(zhǔn)備開始調(diào)試滞伟,點(diǎn)擊藍(lán)牙模塊開始連接。沒有藍(lán)牙助手的同學(xué)炕贵,可以在前文找到下載地址梆奈。
<img src="https://lxlinux.superbed.verylink.top/item/6577cbd2c458853aef969a92.jpg" style="zoom:33%;" />
<img src="https://lxlinux.superbed.verylink.top/item/6577cc42c458853aef980238.jpg" style="zoom:33%;" />
到這里,我們就完成了 MCU 通過藍(lán)牙將數(shù)據(jù)透傳到手機(jī) APP (藍(lán)牙助手)称开。
當(dāng)然亩钟,我們也可以通過手機(jī) APP 向藍(lán)牙發(fā)送數(shù)據(jù),MCU 接收到透傳的數(shù)據(jù)之后通過串口助手打印在電腦上鳖轰。比如我們給藍(lán)牙模塊發(fā)送數(shù)據(jù) 111 清酥、aaa 、123123蕴侣。
<img src="https://lxlinux.superbed.verylink.top/item/6577cdfdc458853aef9e08c0.jpg" style="zoom:50%;" />
可以看到串口助手成功接收到 111 焰轻、aaa 、123123睛蛛,這些數(shù)據(jù)鹦马。
<img src="https://lxlinux.superbed.verylink.top/item/6577ce1ec458853aef9e6ba0.jpg" style="zoom:50%;" />
到此,藍(lán)牙模塊的調(diào)試就完成了忆肾。
5. 小結(jié)
通過學(xué)習(xí)和實(shí)踐荸频,希望大家都能夠了解并掌握藍(lán)牙模塊的使用方法,從而更好地應(yīng)用于嵌入式開發(fā)客冈。無論是智能小車還是開發(fā)物聯(lián)網(wǎng)設(shè)備旭从,藍(lán)牙模塊都能成為您的得力助手,讓我們一起玩轉(zhuǎn)藍(lán)牙模塊吧场仲!
另外和悦,想進(jìn)大廠的同學(xué),一定要好好學(xué)算法渠缕,這是面試必備的鸽素。這里準(zhǔn)備了一份 BAT 大佬總結(jié)的 LeetCode 刷題寶典,很多人靠它們進(jìn)了大廠亦鳞。
刷題 | LeetCode算法刷題神器馍忽,看完 BAT 隨你挑棒坏!
有收獲?希望老鐵們來個(gè)三連擊遭笋,給更多的人看到這篇文章
推薦閱讀:
歡迎關(guān)注我的博客:良許嵌入式教程網(wǎng)坝冕,滿滿都是干貨!