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

Nus profile seems to cause system reset if the data length too long.

iphone5_b.psdm370_android6_b.psdlong_write_error.pngI using SDK11. I porting nus profile to my system and make a customer's UUID. I use Lightblue on iPhone 5 to connect my system. I sent a data through my customer's UUID. My system work fine when the data length is less than or equal 20 bytes. It will cause system reset if the data length is great than 20 bytes. Was the softdevice error, or I made something wrong?

Parents
  • The system is probably reset because APP_ERROR_CHECK() is called with something else than NRF_SUCCESS (0x00000000) somewhere. If you call ble_nus_string_send() with a longer length than 20 bytes it will return NRF_ERROR_INVALID_PARAM.

    The maximum ATT MTU with the S130 v2 is 23 bytes, the header is 3 bytes, so up to 20 bytes of data is allowed.

  • Yes, If I respond with sd_ble_user_mem_reply( p_ble_evt->evt.gap_evt.conn_handle, NULL), I receive a BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST event. If I respond with auth_reply.params.write.gatt_status = BLE_GATT_STATUS_ATTERR_REQUEST_NOT_SUPPORTED and auth_reply.type = BLE_GATTS_AUTHORIZE_TYPE_WRITE. Then I call the function of sd_ble_gatts_rw_authorize_reply(p_ble_evt->evt.gatts_evt.conn_handle, &auth_reply) like I post on 3rd Nov, and it will return error code = 7 (NRF_ERROR_INVALID_PARAM, cause system reset).

    If I change the code as follows, the system won't cause system reset. I want to know it is correct or not? How may bytes I need to use? Which event I will get at each message segmentation to get data? LightBlue on BlueiPhone and nRFConnect on Android phone have the same result.

    case BLE_EVT_USER_MEM_REQUEST:
    {
        static ble_user_mem_block_t mem_block;
        static uint8_t buffer[40];
        mem_block.len = 40;
        mem_block.p_mem = &buffer[0];
        err_code = sd_ble_user_mem_reply(m_conn_handle, &mem_block);
        break;
    }
    case BLE_EVT_USER_MEM_RELEASE:
    {
        // call an error respond function.
        break;
    }
    
Reply
  • Yes, If I respond with sd_ble_user_mem_reply( p_ble_evt->evt.gap_evt.conn_handle, NULL), I receive a BLE_GATTS_EVT_RW_AUTHORIZE_REQUEST event. If I respond with auth_reply.params.write.gatt_status = BLE_GATT_STATUS_ATTERR_REQUEST_NOT_SUPPORTED and auth_reply.type = BLE_GATTS_AUTHORIZE_TYPE_WRITE. Then I call the function of sd_ble_gatts_rw_authorize_reply(p_ble_evt->evt.gatts_evt.conn_handle, &auth_reply) like I post on 3rd Nov, and it will return error code = 7 (NRF_ERROR_INVALID_PARAM, cause system reset).

    If I change the code as follows, the system won't cause system reset. I want to know it is correct or not? How may bytes I need to use? Which event I will get at each message segmentation to get data? LightBlue on BlueiPhone and nRFConnect on Android phone have the same result.

    case BLE_EVT_USER_MEM_REQUEST:
    {
        static ble_user_mem_block_t mem_block;
        static uint8_t buffer[40];
        mem_block.len = 40;
        mem_block.p_mem = &buffer[0];
        err_code = sd_ble_user_mem_reply(m_conn_handle, &mem_block);
        break;
    }
    case BLE_EVT_USER_MEM_RELEASE:
    {
        // call an error respond function.
        break;
    }
    
Children
No Data
Related