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

BLE_NUS change UART baudrate at runtime

Can you please help i use ble _ nus and after few message i need to change uart baudrate. I cloes uart then init uart with new baudrate parameter but everytime MCU goes to in error handler function. Where will be best to put  new uart initialization. I know that after i send via bluetooth to nrf52840 0x06 0x39 0x36 0x30 0x30 and nrf52840 forward this message on tx  in next 200 ms device connected to nrf52840s uart will respond on new baudrate which i have send that it changes.

  • how to debug hen you say and i have already see that "if you stop the CPU with a breakpoint, that will crash the softdevice"

  • Did I not also mention Monition Mode Debug ... ?

    And there is still, of course, printf-style debugging

    Or, if you're just catching the case where your UART code would crash anyhow, it's not such a problem ...

  • I find that when i send  message with change uart command ( array of letters) 'q' 'r' 't' as you can see in code section and when this condition happen nrf sends over uart 'q' 'r' 't' on new baudrate but i need to send this on  previously baudrate and after  this message is sent it need to receive message on new baudrate settings.

    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);
            }
    
            if (p_evt->params.rx_data.p_data[0] == 'q' && p_evt->params.rx_data.p_data[1] == 'r' && p_evt->params.rx_data.p_data[2] == 't')
            {
              
              bsp_board_led_invert(3);
    
              NRF_UART0->BAUDRATE = (UART_BAUDRATE_BAUDRATE_Baud9600 << UART_BAUDRATE_BAUDRATE_Pos);
            
        
            }
        }
    }

  • so have you now fixed the crashing?

    Is this now a new question?

  • chrashing is stil happening because now nrf change his baudrate  before it should.

    it should change baudrate after 'q' 'r' 't' send over his tx pin not before. 

    I send over smartphones BLE 'q' 'r' 't' (command to change baudrate) to nrf and nrf needs to send over his uart 'q' 'r' 't' and then change his baudrate to receive message from other device which is connected on his uart on new baudrate.

    Now is happening that when i send over smartphones BLE 'q' 'r' 't'  to nrf. Nrf change his baudrate and sends on new baudrate 'q' 'r' 't'. 

    i need that works on this order:

    1. smartphone via ble send 'q' 'r' 't'

    2. nrf receive from smartphone 'q' 'r' 't' and send over uart on his default baudrate 'q' 'r' t'

    3. after nrf is send 'q' 'r' 't' it change baudrate on new value

    4. nrf receive message from uart on new baudrate

    5. send this message to smartphone via BLE

Related