西東京市にいる組み込みおやじ-電子工作、回路設計、ファーム TIPS

このブログはビーコンの代表である菅原が、電気電子、電子工作、組み込みソフトウェアなどで、自分が苦労したところや面白い気づきなどを記事にしていきます。電子工作やマイコンに親しむ人が少しでも増えたらという思いでつづります。
やっぱり、電子工作が好きなんですよ。
<< nrf_fstorage_write の lenは4の倍数で | main |
ble_nus_data_send() の送信タイミング
0

    JUGEMテーマ:組み込み開発

     

    nRF5_SDK_15.2

    softdevice6.10

     

    とりあえず、BLEでデータを送受信する場合 NordicのSDKの ble_nus を使うのが簡単。

    しかしながらうかつにble_nus_data_send()関数をコールするとハングアップしてしまう。

    nus_data_handler の引数 ble_nus_evt_t * p_evt->type はサンプルでは BLE_NUS_EVT_RX_DATA しかないが実際には

     

    BLE_NUS_EVT_RX_DATA //データを受信した

    BLE_NUS_EVT_TX_RDY  //送信可能状態になった

    BLE_NUS_EVT_COMM_STARTED //ble_nus 接続した

    BLE_NUS_EVT_COMM_STOPPED // ble_nus 切断した

     

    の四つのタイプがある。

    これらで BLE_NUS_EVT_COMM_STARTED がきたら ble_nus_data_send()することができる。

    ble_nus_data_send()後、BLE_NUS_EVT_TX_RDYで送信完了を確認するまでは ble_nus_data_send()をコールできない。

     

    ◆元のサンプルソース

    static void nus_data_handler(ble_nus_evt_t * p_evt)
    {

        if (p_evt->type == BLE_NUS_EVT_RX_DATA)
        {
            uint32_t err_code;

            NRF_LOG_DEBUG("Received data from BLE NUS. Writing data on UART.");
            NRF_LOG_HEXDUMP_DEBUG(p_evt->params.rx_data.p_data, p_evt->params.rx_data.length);

            for (uint32_t i = 0; i < p_evt->params.rx_data.length; i++)
            {
                do
                {
                    err_code = app_uart_put(p_evt->params.rx_data.p_data[i]);
                    if ((err_code != NRF_SUCCESS) && (err_code != NRF_ERROR_BUSY))
                    {
                        NRF_LOG_ERROR("Failed receiving NUS message. Error 0x%x. ", err_code);
                        APP_ERROR_CHECK(err_code);
                    }
                } while (err_code == NRF_ERROR_BUSY);
            }
            if (p_evt->params.rx_data.p_data[p_evt->params.rx_data.length - 1] == '¥r')
            {
                while (app_uart_put('¥n') == NRF_ERROR_BUSY);
            }
        }

    }
     

     

    ◆p_evt->type を switch文で処理してみた。各処理の中身は各自コーディングしてください。

    static void nus_data_handler(ble_nus_evt_t * p_evt)
    {
        uint32_t err_code;
        switch(p_evt->type){
            case BLE_NUS_EVT_RX_DATA:

            //データ受信の処理

                break;

     

            case BLE_NUS_EVT_TX_RDY:       /**< Service is ready to accept new data to be transmitted. */

            //データ送信完了

         // ble_nus_data_send()関数でデータ送信した後、送信できる状態になった

                break;

     

            case BLE_NUS_EVT_COMM_STARTED: /**< Notification has been enabled. */

         // BLE_NUS が接続した。ble_nus_data_send()関数で送信できるようになった。

                break;
            case BLE_NUS_EVT_COMM_STOPPED: /**< Notification has been disabled. */

         // BLE_NUS が切断した。

                break;
        }
    }

     

    | ビーコン菅原 | nRF5x Nordic | 19:14 | comments(0) | trackbacks(0) |









    http://blog.suga41.com/trackback/388
          1
    2345678
    9101112131415
    16171819202122
    23242526272829
    3031     
    << December 2018 >>
    + RECOMMEND
    + RECOMMEND
    + SELECTED ENTRIES
    + RECENT COMMENTS
    + RECENT TRACKBACK
    + CATEGORIES
    + ARCHIVES
    + つぶやき
    + MOBILE
    qrcode
    + LINKS
    + PROFILE