找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 7347|回復(fù): 0
收起左側(cè)

藍(lán)牙HC-08使用方法及出錯(cuò)原因解決方法 附源程序+資料

[復(fù)制鏈接]
ID:799862 發(fā)表于 2020-7-8 17:13 | 顯示全部樓層 |閱讀模式
         本文主要介紹在使用匯承4.0藍(lán)牙BLE串口助手HC-COM,通過(guò)手機(jī)向藍(lán)牙模塊發(fā)送數(shù)據(jù)、或者通過(guò)手機(jī)向與藍(lán)牙模塊連接的單片機(jī)發(fā)送指令時(shí),串口中斷函數(shù)的編寫(xiě)方法及出錯(cuò)的原因和改正方法
   我們?cè)趺窗阎噶畎l(fā)送出去,以及單片機(jī)是如何實(shí)現(xiàn)接收的呢?,這就要通過(guò)串口中斷來(lái)實(shí)現(xiàn)了,大多數(shù)單片機(jī)的串口例程或者匯承給的資料包里的例程都會(huì)給出類(lèi)似下面給的一個(gè)串口中斷的參考代碼,但是它是有問(wèn)題的,對(duì)于HC-COM來(lái)說(shuō),是不能正常工作
0.jpg
         void Com_Int(void) interrupt 4
{

  uchar receive_data;
        
  EA = 0;
        
  if(RI == 1) //當(dāng)硬件接收到一個(gè)數(shù)據(jù)時(shí),RI會(huì)置位
        {                 
                RI = 0;
                receive_data = SBUF;//接收到的數(shù)據(jù)
                        
                if(receive_data == '1')         
                {
                                LED =0;//接收到1亮燈
                }
                else
                {
                                LED =1; //其他情況燈滅
                }
               
        }
          SBUF=receive_data;//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
          while(!TI);                         //等待發(fā)送數(shù)據(jù)完成
          TI=0;                                                 //清除發(fā)送完成標(biāo)志位               
                EA = 1;
}

按照上面的代碼,當(dāng)我們利用手機(jī)上的app HC-COM向單片機(jī)發(fā)送1的的時(shí)候,接收的數(shù)據(jù)receive_data=1,此時(shí)呢LED應(yīng)該等于0,也就是LED會(huì)被點(diǎn)亮,但是實(shí)際上它只會(huì)閃一下,這就說(shuō)明,我們通過(guò)HC-COM發(fā)送1的時(shí)候,單片機(jī)先接收到我們發(fā)的1,之后又接收到其他的信息,在上面的程序中,我們讓單片機(jī)把接收到的信息又通過(guò)藍(lán)牙模塊發(fā)送給手機(jī),利用HC-COM進(jìn)行顯示

乍一看,我們發(fā)送1的時(shí)候,只返回了一個(gè)1 ,發(fā)送0的時(shí)候,只返回了一個(gè)0,那單片機(jī)接收的其他信息是從何而來(lái)的呢?,為啥手機(jī)沒(méi)有顯示返回的其他信息呢?對(duì)此我進(jìn)行了大量的實(shí)驗(yàn),最終發(fā)現(xiàn)這個(gè)app,它一次發(fā)送實(shí)際上是發(fā)送20位,什么意思呢? 當(dāng)我們輸入一個(gè)1點(diǎn)擊發(fā)送的時(shí)候,它實(shí)際上發(fā)送的是1000 0000 0000 0000 0000,也就是說(shuō)當(dāng)我們輸入的數(shù)據(jù)的位數(shù)不足20位時(shí)它會(huì)自動(dòng)補(bǔ)零,這就解釋了為什么LED燈不會(huì)常亮,只會(huì)閃一下,因?yàn)樵诮邮胀晡覀儼l(fā)送的1后,它又接收了19個(gè)0,把這20個(gè)數(shù)據(jù)返回我們手機(jī)上的時(shí)候,它這個(gè)app把它補(bǔ)得這19個(gè)0又以空格的格式進(jìn)行顯示,而不是顯示0(有點(diǎn)坑)。

為了讓LED常亮,我們需要輸入20個(gè)1,如上圖所示,也就是不給它補(bǔ)零的機(jī)會(huì)。這種方法呢用起來(lái)十分的不方便,可能個(gè)別有耐心的朋友也能接受,但是如果我們要通過(guò)HC-COM發(fā)送指令,實(shí)現(xiàn)對(duì)小車(chē)的遙控,也就說(shuō)需要我們快速的輸入指令,這種方法是不行的,怎么辦呢?,對(duì)大部分人了說(shuō)不具備修改這個(gè)app的能力,那么只能修改單片機(jī)的接收和發(fā)送函數(shù)了,因此我把上面的串口中斷函數(shù)進(jìn)行了簡(jiǎn)單的修改,如下

void Com_Int(void) interrupt 4
{
    EA = 0;        

  if(RI == 1) //當(dāng)硬件接收到一個(gè)數(shù)據(jù)時(shí),RI會(huì)置位
        {
           LED=0;
                RI = 0;
                receive_data = SBUF;//接收到的數(shù)據(jù)
                if(receive_data!=0)
                receive_real_data=receive_data;
         
                SBUF=receive_real_data;//將接收到的數(shù)據(jù)放入到發(fā)送寄存器
          while(!TI);                         //等待發(fā)送數(shù)據(jù)完成
          TI=0;                                                 //清除發(fā)送完成標(biāo)志位
               
               
}
    EA = 1;        
}

只有接收到的數(shù)據(jù)不為0時(shí),才賦值給新的變量receive_real_data,我們通過(guò)判斷receive_real_data的值,來(lái)控制LED或者小車(chē),而不是直接用接收到的值receive _data,同樣我們返回到手機(jī)的數(shù)據(jù),也改為receive_real_data。這樣我們只需要發(fā)送一位的 1、2、3、4、5、6、7、8、等就可以了,用起來(lái)很方便

51hei.png

全部資料51hei下載地址:
HC-08藍(lán)牙4.0BLE串口模塊使用資料包.7z (7.73 MB, 下載次數(shù): 68)

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表