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