I use SDK16.0.0 and SD7.0.1-S132 Implement NUS functions, 1 * ble_central and 6 * ble_peripheral.
The uart of ble_central connect to STM32MCU.
My system run as follows, 6 * ble_peripheral data upload per second, 1 * ble_central send command to ble_peripheral one by one per 200ms.
When it runs for a while, the host is error "NRF_ERROR_SVC_HANDLER_MISSING", source code as below.
void uart_event_handle(app_uart_evt_t * p_event)//串口事件回调函数,串口初始化时注册,该函数中判断事件类型并进行处理 { //当接收的数据长度达到设定的最大值或者接收到换行符后,则认为一包数据接收完成,之后将接收的数据发送给从机 static uint8_t data_array[BLE_NUS_MAX_DATA_LEN]; static uint16_t index = 0; uint32_t ret_val; uint16_t con_handle; static uint8_t len = 6; switch (p_event->evt_type)//判断事件类型 { /**@snippet [Handling data from UART] */ case APP_UART_DATA_READY: UNUSED_VARIABLE(app_uart_get(&data_array[index])); //回传接收到的串口数据 //app_uart_put(data_array[index]); index++; if (((data_array[index - 2] == '\r') && (data_array[index - 1] == '\n')) || (index >= (m_ble_nus_max_data_len)))//串口数据接收完成 { //NRF_LOG_INFO("index: 0x%x",index); con_handle =set_con_handle(&m_ble_nus_c[0],data_array); NRF_LOG_DEBUG("Ready to send data over BLE NUS"); NRF_LOG_HEXDUMP_DEBUG(data_array, index); if(con_handle != 0xFFFF) { do { //NRF_LOG_INFO("send con_handle 0x%x",con_handle); //index: 会把最后两个字节结束符0D 0A发送给从站 //index-2: 从站可以接收完整数据,但是解析错误 //index-1: 把第一个结束符0D和数据一起发送给从站,解析正确 ret_val = ble_nus_c_string_send(&m_ble_nus_c[con_handle], data_array, index-1); if ( (ret_val != NRF_ERROR_INVALID_STATE) && (ret_val != NRF_ERROR_RESOURCES) ) { APP_ERROR_CHECK(ret_val); } } while (ret_val == NRF_ERROR_RESOURCES); ret_val = bsp_indication_set(BSP_INDICATE_SENT_OK); APP_ERROR_CHECK(ret_val); } index = 0; } break; /**@snippet [Handling data from UART] */ case APP_UART_COMMUNICATION_ERROR://通讯错误事件,进入错误处理 NRF_LOG_ERROR("Communication error occurred while handling UART."); APP_ERROR_HANDLER(p_event->data.error_communication); break; case APP_UART_FIFO_ERROR://FIFO错误事件,进入错误处理 NRF_LOG_ERROR("Error occurred in FIFO module used by UART."); APP_ERROR_HANDLER(p_event->data.error_code); break; default: break; } }
Why appear APP_UART_COMMUNICATION_ERROR, Is it that the host(STM32MCU) sends the commands too fast? Line 771 of code, the error code "NRF_ERROR_NO_MEM" appears before
When disconnect, some ble_peripheral is error "Unknown error code", source code as below.
uint8_t ble_send(uint8_t * str, uint16_t length) { uint32_t err_code; if (m_conn_handle == BLE_CONN_HANDLE_INVALID) return 0; err_code = ble_nus_data_send(&m_nus, str, &length, m_conn_handle); if (err_code != NRF_ERROR_INVALID_STATE) { APP_ERROR_CHECK(err_code); } // for (uint32_t i = 0; i < length; i++) // { // NRF_LOG_INFO("%02x", str[i]); // } err_code = bsp_indication_set(BSP_INDICATE_SENT_OK); APP_ERROR_CHECK(err_code); return 1; }
I wonder if the release program needs to block error code detection?
if (p_event->data.error_communication == NRF_ERROR_SVC_HANDLER_MISSING) { NVIC_SystemReset(); } else APP_ERROR_HANDLER(p_event->data.error_communication);
Many thanks and best regards!
John