藍牙學習筆記(三)

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地址(作爲唯一標識)以及當前即將要執行的命令給當前正在開發的藍牙主設備,從設備和主設備都通過串口線和電腦相關聯,通過電腦端的軟件進行通信和測試。主要實現的是測試藍牙從設備的信號強度是否合格。

    目的:

        主要爲了解決藍牙從設備過多,測試藍牙設備過慢的問題,通過點對點的測試,提高可靠性和效率問題。













發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章