This post is older than 2 years and might not be relevant anymore
More Info: Consider searching for newer posts

BLEにおいて、セントラルからペリフェラル(マルチロール)へのWrite書き込みの方式について

こんにちわ。

以前にそちらの方で、BLEモジュールを購入させていただいたものです。

DevZoneでの質問回答指定の欄に御社が選択できましたので、質問させていただきました。

内容なのですが、現在、私はマルチロールを仲介として、セントラル⇔マルチロール⇔ペリフェラルのデータ送信プログラムを作成しています。

その中の役割として、セントラルからマルチロール側にWrite書き込みで指定のデータ(文字データ)を送信したいと考えています。

サンプルプロジェクト(セントラル側:hrs_c マルチロール側:multirole lesc)では、セントラルがマルチロール側にセンサデータのNotifyを許可するために一度行っていました。その部分を以下に示します。

static uint32_t cccd_configure(uint16_t conn_handle, uint16_t handle_cccd, bool enable)
{
NRF_LOG_DEBUG("Configuring CCCD. CCCD Handle = %d, Connection Handle = %d",
handle_cccd,conn_handle);

tx_message_t * p_msg;
uint16_t cccd_val = enable ? BLE_GATT_HVX_NOTIFICATION : 0;

p_msg = &m_tx_buffer[m_tx_insert_index++];
m_tx_insert_index &= TX_BUFFER_MASK;

p_msg->req.write_req.gattc_params.handle = handle_cccd;
p_msg->req.write_req.gattc_params.len = WRITE_MESSAGE_LENGTH;
p_msg->req.write_req.gattc_params.p_value = p_msg->req.write_req.gattc_value;
p_msg->req.write_req.gattc_params.offset = 0;
p_msg->req.write_req.gattc_params.write_op = BLE_GATT_OP_WRITE_REQ;
p_msg->req.write_req.gattc_value[0] = LSB_16(cccd_val);
p_msg->req.write_req.gattc_value[1] = MSB_16(cccd_val);
p_msg->conn_handle = conn_handle;
p_msg->type = WRITE_REQ;

tx_buffer_process();   ⇒この関数へ遷移し、上で設定した送信パラメータが送信される
return NRF_SUCCESS;
}

この部分において、送るデータを変更するとなると、「p_value」と「len」の部分になると思うのですが、p_valueに2文字("aa"等)、lenに2を指定すると書き込みができるのですが、

それ以上の文字数(3以上)をlenに指定すると、セントラル側の動作が止まってしまう現象が起きます。止まってしまう場所はread rspのケースが呼び出されたところで「HardFault」で止まっていました。

そもそもデータをWrite書き込みする際はこの部分を変更する方法であっているのでしょうか?そうであれば3文字以上を送る方法を教えていただければと思います。

環境は以下の通りです。

SoftDevice: S132
IDE: SES
BLE Device: NRF52832
SDK version: 15.30
Central project: ble_peripheral⇒ble_app_hrs_c
multirole project: experimental⇒ble_app_multirole_lesc

Related