1. 程式人生 > >【常用模組】HC-05藍芽串列埠通訊模組使用詳解(例項:手機藍芽控制STM32微控制器)

【常用模組】HC-05藍芽串列埠通訊模組使用詳解(例項:手機藍芽控制STM32微控制器)

HC-05藍芽串列埠通訊模組應該是使用最廣泛的一種藍芽模組之一了。為什麼呢?

因為HC05模組是一款高效能主從一體藍芽串列埠模組,可以不用知道太多藍芽相關知識就可以很好的上手。說白了,只是個藍芽轉串列埠的裝置,你只要知道串列埠怎麼程式設計使用,就可以了,實現了所謂的透明傳輸。

但是就是這麼一個很常見的模組,網上很多的部落格寫的都是錯的,或者都是很不詳細的。

所以本文就介紹一下這款藍芽通訊模組的使用,包括藍芽模組的除錯、手機與藍芽模組之間的傳輸、手機藍芽控制STM32微控制器,應該是逐漸深入的一個過程。但是這僅僅是使用,以後有時間應該會對藍芽有一個稍微深度的學習,而不能僅僅是浮於表面,只會用。

模組名稱:HC-05藍芽串列埠通訊模組

其他模組:USB轉TTL模組、手機藍芽串列埠助手app

手機藍芽串列埠助手軟體,可以點選連結下載:藍芽串列埠。因為這是我見過所有手機端介面最好看的了,其他的介面都有點太糟糕了。

藍芽模組的除錯

準備工作

USB轉TTL模組與HC-05藍芽模組的接線:

兩模組共地,兩模組共VCC(VCC取5V);藍芽模組的RX接轉換模組的TX,藍芽模組的TX接轉換模組的RX。如下圖所示:


這個時候就要將轉換模組連線到電腦上,然後利用串列埠除錯助手進行藍芽模組的除錯。

附可能會用到的驅動:連結:https://pan.baidu.com/s/1bpYLfCr 密碼:yabv

藍芽模組的除錯

HC-05藍芽串列埠通訊模組具有兩種工作模式:命令響應工作模式和自動連線工作模式。

在自動連線工作模式下模組又可分為主(Master)、從(Slave)和迴環(Loopback)三種工作角色。

  • 當模組處於自動連線工作模式時,將自動根據事先設定的方式連線的資料傳輸;
  • 當模組處於命令響應工作模式時能執行AT命令,使用者可向模組傳送各種AT 指令,為模組設定控制引數或釋出控制命令。

怎麼進入命令響應工作模式?

進入命令響應工作模式有兩種方法:

  • 模組上電,未配對情況下就是AT模式,波特率為模組本身的波特率,預設:9600,傳送一次AT指令時需要置高一次PIO11;
  • PIO11 置高電平後,再給模組上電,此時模組進入AT 模式,波特率固定為:38400,可以直接傳送AT指令。

什麼叫做置高一次PIO11?

在藍芽模組中有一個小按鍵,按一下就置高一次PIO11。

也就是說,第一種方法需要每傳送一次AT指令按一次;而第二種方式是長按的過程中上電,之後就無需再管了,直接傳送AT命令即可。

需要注意一下,兩種進入命令響應工作模式的方式使用的波特率是不一樣的,建議使用第二種方式。

怎麼區分進了命令響應工作模式呢?

在藍芽模組上有燈,當燈快閃的時候,就是自動連線工作模式;當燈慢閃的時候,就是命令響應工作模式。

AT命令

進入到命令響應工作模式之後,就可以使用串列埠除錯助手進行藍芽除錯了。

首先有一點,AT指令不區分大小寫,均以回車、換行結尾。下面介紹常用的AT指令:

常用AT指令
指令名響應含義
ATOK測試指令
AT+RESETOK模組復位
AT+VERSION?+VERSION:<Param> OK獲得軟體版本號
AT+ORGLOK恢復預設狀態
AT+ADDR?+ADDR:<Param> OK獲得藍芽模組地址
AT+NAME=<Param>OK設定裝置名稱
AT+NAME?+NAME:<Param> OK獲得裝置名稱
AT+PSWD=<Param>OK設定模組密碼
AT+PSWD?+PSWD:<Param> OK獲得模組密碼
AT+UART=<Param1>,<Param2>,<Param3>OK設定串列埠引數
AT+UART?+UART:<Param1>,<Param2>,<Param3> OK獲得串列埠引數

對於AT指令,有幾點注意:

  • AT+NAME?:獲得裝置名稱,這個AT指令有很大可能性是沒有返回的,因為我也看到了很多的例子……,但是其他的指令都是沒有問題的,直接設定裝置名稱就行了;
  • AT+UART?:獲得串列埠引數,串列埠的引數一共有三個,波特率、停止位、檢驗位。其取值如下:
串列埠引數
引數名稱取值
波特率

2400、4800、9600、19200、38400、5760、

115200、230400、460800、921600、1382400

停止位

0:1位

1:2位

校驗位0:NONE  1:Odd  2:Even

其預設值為:9600,0,0。

例子:


本文中,藍芽串列埠的波特率設定成115200。之後的內容,就會採用這個波特率來進行通訊了。

手機與藍芽模組之間的傳輸

直接將藍芽模組與轉換模組連線,再講其連線到電腦上,藍芽模組直接進入自動連線工作模式。

此時手機開啟藍芽串列埠除錯應用,用其來連線藍芽模組。手機藍芽串列埠助手軟體,可以點選連結下載:藍芽串列埠。萬分推薦這款,因為介面脫離了那種黑不溜秋的感覺,比較簡潔、清爽。

這個軟體的使用:點選介面右下角藍芽的標誌,選擇藍芽進行連線。

然後在電腦上的除錯助手和手機的藍芽串列埠除錯應用之間就可以相互傳輸了,比如:



可以清楚的看到:電腦向手機發送了“hello you”,手機向電腦傳送了“hello world”。

手機藍芽控制STM32微控制器

之前的兩個例子都是相比較而言比較簡單的,這個例子將會涉及到程式的內容了。

實現功能:手機通過藍芽,向STM32單片機發送訊息,STM32接收到訊息之後原封不動的返回給手機。當然如果掌握了這個例子,也可以修改成,手機發送特定的訊息,然後,STM32微控制器做出相對應的動作。比如:點亮LED等、發動電機等等。

連線說明


使用USART1進行試驗,也就是說STM32選取PA9、PA10來和HC-05進行連線。同時手機通過藍芽來和HC-05進行連線。

原理就是:手機通過藍芽傳輸到HC-05上,再通過串列埠通訊和STM32通訊;而之前一般都是電腦上通過USB線轉串列埠的方式,通過串列埠和STM32通訊。本質上沒有區別的。

這個時候就應該更加深刻地體會到了本文開篇的一句話:說白了,只是個藍芽轉串列埠的裝置,你只要知道串列埠怎麼程式設計使用,就可以了,實現了所謂的透明傳輸。藍芽的相關一切都被封裝起來了,都不需要接觸到。

STM32控制程式

#include "stm32f10x.h"

 void My_USART1_Init(void)  
{  
    GPIO_InitTypeDef GPIO_InitStrue;  
    USART_InitTypeDef USART_InitStrue;  
    NVIC_InitTypeDef NVIC_InitStrue;  
      
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIO埠使能  
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串列埠埠使能  
      
    GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;  
    GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9;  
    GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;  
    GPIO_Init(GPIOA,&GPIO_InitStrue);  
      
    GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING;  
    GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10;  
    GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;  
    GPIO_Init(GPIOA,&GPIO_InitStrue);  
      
    USART_InitStrue.USART_BaudRate=115200;  
    USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None;  
    USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;  
    USART_InitStrue.USART_Parity=USART_Parity_No;  
    USART_InitStrue.USART_StopBits=USART_StopBits_1;  
    USART_InitStrue.USART_WordLength=USART_WordLength_8b;  
      
    USART_Init(USART1,&USART_InitStrue);
      
    USART_Cmd(USART1,ENABLE);//使能串列埠1  
      
    USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//開啟接收中斷  
      
    NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn;  
    NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE;  
    NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1;  
    NVIC_InitStrue.NVIC_IRQChannelSubPriority=1;  
    NVIC_Init(&NVIC_InitStrue);  
      
}  
  
void USART1_IRQHandler(void)  
{  
    u8 res;  
     if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)  
 {  
     res= USART_ReceiveData(USART1); 	 
     USART_SendData(USART1,res);     
  }  
}  
   
 int main(void)  
 {    
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  
    My_USART1_Init();  
     while(1);  
       
 } 

區別就是,在UART實驗中,USART1是和USB轉串列埠模組連線在一起的,然後與電腦上的串列埠除錯助手進行通訊;現在改成USART1是和藍芽模組連線在一起的,然後和手機上的藍芽串列埠除錯助手進行通訊。