蓝牙组网
随着物联网的普及,智能家居的大众化,嵌入式设备之间的通信是不可避免的话题。
低功耗,微体积,稳定性是通信设备的基本要求。同学推荐的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