OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4689|回复: 12

关于蓝牙HC05无法正常运行

[复制链接]

8

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2016-7-14
在线时间
12 小时
发表于 2016-11-2 00:35:40 | 显示全部楼层 |阅读模式
1金钱
大神们好,我的板子是精英版,但我烧录进官方蓝牙例程后,无法正常初始化,请问是什么原因呢?
是不是硬件的原因?
我感觉,可能是蓝牙发送不了AT指令,但我可以直接用电脑和HC05通信、进入AT模式
而在单片机与HC05通信的时候,初始化失败,感觉像是发送不出AT指令
求大神们解答一下
谢谢

最佳答案

查看完整内容[请看2#楼]

模块大多数默认都是9600波特率,我不清楚你为什么要用115200。 我也用过一个蓝牙模块,但不是hc05,可以参考。 我个性签名档的博客地址,《STM32之蓝牙透传模块》。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2016-11-2 00:35:41 | 显示全部楼层
模块大多数默认都是9600波特率,我不清楚你为什么要用115200。
我也用过一个蓝牙模块,但不是hc05,可以参考。
我个性签名档的博客地址,《STM32之蓝牙透传模块》。
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
发表于 2016-11-2 09:06:23 | 显示全部楼层
我只知道一旦蓝牙处于透传模式,也就是两个蓝牙设备之间握手联机了就不能发AT了,发AT只能用有线串口。
回复

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2016-11-2 09:41:22 | 显示全部楼层
电脑与HC05通信正常,说明HC05正常。
你STM32与HC05通信不正常,说明STM32不正常。

先把电脑跟STM32的串口通信调通。
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复

使用道具 举报

21

主题

387

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1043
金钱
1043
注册时间
2016-9-8
在线时间
213 小时
发表于 2016-11-2 09:42:36 | 显示全部楼层
你知道的太多了。。。,你先把蓝牙模块配置一遍,很多模块的出厂设置都不知道是什么参数,如何通讯、
shop60994719.taobao.com
回复

使用道具 举报

8

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2016-7-14
在线时间
12 小时
 楼主| 发表于 2016-11-3 00:46:16 | 显示全部楼层
[mw_shl_code=c,true]u8 Test_Send[]="AT\r\n";
extern vu16 USART3_RX_STA;
extern u8 USART3_RX_BUF[100];

int main(void)
{       
        u8 i=0;
        u16 temp=0;

        delay_init();                     //延时函数初始化          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
        uart_init(115200);                 //串口初始化为115200
        LED_Init();                             //LED端口初始化
        HC05_Init();
       
  while(1)
        {
                printf("test!!!\r\n");
                HC05_KEY=1;
                delay_ms(10);
                for(i=0;i<sizeof(Test_Send);i++)
                {
                        while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);
                        USART_SendData(USART3,Test_Send);
                }
                HC05_KEY=0;
                delay_ms(20);
                if(USART3_RX_STA!=0)
                {
                        temp = USART3_RX_STA;
                        USART3_RX_STA=0;
                        LED0=~LED0;
                        for(i=0;i<temp;i++)
                        {
                                printf("%c",USART3_RX_BUF);
                                                }
                }
                LED1=~LED1;
                delay_ms(1000);
        }
}

[/mw_shl_code][mw_shl_code=c,true]//这是USART3
//串口接收缓存区        
u8 USART3_RX_BUF[100];                                 //接收缓冲,最大USART3_MAX_RECV_LEN个字节.

vu16 USART3_RX_STA=0;          

void usart3_init(u32 bound)
{
  //GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
         
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);        //使能GPIOB时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);        //使能USART3时钟
  
        //USART3_TX   GPIOB.10
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB.10
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;        //复用推挽输出
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOB.10
   
  //USART3_RX          GPIOB.11初始化
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;//PA10
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIOA.10  

  //Usart3 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器
  
   //USART 初始化设置

        USART_InitStructure.USART_BaudRate = bound;//串口波特率
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
        USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
        USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;        //收发模式

  USART_Init(USART3, &USART_InitStructure); //初始化串口1
  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启串口接受中断
        USART_ClearITPendingBit(USART3,USART_IT_RXNE);
  USART_Cmd(USART3, ENABLE);                    //使能串口1

}

void USART3_IRQHandler(void)
{
        if(USART_GetITStatus(USART3,USART_IT_RXNE)!=RESET)
        {
                USART_ClearITPendingBit(USART3,USART_IT_RXNE);
                USART3_RX_BUF[USART3_RX_STA++] = USART_ReceiveData(USART3);
        }
}
[mw_shl_code=c,true]//这是HC05的初始化
void HC05_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);        //使能PORTA

        //KEY
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;                                 // 端口配置
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                  //推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                 //IO口速度为50MHz
        GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //根据设定参数初始化GPIOA4
       
        GPIO_SetBits(GPIOA,GPIO_Pin_4);
//        GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);
       
        HC05_KEY=1;
       
        usart3_init(9600);        //初始化串口3为:9600,波特率.
}
[/mw_shl_code]
[/mw_shl_code]各位大神,今天我调试了一个晚上,还是调试不通?首先串口3经过测试是没有问题的,然后用电脑和HC05通信,是可以进入AT模式的
但是在用STM32进行HC05初始化的时候就出现问题了,因为HC05的配置都是一些GPIO口,应该不会有问题
感觉上问题时出现在利用STM32的串口3给HC05发送"AT”指令时,接受不到返回信息。
求大神指导。
在《ATK-HC05蓝牙常见问题汇总》中写道,传送AT信息是不能进过单片机的?但为什么官方例程中,也利用串口3给HC05发送消息?

大神啊,大神

回复

使用道具 举报

8

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2016-7-14
在线时间
12 小时
 楼主| 发表于 2016-11-3 00:47:15 | 显示全部楼层
各位大神,今天我调试了一个晚上,还是调试不通?首先串口3经过测试是没有问题的,然后用电脑和HC05通信,是可以进入AT模式的
但是在用STM32进行HC05初始化的时候就出现问题了,因为HC05的配置都是一些GPIO口,应该不会有问题
感觉上问题时出现在利用STM32的串口3给HC05发送"AT”指令时,接受不到返回信息。
求大神指导。
在《ATK-HC05蓝牙常见问题汇总》中写道,传送AT信息是不能进过单片机的?但为什么官方例程中,也利用串口3给HC05发送消息?

大神啊,大神


u8 Test_Send[]="AT\r\n";
extern vu16 USART3_RX_STA;
extern u8 USART3_RX_BUF[100];

int main(void)
{   
    u8 i=0;
    u16 temp=0;

    delay_init();            //延时函数初始化   
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);      //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    uart_init(115200);      //串口初始化为115200
    LED_Init();              //LED端口初始化
    HC05_Init();

  while(1)
    {
        printf("test!!!\r\n");
        HC05_KEY=1;
        delay_ms(10);
        for(i=0;i<sizeof(Test_Send);i++)
        {
            while(USART_GetFlagStatus(USART3,USART_FLAG_TXE)==RESET);
            USART_SendData(USART3,Test_Send);
        }
        HC05_KEY=0;
        delay_ms(20);
        if(USART3_RX_STA!=0)
        {
            temp = USART3_RX_STA;
            USART3_RX_STA=0;
            LED0=~LED0;
            for(i=0;i<temp;i++)
            {
                printf("%c",USART3_RX_BUF);
                        }
        }
        LED1=~LED1;
        delay_ms(1000);
    }
}

回复

使用道具 举报

8

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2016-7-14
在线时间
12 小时
 楼主| 发表于 2016-11-3 00:49:24 | 显示全部楼层
feilusia 发表于 2016-11-2 09:41
电脑与HC05通信正常,说明HC05正常。
你STM32与HC05通信不正常,说明STM32不正常。

大神,我调试过,STM32是正常的,但是利用STM32向HC05发AT时,是接受不到返回信息
回复

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2016-11-3 09:09:53 | 显示全部楼层
dream顺 发表于 2016-11-3 00:49
大神,我调试过,STM32是正常的,但是利用STM32向HC05发AT时,是接受不到返回信息

那说明你发送的指令不对。一般AT指令都是AT\r\n,后面这个符号不能漏。
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复

使用道具 举报

26

主题

280

帖子

1

精华

高级会员

Rank: 4

积分
908
金钱
908
注册时间
2013-8-2
在线时间
279 小时
发表于 2016-11-3 09:11:16 | 显示全部楼层
然后硬件检查串口电压正不正常,不正常就外接上拉电阻。
其他就没啥好说的,使用就是这么简单。
博客:http://blog.csdn.net/feilusia
CC2541群(127442605);CC2640群(557278427);
Android群(541462902);STM8/STM32群(164311667);
Linux群(512598061);职场交流群(450154342);
回复

使用道具 举报

16

主题

197

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
457
金钱
457
注册时间
2012-4-20
在线时间
91 小时
发表于 2016-11-3 09:30:16 | 显示全部楼层
本帖最后由 ba5rw 于 2016-11-3 09:35 编辑
feilusia 发表于 2016-11-3 09:09
那说明你发送的指令不对。一般AT指令都是AT\r\n,后面这个符号不能漏。

他已经把这一条定义成数组了。
我猜测蓝牙其实已经发过来应答信息,关键的问题是他没有把信息转换成ASCII码而是直接打印显示串口接收的缓冲数据。
回复

使用道具 举报

3

主题

794

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
1502
金钱
1502
注册时间
2015-3-3
在线时间
460 小时
发表于 2016-11-3 15:40:03 | 显示全部楼层
先测一下波特率是多少的
回复

使用道具 举报

8

主题

24

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2016-7-14
在线时间
12 小时
 楼主| 发表于 2016-11-3 20:59:13 | 显示全部楼层
今天终于调通了,是官方例程出错了
        usart3_init(38400);        //初始化串口2为:9600,波特率.
串口3应该是38400,而不是9600。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 03:43

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表