手把手教你玩轉(zhuǎn)藍(lán)牙模塊(原理+驅(qū)動(dòng))


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)坝冕,滿滿都是干貨!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瓦呼,一起剝皮案震驚了整個(gè)濱河市喂窟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌央串,老刑警劉巖磨澡,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蹋辅,居然都是意外死亡钱贯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門侦另,熙熙樓的掌柜王于貴愁眉苦臉地迎上來秩命,“玉大人,你說我怎么就攤上這事褒傅∑瘢” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵殿托,是天一觀的道長霹菊。 經(jīng)常有香客問我,道長支竹,這世上最難降的妖魔是什么旋廷? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮礼搁,結(jié)果婚禮上饶碘,老公的妹妹穿的比我還像新娘。我一直安慰自己馒吴,他們只是感情好扎运,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饮戳,像睡著了一般豪治。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扯罐,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天负拟,我揣著相機(jī)與錄音,去河邊找鬼歹河。 笑死齿椅,一個(gè)胖子當(dāng)著我的面吹牛琉挖,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涣脚,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼寥茫!你這毒婦竟也來了遣蚀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤纱耻,失蹤者是張志新(化名)和其女友劉穎芭梯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體弄喘,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡玖喘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蘑志。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片累奈。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖急但,靈堂內(nèi)的尸體忽然破棺而出澎媒,到底是詐尸還是另有隱情,我是刑警寧澤波桩,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布戒努,位于F島的核電站,受9級特大地震影響镐躲,放射性物質(zhì)發(fā)生泄漏储玫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一萤皂、第九天 我趴在偏房一處隱蔽的房頂上張望撒穷。 院中可真熱鬧,春花似錦敌蚜、人聲如沸桥滨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽齐媒。三九已至,卻和暖如春纷跛,著一層夾襖步出監(jiān)牢的瞬間喻括,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工贫奠, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唬血,地道東北人望蜡。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像拷恨,于是被迫代替她去往敵國和親脖律。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容