原理就是:手機通過藍牙傳輸到HC-05上,再通過串口通信和STM32通信;而之前一般都是電腦上通過USB線轉串口的方式,通過串口和STM32通信。本質上沒有區別的。
這個時候就應該更加深刻地體會到了本文開篇的一句話:說白了,只是個藍牙轉串口的設備,你只要知道串口怎么編程使用,就可以了,實現了所謂的透明傳輸。藍牙的相關一切都被封裝起來了,都不需要接觸到。
藍牙模塊的調試
准備工作
USB轉TTL模塊與HC-05藍牙模塊的接線:
兩模塊共地,兩模塊共VCC(VCC取5V);藍牙模塊的RX接轉換模塊的TX,藍牙模塊的TX接轉換模塊的RX。如下圖所示:
這個時候就要將轉換模塊連接到電腦上,然后利用串口調試助手進行藍牙模塊的調試。
附可能會用到的驅動:鏈接:https://pan.baidu.com/s/1bpYLfCr 密碼:yabv
藍牙模塊的調試
HC-05藍牙串口通訊模塊具有兩種工作模式:命令響應工作模式(AT)和自動連接工作模式。在自動連接工作模式下模塊又可分為主(Master)、從(Slave)和回環(Loopback)三種工作角色。
- 當模塊處於自動連接工作模式時,將自動根據事先設定的方式連接的數據傳輸;
- 當模塊處於命令響應工作模式時能執行AT命令,用戶可向模塊發送各種AT 指令,為模塊設定控制參數或發布控制命令。
怎么進入命令響應工作模式?
進入命令響應工作模式有兩種方法:
- 模塊上電,未配對情況下就是AT模式,波特率為模塊本身的波特率,默認:9600,發送一次AT指令時需要置高一次PIO11;
- PIO11 置高電平后,再給模塊上電,此時模塊進入AT 模式,波特率固定為:38400,可以直接發送AT指令。
什么叫做置高一次PIO11?
在藍牙模塊中有一個小按鍵,按一下就置高一次PIO11。也就是說,第一種方法需要每發送一次AT指令按一次;而第二種方式是長按的過程中上電,之后就無需再管了,直接發送AT命令即可。
需要注意一下,兩種進入命令響應工作模式的方式使用的波特率是不一樣的,建議使用第二種方式。
怎么區分進了命令響應工作模式呢?
在藍牙模塊上有燈,當燈快閃的時候,就是自動連接工作模式;當燈慢閃的時候,就是命令響應工作模式。
AT命令
進入到命令響應工作模式之后,就可以使用串口調試助手進行藍牙調試了。
首先有一點,AT指令不區分大小寫,均以回車、換行結尾。下面介紹常用的AT指令:
手機與藍牙模塊之間的傳輸(快速測試)
直接將藍牙模塊與轉換模塊連接,再講其連接到電腦上,藍牙模塊直接進入自動連接工作模式。
手機藍牙控制STM32單片機
之前的兩個例子都是相比較而言比較簡單的,這個例子將會涉及到程序的內容了。
實現功能:手機通過藍牙,向STM32單片機發送消息,STM32接收到消息之后原封不動的返回給手機。當然如果掌握了這個例子,也可以修改成,手機發送特定的消息,然后,STM32單片機做出相對應的動作。比如:點亮LED等、發動電機等等。
連接說明
使用USART1進行試驗,也就是說STM32選取PA9、PA10來和HC-05進行連接。同時手機通過藍牙來和HC-05進行連接。
原理就是:手機通過藍牙傳輸到HC-05上,再通過串口通信和STM32通信;而之前一般都是電腦上通過USB線轉串口的方式,通過串口和STM32通信。本質上沒有區別的。
這個時候就應該更加深刻地體會到了本文開篇的一句話:說白了,只是個藍牙轉串口的設備,你只要知道串口怎么編程使用,就可以了,實現了所謂的透明傳輸。藍牙的相關一切都被封裝起來了,都不需要接觸到。
STM32控制程序

1 #include "stm32f10x.h" 2 3 4 void My_USART1_Init(void) 5 6 { 7 8 GPIO_InitTypeDef GPIO_InitStrue; 9 10 USART_InitTypeDef USART_InitStrue; 11 12 NVIC_InitTypeDef NVIC_InitStrue; 13 14 15 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//GPIO端口使能 16 17 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//串口端口使能 18 19 20 GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP; 21 22 GPIO_InitStrue.GPIO_Pin=GPIO_Pin_9; 23 24 GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz; 25 26 GPIO_Init(GPIOA,&GPIO_InitStrue); 27 28 29 GPIO_InitStrue.GPIO_Mode=GPIO_Mode_IN_FLOATING; 30 31 GPIO_InitStrue.GPIO_Pin=GPIO_Pin_10; 32 33 GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz; 34 35 GPIO_Init(GPIOA,&GPIO_InitStrue); 36 37 38 USART_InitStrue.USART_BaudRate=115200; 39 40 USART_InitStrue.USART_HardwareFlowControl=USART_HardwareFlowControl_None; 41 42 USART_InitStrue.USART_Mode=USART_Mode_Tx|USART_Mode_Rx; 43 44 USART_InitStrue.USART_Parity=USART_Parity_No; 45 46 USART_InitStrue.USART_StopBits=USART_StopBits_1; 47 48 USART_InitStrue.USART_WordLength=USART_WordLength_8b; 49 50 51 USART_Init(USART1,&USART_InitStrue); 52 53 54 USART_Cmd(USART1,ENABLE);//使能串口1 55 56 57 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);//開啟接收中斷 58 59 60 NVIC_InitStrue.NVIC_IRQChannel=USART1_IRQn; 61 62 NVIC_InitStrue.NVIC_IRQChannelCmd=ENABLE; 63 64 NVIC_InitStrue.NVIC_IRQChannelPreemptionPriority=1; 65 66 NVIC_InitStrue.NVIC_IRQChannelSubPriority=1; 67 68 NVIC_Init(&NVIC_InitStrue); 69 70 71 } 72 73 74 void USART1_IRQHandler(void) 75 76 { 77 78 u8 res; 79 80 if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) 81 82 { 83 84 res= USART_ReceiveData(USART1); 85 86 USART_SendData(USART1,res); 87 88 } 89 90 } 91 92 93 int main(void) 94 95 { 96 97 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 98 99 My_USART1_Init(); 100 101 while(1); 102 103 104 }
這段程序和【STM32】串口相關配置寄存器、庫函數(UART一般步驟)中的程序一模一樣,幾乎沒有什么改動。
區別就是,在UART實驗中,USART1是和USB轉串口模塊連接在一起的,然后與電腦上的串口調試助手進行通信;現在改成USART1是和藍牙模塊連接在一起的,然后和手機上的藍牙串口調試助手進行通信。