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

Characteristics when connecting a peripheral to central

Hi, I have a peripheral device which has buttons that connects to a central device which is the NRF52 board. When the peripheral device is connected and buttons are inputted, the characteristics of the button are not displayed on the UART terminal when I press it. I was not sure why because I have the correct UUID and the RX and TX characteristics. I have implemented the UART example to the HRS example, but it was because I wanted to have the board act as both the central and the peripheral but connect to any or multiple peripheral. I know that inside the ble_nus_c_evt_handler() method there is ble_nus_c_rx_notif_enable(), but it does not work.

Here is my code so far. Please let me know if there are any errors.

gist.github.com/.../41be2f1584a462dd2c2971764595305f

Any help would be appreciated. Thanks.

  • I'm not saying that you have to use the ble_app_uart_c example, but you can port parts of it to the ble_app_hrs_c, or add peripheral role to the ble_app_uart_c example. Up to you.

  • That is what I was doing with the ble_app_hrs_c example by trying to put UART from ble_app_uart_c because it is not really working with regards to finding the UUID. However, it works when you put the m_target_periph_name[] as I said before. What parts do I have to add for the ble_app_hrs_c, I have incorporated the UART portions from the example, but I am not sure if it is everything. Can you check my code out that I provided above, if possible. Thanks.

  • Can't you just do something like this when you receive an advertising report:

        case BLE_GAP_EVT_ADV_REPORT:
        {
            const ble_gap_evt_adv_report_t * p_adv_report = &p_gap_evt->params.adv_report;
    
            if (is_uuid_present(&m_nus_uuid, p_adv_report))
            {
                err_code = sd_ble_gap_connect(&p_adv_report->peer_addr,
                                              &m_scan_params,
                                              &m_connection_param);
                APP_ERROR_CHECK(err_code);
            }
        }break;
    

    Instead of checking the name like you are doing now. I'm have trouble understand what the problem is, maybe I'm misunderstanding you?

  • This is how I have it set up:

    case BLE_GAP_EVT_ADV_REPORT: {

            if (strlen(m_target_periph_name) != 0)
            {
                if (find_adv_name(&p_gap_evt->params.adv_report, m_target_periph_name))
                {
                    // Initiate connection.
                    err_code = sd_ble_gap_connect(&p_gap_evt->params.adv_report.peer_addr,
                                                  &m_scan_params,
                                                  &m_connection_param);
                    if (err_code != NRF_SUCCESS)
                    {
                        NRF_LOG_INFO("Connection Request Failed, reason %d\r\n", err_code);
                    }
                }
            }
    					
    					
            else
            {
               /** We do not want to connect to two peripherals offering the same service, so when
                *  a UUID is matched, we check that we are not already connected to a peer which
                *  offers the same service. */
    						
    						const ble_gap_evt_adv_report_t * p_adv_report = &p_gap_evt->params.adv_report;
    						
                if ((is_uuid_present(&m_adv_uuids[0], p_adv_report)))
    								
                {
                    // Initiate connection.
                    err_code = sd_ble_gap_connect(&p_adv_report->peer_addr,
                                                  &m_scan_params,
                                                  &m_connection_param);
    								
    								
                    if (err_code == NRF_SUCCESS)
                {
                    
                    printf("Connecting to target %02x%02x%02x%02x%02x%02x\r\n",
                             p_adv_report->peer_addr.addr[0],
                             p_adv_report->peer_addr.addr[1],
                             p_adv_report->peer_addr.addr[2],
                             p_adv_report->peer_addr.addr[3],
                             p_adv_report->peer_addr.addr[4],
                             p_adv_report->peer_addr.addr[5]
                             );
                }
                }
            }
        } 
    			
    			
    			break; // BLE_GAP_ADV_REPORT
    

    The problem is trying to get the UUID characteristics to show up in the UART terminal such as Termite when inputting buttons on a peripheral device. The NRF52 board should act as a central and peripheral.So that is why I am trying to incorporate the UART example with HRS relay example.

  • Hi Petter, one question that could potentially solve it for me. How do I call the uart_event_handle without the uart_init because I have NRF_LOG_INFO instead of printf()? This is part of the APP_UART_FIFO_INIT(&comm_params, UART_RX_BUF_SIZE, UART_TX_BUF_SIZE, uart_event_handle, APP_IRQ_PRIORITY_LOW, err_code);

Related