使用CubeMX配置STM32连接JDY31蓝牙模块,实现手机控制LED灯开关

一,模块介绍

stm32使用的蓝牙模块主流是两种,一种是jdy31,一种是hc05,他俩的主要区别是jdy31只能当从机,被连接,hc05可以当作主机或者从机,可以主动连接,两者相差10元左右,如果只是想实现用手机蓝牙连接单片机,远程发送指令操控单片机,就选jdy31,便宜实惠。

jdy31实物图,最明显的就是上面像方波的黄色天线了,有这种的一般都是远程连接模块,很好分辨。

二,引脚配置

蓝牙模块实现远程连接操控单片机,听着听炫酷,其实说白了和两根线连接通信是一样的,jdy31与单片机连接使用的是串口通信,UART,搞清楚这个,我们就去cubemx配置引脚,找到UART的引脚,我使用的stm32f103c8t6有三个uart资源,我这里使用UART3来配置

UART串口协议需要两根线,这个协议很简单也很好理解,一根发送数据一根接收数据,把单片机的发送线TX接到jdy31的接收线rx,这样单片机的数据就能被蓝牙接收,同理,把单片机的接收线RX接到jdy31的发送线Tx,就完成了连接。

回到引脚配置,最上面的mode,选择Asynchronous,异步通信,用这个协议基本都是异步通信,他的同步通信功能更多的是为了兼容其他协议,

下面的Hardware flow control硬件控制功能关闭,这个功能是防止发送端发送太快,接收端来不及接收设置的,打开这个功能后,发送端发送一段数据后,接收端接收完,给发送端发送一个信号,发送端才可以继续发送,以此来防止数据覆盖丢失,不过我们一般用不到。

接下来这个很重要,在nvic中断允许寄存器中,打开允许uart的接收中断

打开这个中断后,我们发送数据给单片机,单片机才会进入中断,去执行我们想要的开灯或者关灯动作。

UART通信一个最重要的参数就是波特率,只有双方都用约定好的速度发送接收数据才能保证数据不丢失,打个比方,比如a与b约定通信,他们约定a每秒发送五个字节,b每秒接收五个字节,按照约定速率,顺利通信,如果a不按照协议,他每秒发送6个字节,但是b还是按照每秒5个字节接收,这样就会丢失一个字节。

这里我们将UART3的波特率设置为9600bit每秒,每秒发送9600位。jdy31波特率默认就是9600,这样就省的调蓝牙的波特率了,这样就配置完了,还是很简单的。

三,手机与jdy31蓝牙连接

手机与jdy31插上线后,手机打开蓝牙调试助手,app应用商店里面就可下载,点击连接,初始密码一般为1234,可以用电脑串口调试AT指令更改密码

四,发送数据给手机

在我们用cubemx配置好端口后,我们只需要一行代码就可以发送数据给手机了

HAL_UART_Transmit(&huart3,"hello world!\r\n",13,100);

调用这个函数,后两个参数13表示发送数据的长度,13个字节,100表示最大延时,超过这个延时还没发送完就不发了,设置为100就可以了

顺利接收

五,手机发送数据控制单片机

需要用到两个函数

第一个

HAL_UART_Receive_IT(&huart3,buf,1);

这个函数是我们要在主程序里面调用的,作用是打开单片机的接收中断,第二个参数是告诉单片机,接收到的数据放在哪里,我们一般定义一个数组,uint8_t buf[1],用来存放接收到的,如果没告诉单片机放哪,那接收到的数据就被扔掉了,进入不了单片机

后面的参数1表示接收到1个字节进入中断。

第二个函数

void USART3_IRQHandler(void)

这个函数不需要我们在主程序调用,他已经被cubemx编写好了,在

这个文件里面,每次接收到1个字节后就进入中断,进入到这个函数里面

在这个函数里面一定要再写一遍第一个函数,因为接收中断,使用一次之后就会关闭,只能手动打开,在中断函数里面再写一遍就可以无限打开了

六,利用接收到的数据点灯

在主程序里面写入

if(buf[0]=='2')
    {
        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_RESET);
    }
    
    if(buf[0]=='1')
    {
        HAL_GPIO_WritePin(GPIOA,GPIO_PIN_3,GPIO_PIN_SET);
    }
      

注意判断条件一定要加单引号’‘,表示字符型,这样才可以判断成功

成功点亮

作者:洛音竹

物联沃分享整理
物联沃-IOTWORD物联网 » 使用CubeMX配置STM32连接JDY31蓝牙模块,实现手机控制LED灯开关

发表评论