1、目的
實現藍牙轉串口的例子
2、所需的工具
藍牙芯片、2根usb轉串口、一款串口軟件、藍牙主設備,藍牙從設備
3、原理描述
使用的藍牙芯片爲nRF52832,使用的例程爲ble_peripheral,這個demo既可以作爲主機,也可以作爲從機,
本次主要利用主機主動搜索從機的廣播,獲取廣播的信息,此信息包括藍牙的mac地址,藍牙的RSSI,藍牙廣
的數據,通過對比mac地址,達到判斷此藍牙的信號強度。
主要原理,通過藍牙主設備,掃描四周的從設備,並且從從設備的廣播信息中獲取自己想要的數據,比如實現指定藍牙設備的信號強度的過濾。然後將藍牙數據反饋給測試軟件,並顯示出來。
4、過程
(1)藍牙怎麼主動掃描從設備
在main.c中
uint8_t destbuf[16]="zzsble ts";
memcpy(device_name, destbuf, 9);
ble_stack_init();
gap_params_init(device_name,BLE_NAME_LEN);
services_init();
advertising_init(BLE_ADVDATA_FULL_NAME, NULL);
conn_params_init();
err_code = ble_advertising_start(BLE_ADV_MODE_FAST);
如上,nordic nRf52832ac芯片,先修改設備名稱,方便自己尋找,接着初始化ble部分,藍牙初始化部分全部在這裏
(2)緊接着初始化串口,用於將數據傳輸到 電腦端的測試軟件
/*uart_init*/
nrf_gpio_cfg_output(TM_TXD);
nrf_gpio_pin_set(TM_TXD);
NRF_UART0->PSELTXD = TM_TXD;
NRF_UART0->PSELRXD = TM_RXD;
NRF_UART0->BAUDRATE=(UART_BAUDRATE_BAUDRATE_Baud9600 <<UART_BAUDRATE_BAUDRATE_Pos);
NRF_UART0->ENABLE = UART_ENABLE_ENABLE_Enabled;
NRF_UART0->TASKS_STARTTX = 1;
NRF_UART0->TASKS_STARTRX = 1;
NRF_UART0->EVENTS_RXDRDY = 0;
NRF_UART0->INTENSET = UART_INTENSET_RXDRDY_Msk;
NVIC_SetPriority(UART0_IRQn, 1);
NVIC_EnableIRQ(UART0_IRQn);
gsm_uart_set_input(gsm_uart_handler);
gsm_uart_send(p_char,11);
(3)什麼時候進行掃描
在收到電腦端發送過來的命令之後,啓動掃描設施
uint8_t Uart0_Data_Recv(void) //通過這個函數接受來自電腦端的消息,需要自己實現串口數據的接受
接受數據之後,跳轉到如下函數
while(1)
{
PROCESS_WAIT_EVENT_UNTIL(ev == ble_getdata_event);
lv_printf("[ble test] --start scan2\r\n");
sd_ble_gap_scan_start(&p_scan_params);
delay_sometime(et,20);
sd_ble_gap_scan_stop();
}
sd_ble_gap_scan_start(&p_scan_params);開始掃描的函數,參數如下,設置掃描的間隔時間0x0004
const ble_gap_scan_params_t p_scan_params =
{
0,
0,
NULL,
0x0004,
0x0004,
0
};
delay_sometime(et,20); //延時200毫秒,表示我掃描這麼久
sd_ble_gap_scan_stop(); //接着我停止掃描
(4)對掃描結果的處理
on_ble_evt,在這個函數裏面添加一個系統的推送時間的id
case BLE_GAP_EVT_ADV_REPORT:
NRF_LOG("\r\n[center] recv adv data3----\r\n"); //打印log
ble_gap_evt_adv_report_t adv_report = p_ble_evt->evt.gap_evt.params.adv_report;
for (int i=5,j=0; i>=0; i--,j++) //接受的mac地址和我掃描的地址正好相反,所以我給mac地址反一下{
data[j] = adv_report.peer_addr.addr[i];
}
data[6] = '\0';
test_blemac[6] = '\0';
if(NULL == strstr(test_blemac,data)) //對比看是不是我需要的藍牙設備,或者說有沒有掃描到我想要的設備
{
return;
}
sd_ble_gap_scan_stop(); //如果掃描到了,我提前停止掃描
sprintf(data1+4,"%d",adv_report.rssi); //格式化打印
data1[0] = 'r';
data1[1] = 's';
data1[2] = 's';
data1[3] = 'i';//添加自己的標識,等數據傳送到電腦端好識別
gsm_uart_send(data1,10);//通過串口將獲取的對應設備的信號強度給傳送到電腦端
break;
5、總結
涉及的設備:
測試藍牙從設備
當前開發藍牙主設備
電腦端軟件
串口線(ttl)2根
功能:
通過電腦端軟件,發送測試藍牙從設備的mac地址(作爲唯一標識)以及當前即將要執行的命令給當前正在開發的藍牙主設備,從設備和主設備都通過串口線和電腦相關聯,通過電腦端的軟件進行通信和測試。主要實現的是測試藍牙從設備的信號強度是否合格。
目的:
主要爲了解決藍牙從設備過多,測試藍牙設備過慢的問題,通過點對點的測試,提高可靠性和效率問題。