蓝牙模块HC08 和 手机APP数据传输 (STM32代码)


目录

一、HC08重要参数

二、主要AT命令解释

三、STM32端操作

1.操作重点

2.GPIO初始化代码

3.UART初始化代码

4.HC08发送数据代码

5.HC08接收数据代码

6.数据处理

四、手机APP端操作

1.操作重点:

2.APP步骤截图:

五、源代码下载


一、HC08重要参数

  • 蓝牙4.0,BLE,主从一体
  • 模块上电后,启动需要150ms
  • 默认波特率:9600
  • 模块未连接时,为AT指令模式,连接后为串口透传模式;
  • 空中速率:1Mbps;  (与HC05, HC06等不同, 不能直接与之通信)
  • 通信距离:80米; (空旷)
  • 工作电流:主机未连21mA,已连9mA; 从机未连8.5mA, 已连9mA; 睡眠0.4uA; 

二、主要AT命令解释

  • AT指令结尾,无需添加换行符;
  • AT指令修改,立即生效,掉电不丢失;
  • AT指令修改,成功时,统一返回OK,查看信息类指令除外;
  • AT指令修改,不成功,不返回任何信息;


三、STM32端操作

1.操作重点

  1.  开发板,使用UART与HC08通信, 4线:VCC, GND, TX, RX;
  2. UART波特率,使用HC08默认的9600;
  3. 发送AT指令,无需换行符结尾;
  4. 只要一条AT指令,设置HC08为从机模式,就能自动连接手机蓝牙APP;
  5. 模块名称不重要,也不用密码;
  6.  连接前:AT模式,蓝灯闪烁;连接后:数据透传模式,不再接受AT命令,蓝灯常亮;

2.GPIO初始化代码

  GPIO_InitTypeDef  GPIO_InitStructure;    
    // 时钟使能
    RCC->APB1ENR |= RCC_APB1ENR_USART3EN;                           // 使能USART1时钟
    RCC->APB2ENR |= RCC_APB2ENR_IOPBEN;                             // 使能GPIOA时钟
    // GPIO_TX引脚配置
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;                // TX引脚,配置为复用推挽工作模式
    GPIO_Init (GPIOB, &GPIO_InitStructure);
    // GPIO_RX引脚配置
    GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_11;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING ;         // RX引脚,配置为浮空输入工作模式
    GPIO_Init (GPIOB, &GPIO_InitStructure);

3.UART初始化代码

    NVIC_InitTypeDef  NVIC_InitStructure;
    USART_InitTypeDef USART_InitStructure; 
  // 中断配置
    NVIC_InitStructure .NVIC_IRQChannel = USART3_IRQn;
    NVIC_InitStructure .NVIC_IRQChannelPreemptionPriority=2 ;       // 抢占优先级
    NVIC_InitStructure .NVIC_IRQChannelSubPriority = 2;             // 子优先级
    NVIC_InitStructure .NVIC_IRQChannelCmd = ENABLE;                // IRQ通道使能
    NVIC_Init(&NVIC_InitStructure);                              
    
    //USART 初始化设置
    USART_DeInit(USART3); 
    USART_InitStructure.USART_BaudRate   = baudrate;                // 串口波特率
    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);                       // 初始化串口
    
    USART_ITConfig(USART3, USART_IT_TXE , DISABLE );
    USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);                  // 使能接受中断
    USART_ITConfig(USART3, USART_IT_IDLE, ENABLE);                  // 使能空闲中断
    
    USART_Cmd(USART3, ENABLE);                                      // 使能串口, 开始工作  
    

4.HC08发送数据代码

// 发送AT指令,或字符串
void  HC08_SendString(char* strTemp)          
{
    HC08_SendData((uint8_t *)strTemp, strlen(strTemp));                  
}


// 发送指定长度的数据
void  HC08_SendData(uint8_t* dataBuf, uint16_t cnt)  
{
    while(cnt--)
    {
        while((HC08_UARTx->SR & 0X40)==0);  // 等待上一次串口数据发送完成 
        HC08_UARTx->DR = *dataBuf;          // 写DR,串口将的发送数据 
        dataBuf++;
    }
}

5.HC08接收数据代码

void USART3_IRQHandler(void)           
{     
    static uint8_t cnt=0;
    static uint8_t RxTemp[256];
    
    // 接收中断
    if(USART3->SR & (1<<5))
    {
        RxTemp[cnt++] = USART3->DR ;                        // 读取数据寄存器值;注意:读取DR时自动清零中断位;
    }
    
    // 空闲中断, 用于配合接收中断,可判断一帧数据接收完成
    if(USART3->SR & (1<<4))                                 // 检查IDLE中断标志
    {         
        memcpy(xUSART.USART3RecivedBuffer , RxTemp , 256);  // 临时数据转存为全局数据, 等待处理,注意:复制的是整个数组,包括0值,以方便字符串数据
        xUSART.USART3RecivedFlag = 1;                       // 标记;外部程序通过检查xUSARTFlag.USART_2_Recived是否等于1, 可判断是否有新一帧数据   
        xUSART.USART3RecivedCNT  = cnt;
        cnt=0;  
        memset(RxTemp ,0, 256);                             // 临时数据空零,准备下一次的接收   
        USART3 ->SR;  USART3 ->DR;                          // 清零IDLE中断标志位!! 序列清零,顺序不能错!! 
        
        /********************************************************************************
         方式1:可在这里调用外部函数,处理接收到数据(不推荐)
         方式2:可在外部判断USARTxRecivedFla==1,然后处理数据区xUSART.USARTxRecivedBuffer  
         禁 止:不可在中断里调用printf等不可重入函数!!!
         示 例: 下面这一行代码, 只作示例, 输出到上位机以观察所收到的最新一帧数据, 可删除
        *********************************************************************************/
        USART1_printf((char*)xUSART.USART3RecivedBuffer);   // 这行代码只作示例,输出USART3收到的最新一帧数据,可删除  
     }  
}  

6.数据处理

    // 本函数为main函数中的while函数
    while(1)                                 // while函数死循环,不能让main函数运行结束,否则会产生硬件错误
    {    
        // Scheduler_Run();                  // 任务轮询器; 如要使用, 清除while中其它函数(移到Scheduler文件中去), 以保证计时的准确
        System_DelayMS(100);                 // 上面已初始化SysTick, 可直接使用delay_ms()、delay_us()
        LED_RED_TOGGLE;                      // 红色LED 每0.5秒闪灭一次,以监察系统正常工作   
                    
        if(xUSART.USART1RecivedFlag==1)                                  // 判断上位机(USART1)是否收到新的数据
        {
            HC08_SendString((char *)xUSART.USART1RecivedBuffer);         // 如果收到新数据,就从蓝牙发送出去
            xUSART.USART1RecivedFlag=0;                                  // 处理完了,标记清0,不然下一个while循环又会重复操作
        }                        
        
        // 处理HC08收到的数据
        if(xUSART.USART3RecivedFlag==1)                                  // 判断蓝牙HC08(USART3)是否收到新的数据
        {
            if(xUSART.USART3RecivedBuffer[0]=='0')   { LED_BLUE_OFF;}    // 判断收到的数据
            if(xUSART.USART3RecivedBuffer[0]=='1')   { LED_BLUE_ON;}   
            if(xUSART.USART3RecivedBuffer[0]=='3')   { LED_BLUE_TOGGLE;}             
            xUSART.USART3RecivedFlag=0;                                  // 处理完了,标记清0,不然下一个while循环又会重复操作
        }   
    }  

四、手机APP端操作

1.操作重点:

  • 手机设置,打开蓝牙功能,无需搜索连(接在APP里搜索);
  • 手机设置,打开位置功能!! 不开位置时搜索不到HC08;
  • 必须使用BLE协议的APP,下图二维码为HC蓝牙助手; 

2.APP步骤截图:


五、源代码下载

需要代码的兄弟,可通过以下方式下载代码:

1:CSDN资源HC08与手机蓝牙APP通信.zip_stm32与手机APP通过蓝牙通信-嵌入式文档类资源-CSDN下载

2:Q群文件夹:887199504

互相学习,欢迎指正!~


HC-05蓝牙模块是一款常用的蓝牙模块,可以与STM32单片机进行通信。而STM32手机APP则是基于STM32单片机进行开发的手机应用程序。 HC-05蓝牙模块STM32单片机之间的通信可以通过串口进行。首先,需要在STM32单片机中配置串口通信的参数,例如波特率、数据位、停止位等。然后,可以使用相应的库函数在STM32单片机中编写程序,实现与HC-05蓝牙模块的通信。可以使用串口接收和发送函数,接收HC-05发送过来的数据,或者向HC-05发送数据。 而STM32手机APP可以使用开发工具进行编写,常用的开发工具有Android Studio和Xcode等。在开发过程中,首先需要连接STM32单片机和手机,可以使用HC-05蓝牙模块手机进行蓝牙连接。然后,在APP中通过蓝牙通信实现与STM32单片机的通信。可以使用蓝牙API函数来连接HC-05蓝牙模块,并使用蓝牙通信函数发送和接收数据。 在实际应用中,可以根据具体需求设计通信协议,例如定义不同的数据包格式,用来传输各种类型的数据。在STM32单片机中,可以根据接收到的数据进行相应的处理,并执行相应的操作。在手机APP中,可以展示STM32单片机发送的数据,并根据接收到的数据进行一些操作或显示。 综上所述,HC-05蓝牙模块可以与STM32手机APP进行通信,通过串口和蓝牙通信实现数据传输和控制操作。这样的组合可以实现STM32单片机与手机之间的无线通信,方便实现各种功能和应用。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值