打印
[STM32L4]

stm32+HC05 蓝牙应用

[复制链接]
3200|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
向北lm|  楼主 | 2017-11-25 22:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
HC05 简介
BH-HC05 是蓝牙串口模块,它采用蓝牙 2.0 协议,可与任何版本的蓝牙兼容通讯,包括与具有蓝牙功能的电脑、蓝牙主机、手机、PDA、PSP 等终端配对,可实现串口透传功能。驱动 HC05 模块时只需要使用 TTL 电平标准的串口即可(5V/3.3V 电压均可),支持的波特率范围为 4800~1382400,非常适合用于单片机系统扩展蓝牙特性。

沙发
向北lm|  楼主 | 2017-11-25 22:37 | 只看该作者
tatic void HC05_GPIO_Config(void)
{               
               
                GPIO_InitTypeDef GPIO_InitStructure;

                /*开启GPIO时钟*/
                RCC_APB2PeriphClockCmd( BLT_INT_GPIO_CLK|BLT_KEY_GPIO_CLK, ENABLE);

                GPIO_InitStructure.GPIO_Pin = BLT_INT_GPIO_PIN;       
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(BLT_INT_GPIO_PORT, &GPIO_InitStructure);       
       
               
                GPIO_InitStructure.GPIO_Pin = BLT_KEY_GPIO_PIN;
                GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
                GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
                GPIO_Init(BLT_KEY_GPIO_PORT, &GPIO_InitStructure);       

}

使用特权

评论回复
板凳
向北lm|  楼主 | 2017-11-25 22:46 | 只看该作者
uint8_t HC05_Send_CMD(char* cmd,uint8_t clean)
{                          
uint8_t retry=5;
        uint8_t i,result=1;
       
        while(retry--)
        {
                BLT_KEY_HIGHT;
                delay_ms(10);
                Usart_SendString(HC05_USART,(uint8_t *)cmd);
               
                        for(i=0;i<20;i++)
                        {
                                uint16_t len;
                                char * redata;
                               
                                delay_ms(10);
                               
                                redata = get_rebuff(&len);
                                if(len>0)
                                {
                                        if(redata[0]!=0)
                                        {
                                                HC05_DEBUG("send CMD: %s",cmd);


                                                HC05_DEBUG("receive %s",redata);
                                        }
                                        if(strstr(redata,"OK"))                               
                                        {
                                               
                                                if(clean==1)
                                                        clean_rebuff();
                                                return 0;
                                        }
                                        else
                                        {
                                                //clean_rebuff();
                                        }
                                }
                                else
                                {                                       
                                        delay_ms(100);
                                }               
                        }
                        HC05_DEBUG("HC05 send CMD fail %d times",retry);
                }
       
        HC05_DEBUG("HC05 send CMD fail ");
               
        if(clean==1)
                clean_rebuff();


        return result ;


}

使用特权

评论回复
评论
稻草LL 2019-1-9 12:21 回复TA
这段具体什么作用啊? 
地板
向北lm|  楼主 | 2017-11-26 11:43 | 只看该作者
void HC05_SendString(char* str)
{
                BLT_KEY_LOW;
       
                Usart_SendString(HC05_USART,(uint8_t *)str);

}


使用特权

评论回复
5
向北lm|  楼主 | 2017-11-26 11:46 | 只看该作者
uint8_t HC05_Init(void)
{
        uint8_t i;
       
        HC05_GPIO_Config();

        BLT_USART_Config();
       
        for(i=0;i<BLTDEV_MAX_NUM;i++)
        {
                sprintf(bltDevList.unpraseAddr[i]," ");
                sprintf(bltDevList.name[i]," ");

        }       
                bltDevList.num = 0;

        return HC05_Send_CMD("AT\r\n",1);
}

使用特权

评论回复
6
向北lm|  楼主 | 2017-11-26 11:49 | 只看该作者
unsigned long htoul(const char *str)
{


  long result = 0;

  if (!str)
    return 0;

  while (*str)
  {
    uint8_t value;

    if (*str >= 'a' && *str <= 'f')
      value = (*str - 'a') + 10;
    else if (*str >= 'A' && *str <= 'F')
      value = (*str - 'A') + 10;
    else if (*str >= '0' && *str <= '9')
      value = *str - '0';
    else
      break;

    result = (result * 16) + value;
    ++str;
  }

  return result;
}

使用特权

评论回复
7
向北lm|  楼主 | 2017-11-26 11:49 | 只看该作者
char *skipPrefix(char *str, size_t str_length, const char *prefix)
{

  uint16_t prefix_length = strlen(prefix);

  if (!str || str_length == 0 || !prefix)
    return 0;

  if (str_length >= prefix_length && strncmp(str, prefix, prefix_length) == 0)
    return str + prefix_length;

  return 0;
}

使用特权

评论回复
8
向北lm|  楼主 | 2017-11-26 11:54 | 只看该作者
int get_line(char* line, char* stream ,int max_size)  
{  
                char *p;       
    int len = 0;  
                p=stream;
    while( *p != '\0' && len < max_size ){  
        line[len++] = *p;  
                                p++;
        if('\n' == *p || '\r'==*p)  
            break;  
    }
       
                if(*p != '\0' && *p != '\n' && *p != '\r')
                        return 0;
  
      
    line[len] = '\0';  
    return len;  
}

使用特权

评论回复
9
向北lm|  楼主 | 2017-11-26 11:57 | 只看该作者
void writeCommand(const char *command, const char *arg)
{
                char str_buf[50];

                BLT_KEY_HIGHT;
                delay_ms(10);

                if (arg && arg[0] != 0)
                        sprintf(str_buf,"AT+%s%s\r\n",command,arg);
                else if (command && command[0] != 0)
                {
                        sprintf(str_buf,"AT+%s\r\n",command);
                }
                else
                        sprintf(str_buf,"AT\r\n");

                HC05_DEBUG("CMD send:%s",str_buf);
               
                Usart_SendString(HC05_USART,(uint8_t *)str_buf);

}


使用特权

评论回复
10
向北lm|  楼主 | 2017-11-26 12:00 | 只看该作者
uint8_t parseBluetoothAddress(BLTDev *bltDev)
{
  /* Address should look like "+ADDR:<NAP>:<UAP>:<LAP>",
   * where actual address will look like "1234:56:abcdef".
   */

        char* redata;
        uint16_t len;
       
        char linebuff[50];
        uint16_t linelen;
       
        uint16_t getlen=0;
        uint8_t linenum=0;       
       
       
        uint8_t i;
       
        char *p;
       

        HC05_Send_CMD("AT+INQ\r\n",0);

        redata =get_rebuff(&len);
       
        if(redata[0] != 0 && strstr(redata, "+INQ:") != 0)
        {
                HC05_DEBUG("rebuf =%s",redata);

getNewLine:
                while(getlen < len-2*linenum )
                {       
                        linelen = get_line(linebuff,redata+getlen+2*linenum,len);
                        if(linelen>50 && linelen != 0)
                        {
                                HC05_Send_CMD("AT+INQC\r\n",1);//退出前中断查询
                                return 1;
                        }
                       
                        getlen += linelen;
                        linenum++;                       
                                       
                        p = skipPrefix(linebuff,linelen,"+INQ:");
                        if(p!=0)
                        {
                                uint8_t num ;
                                num = bltDev->num;
                               
                                strBLTAddr(bltDev,':');
                               
                                for(i=0;i<=num;i++)
                                {
                                        if(strstr(linebuff,bltDev->unpraseAddr[i]) != NULL)       
                                        {
                                                goto getNewLine;        //!=null时,表示该地址与解码语句的地址相同
                                        }
                                }                                                       
                                       
                                /*若蓝牙设备不在列表中,对地址进行解码*/       
                                bltDev->addr[num].NAP = htoul(p);                       
                                p = strchr(p,':');

                                if (p == 0)
                                {
                                        HC05_Send_CMD("AT+INQC\r\n",1);//退出前中断查询
                                        return 1;
                                }

                                bltDev->addr[num].UAP = htoul(++p);
                                p = strchr(p,':');

                                if (p == 0)
                                {
                                        HC05_Send_CMD("AT+INQC\r\n",1);//退出前中断查询
                                        return 1;
                                }

                                bltDev->addr[num].LAP = htoul(++p);
                               
                                /*存储蓝牙地址(字符串形式)*/
                                sprintf(bltDev->unpraseAddr[num],"%X:%X:%X",bltDev->addr[num].NAP,bltDev->addr[num].UAP,bltDev->addr[num].LAP);

                                bltDev->num++;
                               
                        }


                }
               
                clean_rebuff();
               
                HC05_Send_CMD("AT+INQC\r\n",1);//退出前中断查询
                return 0;
        }
       
        else
        {
                clean_rebuff();
               
                HC05_Send_CMD("AT+INQC\r\n",1);//退出前中断查询
                return 1;       
        }

}

使用特权

评论回复
11
向北lm|  楼主 | 2017-11-26 12:00 | 只看该作者
void strBLTAddr(BLTDev *bltDev,char delimiter)  
{
        uint8_t i;
       

        if(bltDev->num==0)
        {
                HC05_DEBUG("/*******No other BLT Device********/");
        }
        else
        {
                for(i=0;i<bltDev->num;i++)
                {
                        sprintf(bltDev->unpraseAddr[i],"%X%c%X%c%X",bltDev->addr[i].NAP,delimiter,bltDev->addr[i].UAP,delimiter,bltDev->addr[i].LAP);
                }
        }

}

使用特权

评论回复
12
向北lm|  楼主 | 2017-11-26 12:00 | 只看该作者
uint8_t getRemoteDeviceName(BLTDev *bltDev)
{
        uint8_t i;
        char *redata;
        uint16_t len;
       
        char linebuff[50];
        uint16_t linelen;
        char *p;
       
        char cmdbuff[100];
       
        strBLTAddr(bltDev,',');

        HC05_DEBUG("device num =%d",bltDev->num);
       
        for(i=0;i<bltDev->num;i++)
        {
                sprintf(cmdbuff,"AT+RNAME?%s\r\n",bltDev->unpraseAddr[i]);
                HC05_Send_CMD(cmdbuff,0);
               
                redata =get_rebuff(&len);
                if(redata[0] != 0 && strstr(redata, "OK") != 0)
                {
                       
                        linelen = get_line(linebuff,redata,len);
                        if(linelen>50 && linelen !=0 ) linebuff[linelen]='\0';        //超长截断
                                       
                        p = skipPrefix(linebuff,linelen,"+RNAME:");
                        if(p!=0)
                        {
                                strcpy(bltDev->name[i],p);
                        }

                }
                else
                {
                        clean_rebuff();
                        return 1;       
                }
               
                clean_rebuff();
       
        }
       
        return 0;

}

使用特权

评论回复
13
caijie001| | 2017-11-26 13:15 | 只看该作者
都是代码。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

使用特权

评论回复
14
向北lm|  楼主 | 2017-11-26 22:53 | 只看该作者
caijie001 发表于 2017-11-26 13:15
都是代码。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 ...

这些代码我都是一段一段分析过的。

使用特权

评论回复
15
Erichk| | 2017-11-28 11:49 | 只看该作者
BH-HC05 模块的数据传输速率有多高?

使用特权

评论回复
16
xixi2017| | 2017-11-28 16:59 | 只看该作者
兼容蓝牙3.0就行,好多手机现在都蓝牙3.0或4.0了。

使用特权

评论回复
17
向北lm|  楼主 | 2017-11-29 21:49 | 只看该作者
xixi2017 发表于 2017-11-28 16:59
兼容蓝牙3.0就行,好多手机现在都蓝牙3.0或4.0了。

算是比较新的了,应该兼容。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

34

帖子

0

粉丝