HC-05蓝牙模块遇到的问题与解决方法及实现和手机通信
文章目錄
- 1、藍牙模塊的調試——解決無法與設置AT命令的問題
- 1)問題1:沒有搜索到串口
- 方法1:網上下載驅動
- 方法2:自己更新驅動
- 2)問題2:串口打開失敗--PL2303HXA自2012已停產,請聯系供貨商
- 解決方法
- 串口測試
- 3)藍牙模塊的調試
- 4)AT命令
- 2、手機與藍牙模塊之間的傳輸——解決無法連接的問題
- 1)設想1:手機的問題
- 2)設想2:藍牙模塊的配置問題
- 3)設想3:接線的問題
- 4)設想4:串口調試助手的問題
- 3、手機藍牙控制STM8單片機
- 參考代碼
- 可能會出現的問題
1、藍牙模塊的調試——解決無法與設置AT命令的問題
USB轉TTL模塊與HC-05藍牙模塊的接線:
兩模塊共地,兩模塊共VCC(VCC取5V);藍牙模塊的RX接轉換模塊的TX,藍牙模塊的TX接轉換模塊的RX。如下圖所示:
這個時候就要將轉換模塊連接到電腦上,然后利用串口調試助手進行藍牙模塊的調試。
1)問題1:沒有搜索到串口
首先我們需要嘗試設置一下AT指令,但是連接串口的時候,你可能會遇到一下的問題:沒有搜索到串口,但在確保正確連線的情況下,已經正確的上電,但是沒有搜索的串口的原因,可能是沒有安裝驅動
方法1:網上下載驅動
在網上找了一個驅動,然后進行安裝再次嘗試
方法2:自己更新驅動
驅動安裝完成后需要重啟
- 對比
安裝驅動之前
安裝驅動之后
2)問題2:串口打開失敗–PL2303HXA自2012已停產,請聯系供貨商
成功安裝了驅動之后又出現了一個問題,可以看到串口是可以被識別出來的,但打開失敗,無法正常的使用
還是失敗了,現在要解決停產的這個問題—“PL2303HXA自2012已停產,請聯系供貨商”
解決方法
參考鏈接
解決方法如下:
鏈接:https://pan.baidu.com/s/1jw1nsLGd23CagQ_dbkqu0w
提取碼:vc0c
在這里下載驅動并解壓
然后安裝驅動
然后右鍵點擊更新驅動程序
然后點擊下一步
完成
串口測試
打開串口進行測試一下
可以正常的配對,接下來,繼續進行藍牙模塊的調試
3)藍牙模塊的調試
HC-05藍牙串口通訊模塊具有兩種工作模式:命令響應工作模式和自動連接工作模式。在自動連接工作模式下模塊又可分為主(Master)、從(Slave)和回環(Loopback)三種工作角色。
- 當模塊處于自動連接工作模式時,將自動根據事先設定的方式連接的數據傳輸;
- 當模塊處于命令響應工作模式時能執行AT命令,用戶可向模塊發送各種AT 指令,為模塊設定控制參數或發布控制命令。
怎么進入命令響應工作模式?
進入命令響應工作模式有兩種方法:
- 模塊上電,未配對情況下就是AT模式,波特率為模塊本身的波特率,默認:9600,發送一次AT指令時需要置高一次PIO11;
- PIO11 置高電平后,再給模塊上電,此時模塊進入AT 模式,波特率固定為:38400,可以直接發送AT指令。
什么叫做置高一次PIO11?
在藍牙模塊中有一個小按鍵,按一下就置高一次PIO11。也就是說,第一種方法需要每發送一次AT指令按一次;而第二種方式是長按的過程中上電,之后就無需再管了,直接發送AT命令即可。
需要注意一下,兩種進入命令響應工作模式的方式使用的波特率是不一樣的,建議使用第二種方式。
怎么區分進了命令響應工作模式呢?
在藍牙模塊上有燈,當燈快閃的時候,就是自動連接工作模式;當燈慢閃的時候,就是命令響應工作模式,當燈慢閃兩下的時候就是與手機正常連接模式。
4)AT命令
進入到命令響應工作模式之后,就可以使用串口調試助手進行藍牙調試了。
首先有一點,AT指令不區分大小寫,均以回車、換行結尾。下面介紹常用的AT指令:
對于AT指令,有幾點注意:
- AT+NAME?:獲得設備名稱,這個AT指令有很大可能性是沒有返回的,因為我也看到了很多的例子……,但是其他的指令都是沒有問題的,直接設置設備名稱就行了;
- AT+UART?:獲得串口參數,串口的參數一共有三個,波特率、停止位、檢驗位。其取值如下:
其默認值為:9600,0,0。
設置藍牙參數
查看設置結果,設置成功
具體的AT指令集科研查看數據手冊,需要的可以私信或者評論一下
2、手機與藍牙模塊之間的傳輸——解決無法連接的問題
直接將藍牙模塊與轉換模塊連接,再講其連接到電腦上,藍牙模塊直接進入自動連接工作模式。
此時手機打開藍牙串口調試應用,用其來連接藍牙模塊。
正常的情況下,先在手機進行配對,然后在藍牙串口調試應用直接輸入字符串,電腦的串口上就可以成功的接受到了。
但是我在測試的時候,可以這次配對上,但是沒法正常連接
1)設想1:手機的問題
藍牙可以配對,但無法連接
嘗試了一下用手機和電腦和其他手機連接,發現均不可以
而使用另外一臺的華為手機則可以成功的實現與電腦進行配對。(小米手機配對失敗,而華為手機配對成功)
可見是我小米手機的藍牙配對問題。
隨后我就用了華為的那臺手機進行測試,竟然發現華為的手機也無法與藍牙模塊進行配對,得出了一個結論,那就是和手機無關,應該是藍牙模塊需要一些其他設置被搜尋到。
2)設想2:藍牙模塊的配置問題
查資料,發現,藍牙模塊需要被設置為從機才可以被查找,隨后進行了一番嘗試,首先去查AT指令集(正點原子有提供)
編寫AT指令進行設置,ok表明設置成功。
查詢,確實設置為從模式
但是結果還是失敗了。
這就表明,我設置的藍牙模式是沒有錯誤的1,應該是其他的問題
3)設想3:接線的問題
對于這個問題,我覺得是不可能的,因為我可以正常的配置AT指令
4)設想4:串口調試助手的問題
不斷的更換藍牙調試助手,名字就叫 藍牙串口,然后就可以成功連接上了
可以實現手機與串口段的信息發送
最后,成功解決,問題就出在串口調試助手上,得出的結論的就是,如果可以正常的配對,但無法正常連接的話,那就換你的手機或者是串口調試助手,因為藍牙的兼容問題使得配對比較麻煩。
如果需要手機的串口調試助手的apk可以私信或者評論一下
3、手機藍牙控制STM8單片機
之前的兩個例子都是相比較而言比較簡單的,這個例子將會涉及到程序的內容了。
實現功能:手機通過藍牙,向STM8單片機發送消息,STM8接收到消息之后原封不動的返回給手機。當然如果掌握了這個例子,也可以修改成,手機發送特定的消息,然后,STM8單片機做出相對應的動作。比如:點亮LED等、發動電機等等。
原理就是:手機通過藍牙傳輸到HC-05上,再通過串口通信和STM8通信;而之前一般都是電腦上通過USB線轉串口的方式,通過串口和STM8通信。本質上沒有區別的。
這個時候就應該更加深刻地體會到了本文開篇的一句話:說白了,只是個藍牙轉串口的設備,你只要知道串口怎么編程使用,就可以了,實現了所謂的透明傳輸。藍牙的相關一切都被封裝起來了,都不需要接觸到。
知道了只是簡單的串口通信,那么代碼就很容易實現了
手機app的控制界面設計如下:
參考代碼
/****************************************************************/ //接收單字符函數UART1_ReceiveByte(),無形參data,有返回值,返回接收到的數據 //采用查詢的方法實現 /****************************************************************/ u8 UART1_ReceiveByte(void) {// printf("進入UART1_ReceiveByte函數...\r\n");u8 UART1_RX_BUF; //定義接收數據暫存變量while (!(UART1_SR & 0x20)); //等待接收標志UART1_SR&=0xDF; //清零接收標志位RXNEUART1_RX_BUF=UART1_DR; //取回接收到的數據// printf("取回接收到的數據\r\n");return UART1_RX_BUF; //返回暫存變量中的數據給調用者 }/****************************************************************/ //初始化函數UART1_Init(),無形參和返回值 /****************************************************************/ void UART1_Init(void) {//1.設定通信數據位數,此處設定為8位數據位,無校驗位UART1_CR1 = 0x00;//**************************************************//展開UART1_CR1賦值二進制數值為:0000 0000 //含義:R8=0; 接收數據位不存在第9位// T8=0; 發送數據位不存在第9位// UARTD=0; 使能UART功能// M=0; 一個起始位,8個數據位,n個停止位// n取決于UART1_CR3中的STOP[1:0]位// WAKE=0; UART被空閑總線喚醒// PCEN=0: (UART模式)奇偶校驗控制被禁止// PS=0; 偶校驗(校驗功能未啟用)// PIEN=0; 校驗中斷被禁止//*************************************************//2.設定通信停止位位數,此處設定為1位停止位UART1_CR3 = 0x00;//**************************************************//展開UART1_CR3賦值二進制數值為:0000 0000 //含義:保留位=0;必須保持清零// LINEN=0;LIN模式被禁止// STOP=00;配置為“00”,1個停止位// CLKEN、CPOL、CPHA、LBCL這幾位在UART3上不存在//*************************************************//3.配置通信波特率參數,此處配置為9600bps(16MHz頻率下)UART1_BRR2 = 0x03;UART1_BRR1 = 0x68;//4.使能發送和接收功能 // UART1_CR2 = 0x0C;UART1_CR2 = 0x2C;//**************************************************//展開UART1_CR2賦值二進制數值為:0010 1100 //含義:TIEN=0;發送中斷被禁止// TCIEN=0;發送中斷完成被禁止// RIEN=1;接收中斷開啟// ILIEN=0;IDLE中斷被禁止// TEN=1;發送功能使能// REN=1;接收功能使能// RWU=0;(UART模式)正常工作模式// PIEN=0;未發送斷開字符//************************************************* }/****************************************************************/ //發送字符重定向函數putchar(),有形參ch,有返回值 /****************************************************************/ int putchar(int ch) { UART3_SendByte((u8)ch);// UART1_SendByte((u8)ch);//將Printf內容發往串口return (ch); }//接收中斷服務函數 //**************************中斷函數區域************************** #pragma vector = UART1_R_RXNE_vector //0x14 __interrupt void UART1_RX_IRQHandler(void) { if(UART1_SR&0x20){ //若UART1確實接收到了數據UART1_SR&=0xDF; //清零接收標志位RXNE}cmd=UART1_DR; //取回串口數據// printf("進入中斷服務函數...\r\n"); // cmd = UART1_ReceiveString(1);switch(cmd) //判斷串口接收命令值{case 'a':Motor_TurnLeft(); //左轉break;case 'd':Motor_TurnRight(); //右轉break;case 'w':Motor_GoForward(); //直走break;case 's': Motor_GetBack(); //后退break;case 'p': Motor_BeParking(); //停車break;case 'n': //功能二:實現跟隨模式 //printf("模式二:實現跟隨模式 \r\n");LED1 = 1; //熄燈Motor_BeParking();InfraredFollow_Module();break;case 'b': //功能三:實現避障模式//printf("模式三:實現避障模式 \r\n");LED1 = 1; //熄燈Motor_BeParking();InfraredAvoidance_Module();breakdefault:printf("【ERROR】,沒有此功能\r\n");break;}}關于中斷向量號的查詢可以查看這里:IAR中斷向量表與中斷服務函數的編寫
可能會出現的問題
在通過手機設置一些按鍵,在電腦的串口調試助手上可能會看到中斷函數會調用兩次,重復的執行
但是我又換了一個串口調試助手就又沒有問題了…真是頭疼
參考鏈接:【常用模塊】HC-05藍牙串口通信模塊使用詳解(實例:手機藍牙控制STM32單片機)
總結
以上是生活随笔為你收集整理的HC-05蓝牙模块遇到的问题与解决方法及实现和手机通信的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一维数组的定义以及使用
- 下一篇: 精挑细选的良心APP,每款都非常惊艳