はじめに
nRF52 の BLE 機能を用いて 文字列を 複数のnRF52(peripheral側) から ホストとなる1台のnRF52(central側) に送ることを試みた。
なお、nRF52 のサンプルコードに
[SDK\examples\ble_central\ble_app_multilink_central] がある。このサンプルコードと
[SDK\examples\ble_peripheral] を用いれば、複数のperipheral側から Button を押すと Central側に その結果が反映される。
参考:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fsdk_nrf5_v17.1.0%2Fble_sdk_app_nus_eval.html
このサンプルコードでは、文字列を送ることが出来ない。
一方で、サンプルコードに
[C:\nRF5_SDK_17.1.0_up20220520\examples\ble_central\ble_app_uart_c] と
[C:\nRF5_SDK_17.1.0_up20220520\examples\ble_peripheral\ble_app_uart] がある。
これは、1台のnRF52(Central側) と 1台のnRF(peripheral側)間で nus(Nordic UART Service) を用いて
文字列の送受信を行うサンプルであり、複数台のnRF(peripheral側)から1台のnRF52(Central側) への送受信は、不可能である。
参考:https://infocenter.nordicsemi.com/index.jsp?topic=%2Fsdk_nrf5_v17.1.0%2Fble_sdk_app_nus_eval.html
サンプルコード修正のポイント
nRF52 に記載の2種類のサンプルコード
[SDK\examples\ble_central\ble_app_multilink_central] と [SDK\examples\ble_peripheral] をミックスさせて
コードを修正した。
ポイントとなるのは、nus を定義しているマクロを変更する必要がある。加えて、関連する項目の修正。
補足: [SDK\examples\ble_peripheral] をベースにすると動作が不安定になり
[SDK\examples\ble_central\ble_app_multilink_central] をベースに修正を加えると動作が安定する。
原因は、不明。
修正前
BLE_NUS_C_DEF(m_ble_nus_c);
static void db_disc_handler(ble_db_discovery_evt_t * p_evt)
{
ble_nus_c_on_db_disc_evt(&m_ble_nus_c, p_evt);
}
|
err_code = ble_nus_c_handles_assign(&m_ble_nus_c, p_ble_evt->evt.gap_evt.conn_handle, NULL);
|
err_code = ble_nus_c_init(&m_ble_nus_c, &init);
APP_ERROR_CHECK(err_code);
|
修正後
BLE_NUS_C_ARRAY_DEF(m_ble_nus_c, NRF_SDH_BLE_CENTRAL_LINK_COUNT);
static void db_disc_handler(ble_db_discovery_evt_t * p_evt)
{
ble_nus_c_on_db_disc_evt(&m_ble_nus_c[p_evt->conn_handle], p_evt);
}
|
err_code = ble_nus_c_handles_assign(&m_ble_nus_c[p_gap_evt->conn_handle], p_ble_evt->evt.gap_evt.conn_handle, NULL);
|
for (uint32_t i = 0; i < NRF_SDH_BLE_CENTRAL_LINK_COUNT; i++)
{
err_code = ble_nus_c_init(&m_ble_nus_c[i], &init);
APP_ERROR_CHECK(err_code);
}
|
☆2022年 5月23日(月) 午前10時15分 初版(Ver1.00) 作成