蓝牙组网

随着物联网的普及,智能家居的大众化,嵌入式设备之间的通讯是不可避免的话题。数组

低功耗,微体积,稳定性是通讯设备的基本要求。同窗推荐的JDY-10M BLE 组网蓝牙模块是很好的选择,就是下面这个东东。函数

最大组网数255个,最低功耗低达5ua,最远可达50m(这个我没试过)spa

总而言之,这个东西很牛B就是了。.net

官方给出的使用手册已经清楚的不能再清楚了,下面分享一下我在使用这个模块的时候遇到一些关键性的问题。code

 

设备:STM32C8T6 + JDY_BLE blog

功能说明:经过JDY BLE实现主从蓝牙之间的控制。字符串

 

一、发送数据的问题

官方说明手册上说的很明白,数据要以16位形式发送。io

可是与从机通讯时须要发送以下格式的数据:AAFB0003112233table

(1)字符串方式发送

在串口的printf打印和USART_SendData(USART1,Data); 方式发送都是字符串方式发送。ast

他在发送的时候先把数据转换成对应的ASCII码,而后在按照二进制的方式一位一位的发送出去。

例如发送字符串:ABCD

首先将字符串转化为二进制数据

0000 1010 (A)  、0000 1011  (B)  、0000 1100  (C)  、0000 1101 (D)

而后按照串口设置的8位发送出去,串口接收到的数据以下

 

编号 数据
0 A
1 B
2 C
3 D

(2)16进制发送

16进制发送的时候,一般先把两个8位的数据合成一个16位的数据,而后再发送

一样发送上面的ABCD字符串,须要先将数据转化为:

1010 1011 (AB)   1100 1101  (CD)    成两个16位的数据:0XAB  0XCD

而后在经过串口发送,串口接收到的数据格式以下:

编号 数据
0 AB
1 CD

因此,在使用JDY BLE模块的时候,数据发送要以16进制发送,须要先将数据转换为16位的,而后在发送。

可是我须要发送的数据比较固定,我就直接写了:

const char master_to_bluetooth3[7] = {0XAA,0XFB,0X00,0X03,0XEE};

而后调用发送函数:Send_Bluetooth(master_to_bluetooth1);

//主机蓝牙发送信息给从机蓝牙,16进制发送
void Send_Bluetooth(const char send[])
{
    unsigned char i = 0;
    
    //计算数组元素数,须要加上1,
    unsigned char n = sizeof((const char *)send)/sizeof(send[0]) + 1;

    for(i = 0; i<n; i++)
    {
        USART1_Put_Char(*(send + i));
    }     
}

这样发送,接收端才能接收到数据,否则收不到数据。

 

二、组网问题

利用这个模块组网其实很简单,须要设置一样的广播名和组网ID号,而后不一样的子模块分别设置不一样的地址编号。

在主机通讯的时候,直接在发送的数据里面加上定向发送的模块的地址,便可发送到指定的模块上面。

const char master_to_bluetooth3[7] = {0XAA,0XFB,0X00,0X03,0XEE};
const char master_to_bluetooth1[7] = {0XAA,0XFB,0X00,0X01,0XEE};
const char master_to_bluetooth4[7] = {0XAA,0XFB,0X00,0X04,0XEE};

 

参考资料:https://blog.csdn.net/yibu_refresh/article/details/22695063

相关文章
相关标签/搜索