基于stm32的蓝牙串口收发系统

本实验利用信驰达的蓝牙模块进行串口的收发任务,stm32f103用的是串口1,手机APP用的是LighntBlue,蓝牙名字为Vence,stm32开发板为中国移动的OneNet开发板
①连线
蓝牙模块                stm32f103
VCC                      VCC
GND                      GND
EN                       PC10
RX                       TX1
TX                       RX1
BRTS                     GND
P04                      PC7
P05                      PC8

②蓝牙模块的工作模式
启动蓝牙模块需要将EN置0,BRTS置0,接上电源,就开始广播模式
当连接成功时,P04为高电平,P05为低电平
利用stm32启动的方式为,接上电源,按下Key1键盘,此时蓝灯,红灯,黄灯亮起;
红灯亮,绿灯灭,还没有连接成功,如果红灯灭,绿灯亮就代表已经连接成功

③stm32发送固定数据到手机APP
{0x67,0x6c,0x75,0x05,0x20}
通过按下stm32的按键1,也就是PC13口,会发送数据到手机,此时黄灯如果是灭的状态,就改为亮,如果是亮的状态就改为灭


④手机APP发送数据到stm32
如果手机发送的一个字节为0x01,通过代码判断是0x01的话,黄灯的状态就会取反

 

原理图:

 

启动状态指示灯:接通电源,按下key1,红、黄、蓝色同亮:

 

LightBlue搜索到Vence蓝牙名字:Vence

 

点击连接,连接成功后,指示灯变为蓝、黄、绿

app的0xFFE4端口开启接收数据,按下Key1,发送指令的数据{0x67,0x6c,0x75,0x05,0x20}到app,此时黄灯状态取反,APP收到数据

 

 

在APP的0XFFE9端口输入0x01,stm32判断后,黄灯的状态取反

 

stm32主函数代码:

//本设计利用信驰达进行蓝牙通信,stm32的PC10控制蓝牙模块的使能,蓝牙模块的工作电压范围在1.8-3.3V,具有低功耗

#include "stm32f10x.h"
#include "usart1.h"
#include "bluetooth.h"
#include "key.h"
#include "led.h"

u8 GLU[5] = {0x67,0x6c,0x75,0x05,0x20};
int main(void)
{
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);                         //中断控制器分组设置
        Key_Init();                                                                                                            //初始化按键
        EXTI_Configuration();
        Usart1_Init(115200);                                                                   //设置串口1的波特率为115200bit
        LedInit();                                                                                                    //初始化led
        Delay_Init();                                                                                                 //初始化延迟函数
        BlueTooth_Init();                                                                                //初始化蓝牙模块
        USART_Cmd(USART1, DISABLE);                                                                                                        //除能串口
        while(1)
        {
                USART_ClearFlag( USART1, USART_FLAG_TC );
                if(send_flag == 1)
                {
                        USART_Cmd(USART1, ENABLE);                                                                                                                //除能串口
                        GPIO_ResetBits(GPIOC,EN);                                           //使能蓝牙模块
                        DelayMs(20);                                                                      //启动蓝牙模块延迟20ms
                        while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_7) != Bit_SET || GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_8) != Bit_RESET);
                        Usart_SendString(USART1, GLU);
                        //GPIO_SetBits(GPIOC,EN);                                        //发送完数据除能蓝牙模块       
                        DelayMs(20);                                                                    //启动蓝牙模块延迟20ms
                        send_flag = 0;
                        //USART_Cmd(USART1, DISABLE);                                                                                  //除能串口
                }
        }
}

 

好的,下面是一个简单的 STM32 蓝牙串口接收代码,你可以参考一下: ```c #include "stm32f10x.h" #include <stdio.h> #define RX_BUF_SIZE 32 uint8_t rx_buf[RX_BUF_SIZE]; uint8_t rx_index = 0; uint8_t rx_complete_flag = 0; void USART1_IRQHandler(void) { if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) // 接收中断 { uint8_t data = USART_ReceiveData(USART1); // 读取接收数据 if (data == '\n') // 如果接收到换行符,表示一条完整的数据已经接收完毕 { rx_buf[rx_index] = '\0'; // 在接收缓冲区的末尾添加字符串结束符 rx_index = 0; // 重置接收缓冲区索引 rx_complete_flag = 1; // 标记接收完成 } else { if (rx_index >= RX_BUF_SIZE) // 如果接收缓冲区已满,丢弃多余数据 { rx_index = 0; } rx_buf[rx_index++] = data; // 将数据存入接收缓冲区 } } } int main(void) { // 初始化 USART1 USART_InitTypeDef USART_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; 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(USART1, &USART_InitStructure); USART_Cmd(USART1, ENABLE); // 初始化 NVIC NVIC_InitTypeDef NVIC_InitStructure; NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); while (1) { if (rx_complete_flag) // 如果接收完成 { printf("Received data: %s\r\n", rx_buf); // 在串口终端打印接收到的字符串 rx_complete_flag = 0; // 清除接收完成标志位 } } } ``` 这个代码通过 USART1 的 RX 中断来接收数据,当接收到换行符时,认为一条完整的数据已经接收完毕。如果接收缓冲区已满,会丢弃多余的数据,以确保接收缓冲区不会溢出。最终将接收到的字符串打印到串口终端上,以供调试和测试使用。 希望这个代码对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值