隨着物聯網的普及,智能家居的大衆化,嵌入式設備之間的通訊是不可避免的話題。數組
低功耗,微體積,穩定性是通訊設備的基本要求。同窗推薦的JDY-10M BLE 組網藍牙模塊是很好的選擇,就是下面這個東東。函數
最大組網數255個,最低功耗低達5ua,最遠可達50m(這個我沒試過)spa
總而言之,這個東西很牛B就是了。.net
官方給出的使用手冊已經清楚的不能再清楚了,下面分享一下我在使用這個模塊的時候遇到一些關鍵性的問題。code
設備:STM32C8T6 + JDY_BLE blog
功能說明:經過JDY BLE實現主從藍牙之間的控制。字符串
官方說明手冊上說的很明白,數據要以16位形式發送。io
可是與從機通訊時須要發送以下格式的數據:AAFB0003112233table
在串口的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 |
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