蓝牙组网

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

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

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

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

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

 

设备:STM32C8T6 + JDY_BLE 

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

 

1、发送数据的问题

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

但是与从机通信时需要发送如下格式的数据:AAFB0003112233

(1)字符串方式发送

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

他在发送的时候先把数据转换成对应的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));
    }     
}

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

 

2、组网问题

利用这个模块组网其实很简单,需要设置同样的广播名和组网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

 

posted @ 2018-06-16 19:01  Andrew_qian  阅读(928)  评论(0编辑  收藏  举报