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

NRF_ERROR_SVC_HANDLER_MISSING whith uart

When I use the uart to transparently transmit, there is no problem at around 4k/s. When I increase the transparent transmission rate, there will be NRF_ERROR_SVC_HANDLER_MISSING this error in the APP_UART_COMMUNICATION_ERROR event. 

What is the reason, I have been unable to find the reason, if you want a higher transmission rate, what should I do, I do not want to use flow control, dma is not a better choice?

Parents
  • Hi,

    I believe that the error is really NRF_UARTE_ERROR_OVERRUN_MASK. Please check this by taking a look at the value of app_uart_evt_t::error_communication when the error occurs. As indicated here, the value is 1 when the UART is overrun.

    Please enable the EasyDMA if you have not already done that, and see if it improves the situation.

  • but i find this error only 1kb/s  this sometimes , which is strange,  what happen , is this  error code of myself?

  • My original code is on NRF52810. This problem does not occur, but I have this problem when I ported to 52832.

    How does your makefile look like ?

    Did you remove DNRF52810_XXAA, and added DNRF52832_XXAA ? 

    Did you remove DDEVELOP_IN_NRF52832?

    Was the nRF52810 a QFN48, QFN32 or WLCSP varaint? The pin assignments might be different here compared to a nRF52832 QFN48.

    Have you checked that TX and RX are connected to the correct pins? 

  • PROJECT_NAME     := ble_app_uart_pca10040_s132
    TARGETS          := BLE_UART_NRF52832_xxaa
    OUTPUT_DIRECTORY := _build
    
    SDK_ROOT := ../../../../../..
    PROJ_DIR := ../../..
    
    $(OUTPUT_DIRECTORY)/BLE_UART_NRF52832_xxaa.out: \
      LINKER_SCRIPT  := ble_app_uart_gcc_nrf52.ld
    
    # Source files common to all targets
    SRC_FILES += \
      $(SDK_ROOT)/components/libraries/experimental_log/src/nrf_log_backend_rtt.c \
      $(SDK_ROOT)/components/libraries/experimental_log/src/nrf_log_backend_serial.c \
      $(SDK_ROOT)/components/libraries/experimental_log/src/nrf_log_default_backends.c \
      $(SDK_ROOT)/components/libraries/experimental_log/src/nrf_log_frontend.c \
      $(SDK_ROOT)/components/libraries/experimental_log/src/nrf_log_str_formatter.c \
      $(SDK_ROOT)/components/libraries/button/app_button.c \
      $(SDK_ROOT)/components/libraries/util/app_error.c \
      $(SDK_ROOT)/components/libraries/util/app_error_weak.c \
      $(SDK_ROOT)/components/libraries/fifo/app_fifo.c \
      $(SDK_ROOT)/components/libraries/scheduler/app_scheduler.c \
      $(SDK_ROOT)/components/libraries/timer/app_timer.c \
      $(SDK_ROOT)/components/libraries/uart/app_uart_fifo.c \
      $(SDK_ROOT)/components/libraries/util/app_util_platform.c \
      $(SDK_ROOT)/components/libraries/hardfault/hardfault_implementation.c \
      $(SDK_ROOT)/components/libraries/util/nrf_assert.c \
      $(SDK_ROOT)/components/libraries/atomic_fifo/nrf_atfifo.c \
      $(SDK_ROOT)/components/libraries/balloc/nrf_balloc.c \
      $(SDK_ROOT)/external/fprintf/nrf_fprintf.c \
      $(SDK_ROOT)/external/fprintf/nrf_fprintf_format.c \
      $(SDK_ROOT)/components/libraries/fstorage/nrf_fstorage.c \
      $(SDK_ROOT)/components/libraries/fstorage/nrf_fstorage_sd.c \
      $(SDK_ROOT)/components/libraries/experimental_memobj/nrf_memobj.c \
      $(SDK_ROOT)/components/libraries/pwr_mgmt/nrf_pwr_mgmt.c \
      $(SDK_ROOT)/components/libraries/experimental_section_vars/nrf_section_iter.c \
      $(SDK_ROOT)/components/libraries/strerror/nrf_strerror.c \
      $(SDK_ROOT)/components/libraries/uart/retarget.c \
      $(SDK_ROOT)/components/libraries/util/sdk_mapped_flags.c \
      $(SDK_ROOT)/components/drivers_nrf/clock/nrf_drv_clock.c \
      $(SDK_ROOT)/components/drivers_nrf/common/nrf_drv_common.c \
      $(SDK_ROOT)/components/drivers_nrf/gpiote/nrf_drv_gpiote.c \
      $(SDK_ROOT)/components/drivers_nrf/uart/nrf_drv_uart.c \
      $(PROJ_DIR)/main.c \
      $(SDK_ROOT)/external/segger_rtt/SEGGER_RTT.c \
      $(SDK_ROOT)/external/segger_rtt/SEGGER_RTT_Syscalls_GCC.c \
      $(SDK_ROOT)/external/segger_rtt/SEGGER_RTT_printf.c \
      $(SDK_ROOT)/components/ble/common/ble_advdata.c \
      $(SDK_ROOT)/components/ble/ble_advertising/ble_advertising.c \
      $(SDK_ROOT)/components/ble/common/ble_conn_params.c \
      $(SDK_ROOT)/components/ble/common/ble_conn_state.c \
      $(SDK_ROOT)/components/ble/common/ble_srv_common.c \
      $(SDK_ROOT)/components/ble/nrf_ble_gatt/nrf_ble_gatt.c \
      $(SDK_ROOT)/components/toolchain/gcc/gcc_startup_nrf52.S \
      $(SDK_ROOT)/components/toolchain/system_nrf52.c \
      $(SDK_ROOT)/components/ble/ble_services/ble_nus/ble_nus.c \
      $(SDK_ROOT)/components/softdevice/common/nrf_sdh.c \
      $(SDK_ROOT)/components/softdevice/common/nrf_sdh_ble.c \
      $(SDK_ROOT)/components/softdevice/common/nrf_sdh_soc.c \
      $(SDK_ROOT)/components/libraries/simple_timer/app_simple_timer.c\
      $(SDK_ROOT)/components/libraries/fds/fds.c \
      $(SDK_ROOT)/components/libraries/gpiote/app_gpiote.c \
      $(SDK_ROOT)/components/drivers_nrf/wdt/nrf_drv_wdt.c \
      $(SDK_ROOT)/components/drivers_nrf/timer/nrf_drv_timer.c \
      $(SDK_ROOT)/components/drivers_nrf/power/nrf_drv_power.c\
    
    
    
    # Include folders common to all targets
    INC_FOLDERS += \
      $(SDK_ROOT)/components/libraries/gpiote\
      $(SDK_ROOT)/components/drivers_nrf/comp \
      $(SDK_ROOT)/components/drivers_nrf/twi_master \
      $(SDK_ROOT)/components/ble/ble_services/ble_ancs_c \
      $(SDK_ROOT)/components/ble/ble_services/ble_ias_c \
      $(SDK_ROOT)/components/libraries/pwm \
      $(SDK_ROOT)/components/softdevice/s132/headers/nrf52 \
      $(SDK_ROOT)/components/libraries/usbd/class/cdc/acm \
      $(SDK_ROOT)/components/libraries/usbd/class/hid/generic \
      $(SDK_ROOT)/components/libraries/usbd/class/msc \
      $(SDK_ROOT)/components/libraries/usbd/class/hid \
      $(SDK_ROOT)/components/libraries/experimental_log \
      $(SDK_ROOT)/components/ble/ble_services/ble_gls \
      $(SDK_ROOT)/components/libraries/fstorage \
      $(SDK_ROOT)/components/drivers_nrf/i2s \
      $(SDK_ROOT)/components/libraries/mutex \
      $(SDK_ROOT)/components/libraries/experimental_log/src \
      $(SDK_ROOT)/components/drivers_nrf/gpiote \
      $(SDK_ROOT)/components/libraries/fifo \
      $(SDK_ROOT)/components/libraries/experimental_memobj \
      $(SDK_ROOT)/components/drivers_nrf/common \
      $(SDK_ROOT)/components/libraries/fds \
      $(SDK_ROOT)/components/ble/ble_advertising \
      $(SDK_ROOT)/components/ble/ble_services/ble_bas_c \
      $(SDK_ROOT)/components/ble/ble_services/ble_hrs_c \
      $(SDK_ROOT)/components/libraries/queue \
      $(SDK_ROOT)/components/libraries/pwr_mgmt \
      $(SDK_ROOT)/components/ble/ble_dtm \
      $(SDK_ROOT)/components/toolchain/cmsis/include \
      $(SDK_ROOT)/components/ble/ble_services/ble_rscs_c \
      $(SDK_ROOT)/components/drivers_nrf/uart \
      $(SDK_ROOT)/components/ble/common \
      $(SDK_ROOT)/components/ble/ble_services/ble_lls \
      $(SDK_ROOT)/components/drivers_nrf/wdt \
      $(SDK_ROOT)/components/ble/ble_services/ble_bas \
      $(SDK_ROOT)/components/libraries/experimental_section_vars \
      $(SDK_ROOT)/components/softdevice/s132/headers \
      $(SDK_ROOT)/components/ble/ble_services/ble_ans_c \
      $(SDK_ROOT)/components/libraries/slip \
      $(SDK_ROOT)/components/libraries/mem_manager \
      $(SDK_ROOT)/external/segger_rtt \
      $(SDK_ROOT)/components/libraries/usbd/class/cdc \
      $(SDK_ROOT)/components/drivers_nrf/hal \
      $(SDK_ROOT)/components/ble/ble_services/ble_nus_c \
      $(SDK_ROOT)/components/drivers_nrf/rtc \
      $(SDK_ROOT)/components/softdevice/common \
      $(SDK_ROOT)/components/ble/ble_services/ble_ias \
      $(SDK_ROOT)/components/libraries/usbd/class/hid/mouse \
      $(SDK_ROOT)/components/libraries/ecc \
      $(SDK_ROOT)/components/drivers_nrf/ppi \
      $(SDK_ROOT)/components/ble/ble_services/ble_dfu \
      $(SDK_ROOT)/external/fprintf \
      $(SDK_ROOT)/components/drivers_nrf/twis_slave \
      $(SDK_ROOT)/components/libraries/atomic \
      $(SDK_ROOT)/components \
      $(SDK_ROOT)/components/libraries/scheduler \
      $(SDK_ROOT)/components/libraries/cli \
      $(SDK_ROOT)/components/ble/ble_services/ble_lbs \
      $(SDK_ROOT)/components/ble/ble_services/ble_hts \
      $(SDK_ROOT)/components/drivers_nrf/delay \
      $(SDK_ROOT)/components/libraries/crc16 \
      $(SDK_ROOT)/components/drivers_nrf/timer \
      $(SDK_ROOT)/components/libraries/util \
      $(SDK_ROOT)/components/drivers_nrf/pwm \
      ../config \
      $(SDK_ROOT)/components/libraries/csense_drv \
      $(SDK_ROOT)/components/libraries/csense \
      $(SDK_ROOT)/components/libraries/balloc \
      $(SDK_ROOT)/components/libraries/low_power_pwm \
      $(SDK_ROOT)/components/libraries/hardfault \
      $(SDK_ROOT)/components/ble/ble_services/ble_cscs \
      $(SDK_ROOT)/components/libraries/uart \
      $(SDK_ROOT)/components/libraries/hci \
      $(SDK_ROOT)/components/libraries/usbd/class/hid/kbd \
      $(SDK_ROOT)/components/drivers_nrf/spi_slave \
      $(SDK_ROOT)/components/drivers_nrf/lpcomp \
      $(SDK_ROOT)/components/libraries/timer \
      $(SDK_ROOT)/components/drivers_nrf/rng \
      $(SDK_ROOT)/components/drivers_nrf/power \
      $(SDK_ROOT)/components/libraries/usbd/config \
      $(SDK_ROOT)/components/toolchain \
      $(SDK_ROOT)/components/libraries/led_softblink \
      $(SDK_ROOT)/components/drivers_nrf/qdec \
      $(SDK_ROOT)/components/ble/ble_services/ble_cts_c \
      $(SDK_ROOT)/components/drivers_nrf/spi_master \
      $(SDK_ROOT)/components/ble/ble_services/ble_nus \
      $(SDK_ROOT)/components/libraries/twi_mngr \
      $(SDK_ROOT)/components/ble/ble_services/ble_hids \
      $(SDK_ROOT)/components/libraries/strerror \
      $(SDK_ROOT)/components/drivers_nrf/pdm \
      $(SDK_ROOT)/components/libraries/crc32 \
      $(SDK_ROOT)/components/libraries/usbd/class/audio \
      $(SDK_ROOT)/components/ble/peer_manager \
      $(SDK_ROOT)/components/drivers_nrf/swi \
      $(SDK_ROOT)/components/ble/ble_services/ble_tps \
      $(SDK_ROOT)/components/ble/ble_services/ble_dis \
      $(SDK_ROOT)/components/device \
      $(SDK_ROOT)/components/ble/nrf_ble_gatt \
      $(SDK_ROOT)/components/ble/nrf_ble_qwr \
      $(SDK_ROOT)/components/libraries/button \
      $(SDK_ROOT)/components/libraries/usbd \
      $(SDK_ROOT)/components/drivers_nrf/saadc \
      $(SDK_ROOT)/components/libraries/atomic_fifo \
      $(SDK_ROOT)/components/ble/ble_services/ble_lbs_c \
      $(SDK_ROOT)/components/ble/ble_racp \
      $(SDK_ROOT)/components/toolchain/gcc \
      $(SDK_ROOT)/components/libraries/fds \
      $(SDK_ROOT)/components/libraries/twi \
      $(SDK_ROOT)/components/drivers_nrf/clock \
      $(SDK_ROOT)/components/ble/ble_services/ble_rscs \
      $(SDK_ROOT)/components/drivers_nrf/usbd \
      $(SDK_ROOT)/components/ble/ble_services/ble_hrs \
      $(SDK_ROOT)/examples/ble_peripheral/ble_app_uart\
      $(SDK_ROOT)/examples/ble_peripheral/ble_app_uart/board\
      $(SDK_ROOT)/components/libraries/simple_timer\
      $(SDK_ROOT)/components/drivers_nrf/power\
    
    # Libraries common to all targets
    LIB_FILES += \
    
    # Optimization flags
    OPT = -O1 -g3
    # Uncomment the line below to enable link time optimization
    #OPT += -flto
    
    # C flags common to all targets
    CFLAGS += $(OPT)
    CFLAGS += -DBOARD_MS50SF1AC
    CFLAGS += -DCONFIG_NFCT_PINS_AS_GPIOS
    CFLAGS += -DBLE_STACK_SUPPORT_REQD
    CFLAGS += -DCONFIG_GPIO_AS_PINRESET
    CFLAGS += -DFLOAT_ABI_HARD
    CFLAGS += -DNRF52
    CFLAGS += -DDEBUG
    CFLAGS += -DBLE_UART_NRF52832_XXAA
    CFLAGS += -DNRF52_PAN_74
    CFLAGS += -DNRF_SD_BLE_API_VERSION=5
    CFLAGS += -DS132
    CFLAGS += -DSOFTDEVICE_PRESENT
    CFLAGS += -DSWI_DISABLE0
    CFLAGS += -mcpu=cortex-m4
    CFLAGS += -mthumb -mabi=aapcs
    CFLAGS += -Wall -w -O2 -g3
    CFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
    # keep every function in a separate section, this allows linker to discard unused ones
    CFLAGS += -ffunction-sections -fdata-sections -fno-strict-aliasing
    CFLAGS += -fno-builtin -fshort-enums 
    
    # C++ flags common to all targets
    CXXFLAGS += $(OPT)
    
    # Assembler flags common to all targets
    ASMFLAGS += -g3
    ASMFLAGS += -mcpu=cortex-m4
    ASMFLAGS += -mthumb -mabi=aapcs
    ASMFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
    ASMFLAGS += -DBOARD_MS50SF1AC
    ASMFLAGS += -DCONFIG_GPIO_AS_PINRESET
    ASMFLAGS += -DCONFIG_NFCT_PINS_AS_GPIOS
    ASMFLAGS += -DFLOAT_ABI_HARD
    ASMFLAGS += -DNRF52
    ASMFLAGS += -DBLE_UART_NRF52832_XXAA
    ASMFLAGS += -DNRF52_PAN_74
    ASMFLAGS += -DNRF_SD_BLE_API_VERSION=5
    ASMFLAGS += -DS132
    ASMFLAGS += -DSOFTDEVICE_PRESENT
    ASMFLAGS += -DSWI_DISABLE0
    
    # Linker flags
    LDFLAGS += $(OPT)
    LDFLAGS += -mthumb -mabi=aapcs -L $(TEMPLATE_PATH) -T$(LINKER_SCRIPT)
    LDFLAGS += -mcpu=cortex-m4
    LDFLAGS += -mfloat-abi=hard -mfpu=fpv4-sp-d16
    # let linker dump unused sections
    LDFLAGS += -Wl,--gc-sections
    # use newlib in nano version
    LDFLAGS += --specs=nano.specs
    
    
    # Add standard libraries at the very end of the linker input, after all objects
    # that may need symbols provided by these libraries.
    LIB_FILES += -lc -lnosys -lm
    
    
    .PHONY: default help
    
    # Default target - first one defined
    default: BLE_UART_NRF52832_xxaa
    
    # Print all targets that can be built
    help:
    	@echo following targets are available:
    	@echo		BLE_UART_NRF52832_xxaa
    	@echo		flash_softdevice
    	@echo		sdk_config - starting external tool for editing sdk_config.h
    	@echo		flash      - flashing binary
    
    TEMPLATE_PATH := $(SDK_ROOT)/components/toolchain/gcc
    
    
    include $(TEMPLATE_PATH)/Makefile.common
    
    $(foreach target, $(TARGETS), $(call define_target, $(target)))
    
    .PHONY: flash flash_softdevice erase
    
    # Flash the program
    flash: $(OUTPUT_DIRECTORY)/BLE_UART_NRF52832_xxaa.hex
    	@echo Flashing: $<
    	nrfjprog -f nrf52 --program $< --sectorerase
    	nrfjprog -f nrf52 --reset
    
    # Flash softdevice
    flash_softdevice:
    	@echo Flashing: s132_nrf52_5.0.0_softdevice.hex
    	nrfjprog -f nrf52 --program $(SDK_ROOT)/components/softdevice/s132/hex/s132_nrf52_5.0.0_softdevice.hex --sectorerase
    	nrfjprog -f nrf52 --reset
    
    erase:
    	nrfjprog -f nrf52 --eraseall
    
    SDK_CONFIG_FILE := ../config/sdk_config.h
    CMSIS_CONFIG_TOOL := $(SDK_ROOT)/external_tools/cmsisconfig/CMSIS_Configuration_Wizard.jar
    sdk_config:
    	java -jar $(CMSIS_CONFIG_TOOL) $(SDK_CONFIG_FILE)
    

    I used the logic code of sdk13 52810, then modified the logic code on the ble_uart_peripheral routine of sdk14.2, and then I encountered this problem. I don't think this has anything to do with the makefile.

  • My original code is on NRF52810. This problem does not occur, but I have this problem when I ported to 52832. I try I don't change the routine ble_app_uart, just change the logic part, but this problem still occurs.

    When you ported from nRF52810 to nRF52832, did you turn off EasyDMA ?

    How much time are you spending in the uart_event_handle() ?

    I see that you have a function uart_rec_process(), what are you doing here?

    I also see that you are using the FIFO, maybe you could move the processing to main context ? Pop the FIFO in main with app_fifo_get(), and do the proccesing there?

  • /**
     * #brief Ble notify data function.
     * 
     * #called by  ref@uart_rec_process() - #Condition Complete Packet;
     *             ref@uart_rec_process() - #Condition Incomplete Packet;
     *             ref@on_ble_evt()       - #Case      BLE_EVT_TX_COMPLETE.
     */
    static void ble_data_notify_handler(void * p_context)
    {   
        if (is_device_connect() == false) {
            return;
        }
        uint32_t  err_code = ble_nus_string_send(&m_nus, m_temp_array.data, (uint16_t *)&m_temp_array.size);
        if (err_code == NRF_SUCCESS) {
            //! �ɹ�֪ͨһ�����ݣ�����һ�α�ʾ�Է��ɷ���
            nrf_gpio_pin_clear(FIFO_FULL_PIN);
            NRF_LOG_WARNING("noty ok [%d]###\r\n", m_temp_array.size);
    
            //! ��������Э��ջbuffer�ɹ�, �����̬��������.
            memset(&m_temp_array, 0, sizeof(m_temp_array));
            
            //! �ϴ���������Э��ջbufferʧ��, ���γɹ������ٴμ���uart fifo, �鿴ʱ���ж�������.
            if (m_uart_rec_states == UART_REC_DATA_PASS_WAIT /**#Condition.*/) {
                m_uart_rec_states /**#StatesChange.*/ = UART_REC_DATA_PASS;
                APP_ERROR_CHECK(app_sched_event_put((void *)0, 0, uart_rec_process));
            }
        }
    
        else 
        if (err_code == NRF_ERROR_RESOURCES) {
            NRF_LOG_WARNING("buf exce\r\n");
            m_uart_rec_states /**#StatesChange.*/ = UART_REC_DATA_PASS_WAIT;
            return;
        }
    
        else 
        if (err_code == BLE_ERROR_GATTS_SYS_ATTR_MISSING || 
                err_code == NRF_ERROR_INVALID_STATE) {
                NRF_LOG_WARNING("ignor error\r\n");
            //! ������Щ���������Ӵ����Ĵ���.
        } 
        
        else {
            NRF_LOG_WARNING("error check\r\n");
            APP_ERROR_CHECK(err_code);
        }
    }
    
    
    /**
     * #brief UART rec process function.
     *
     * #called by ref@uart_event_handle()       - #Case      - APP_UART_DATA_READY;
     * #called by ref@ble_data_notify_handler() - #Condition - NRF_SUCCESS, #Scheduled.
     */
    static void  uart_rec_process(void * p_context, uint16_t data_length) 
    {
        static uint8_t fifo_buffer[32];
        if (is_device_connect() == true /**< ������״̬�£��������ݶ�������Ϊ͸������ */) {
        // if ( 1 ) {
            m_uart_rec_states = (m_uart_rec_states == UART_REC_IDLE)? UART_REC_DATA_PASS : m_uart_rec_states;
    
            APP_ERROR_CHECK(app_simple_timer_stop());
            uint8_t tmp_mid_data = 0;
    
            while (app_fifo_get(&m_uart_rec_fifo, &tmp_mid_data) == NRF_SUCCESS) {
                m_temp_array.data[m_temp_array.size++] = tmp_mid_data;
    
                //! �����ݴﵽ��󳤶ȼ����Խ���������ȫ�����ͳ�ȥ.
                if (m_temp_array.size >= m_ble_nus_max_data_len) {
                    // NRF_LOG_WARNING("size : %d \r\n",m_temp_array.size);
                    ble_data_notify_handler(NULL);
                    if (m_uart_rec_states == UART_REC_DATA_PASS_WAIT /**#Condition.*/) {
                        NRF_LOG_WARNING("uart wait\r\n");
                        //! DPASS WAIT 0
                        return;
                    }
                }
            }
    
    
            if (m_temp_array.size > 0 && /**< ���ݴղ���һ�����ֽڵ����, ��ʱ�жϺ���. */
                m_temp_array.size < m_ble_nus_max_data_len) {
                APP_ERROR_CHECK(app_simple_timer_start(APP_SIMPLE_TIMER_MODE_SINGLE_SHOT, 
                                                       ble_data_notify_handler,
                                                       APP_TIMER_TICKS(600), 
                                                       NULL));
            }
        } else { /**< �ڷ�����״̬�£��������ݶ�������Ϊ��������. */
                
            while (app_fifo_get(&m_uart_rec_fifo, fifo_buffer + m_temp_array.size) == NRF_SUCCESS) {
                APP_ERROR_CHECK(app_timer_stop(uart_clear_id));
                APP_ERROR_CHECK(app_timer_start(uart_clear_id, APP_TIMER_TICKS(200), NULL));
                if (m_temp_array.size >= 9 && m_temp_array.size <= (COMMAND_MAX_LEN-1)) {
                    if (memcmp(fifo_buffer + (m_temp_array.size -1), (uint8_t *)COMMAND_END_STR, 2) == 0) {
                        APP_ERROR_CHECK(app_timer_stop(uart_clear_id));
                        APP_ERROR_CHECK(app_simple_timer_stop());
                        memcpy(m_temp_array.data, fifo_buffer, m_temp_array.size + 1);
                        APP_ERROR_CHECK(app_simple_timer_start(APP_SIMPLE_TIMER_MODE_SINGLE_SHOT, 
                                                   uart_cmd_process_handler,
                                                   APP_TIMER_TICKS(UART_REC_WAIT_INTERVAL), 
                                                   NULL));
                    } 
                } 
    
                m_temp_array.size ++;
            }
    
            /* ���ڷ��͵������������ָ������*/
            if (m_temp_array.size > COMMAND_MAX_LEN) {
                NRF_LOG_RAW_INFO(">COMMAND_MAX_LEN stop timer\r\n");
                APP_ERROR_CHECK(app_simple_timer_stop());
                m_temp_array.size = 0;
                uart_rec_process_clr();
            }
    
            /* ������Ͳ��������.*/
            APP_ERROR_CHECK(app_timer_stop(uart_clear_id));
            APP_ERROR_CHECK(app_timer_start(uart_clear_id, APP_TIMER_TICKS(200), NULL));
    
    
        }
    
        m_uart_rec_states /**#StatesChange.*/ = UART_REC_IDLE;
    }
    
    
    /**
     * #��� ��ѯ���ڽ��մ���ģ�鵱ǰ�Ƿ�æ.
     *
     * #���� true   ���ڽ��մ���ģ�鵱ǰ��æ.
     * #���� false  ���ڽ��մ���ģ�鵱ǰ����.
     */
    static inline bool is_uart_rec_in_process(void) {
        return (m_uart_rec_states == UART_REC_IDLE)? false : true;
    }
    
    
    /**
     * #brief  Function for handling app_uart events.
     */
    void uart_event_handle(app_uart_evt_t * p_event)
    {
        switch (p_event->evt_type)
        {
            /**< An event indicating that UART data has been received. 
                 The data is available in the FIFO and can be fetched using @ref app_uart_get. */
            case APP_UART_DATA_READY:
            {
                uint8_t tmp_rec_data = 0;
    
                UNUSED_VARIABLE(app_uart_get(&tmp_rec_data));
    
                if (app_fifo_put(&m_uart_rec_fifo, tmp_rec_data) == NRF_SUCCESS) {
                    if (is_uart_rec_in_process() == false) {
                        uart_rec_process((void *)0, 0);
                    } else {
                        NRF_LOG_WARNING("uart buzy\r\n");
                        m_uart_rec_states == UART_REC_IDLE;
                        //! Busy
                        return;
                    }
                } else {
                    //! Rec fifo is full
                    NRF_LOG_WARNING("@#$@##@%$#@^@#$%#@$%@#$%fifo full@#!$!#$@!#%#$@%@$##$@%#@$^%$#&@$#%#$%@\r\n");
                    nrf_gpio_pin_set(FIFO_FULL_PIN);
                    return;
                }
                break;
            }
    
            /**< An communication error has occured during reception. */
            case APP_UART_COMMUNICATION_ERROR:
                APP_ERROR_HANDLER(p_event->data.error_communication);
                break;
            
            /**< An error in the FIFO module used by the app_uart module has occured. */
            case APP_UART_FIFO_ERROR:
                APP_ERROR_HANDLER(p_event->data.error_code);
                break;
            case APP_UART_TX_EMPTY:
                NRF_LOG_INFO("UART SEND COMPELETE\r\n");
                // APP_ERROR_CHECK(app_uart_flush());
                uart_rec_process_clr();
                break;
    
            /**< An event indicating that UART has completed transmission of all available data in the TX FIFO. */
            // case APP_UART_TX_EMPTY:
            //     //! TX_EMPTY
            //     break;
    
            default:
                break;
        }
    }
    
    
    /**
     * #brief  Function for initializing the UART module.
     */
    static void uart_init(void)
    {
        uint32_t err_code;
        uint32_t tmp_uart_baud_list[] = UART_BAUDRATE_LIST;
    
        const app_uart_comm_params_t comm_params =
        {
            .rx_pin_no    = RX_PIN_NUMBER,
            .tx_pin_no    = TX_PIN_NUMBER,
            .rts_pin_no   = RTS_PIN_NUMBER,
            .cts_pin_no   = CTS_PIN_NUMBER,
            .flow_control = APP_UART_FLOW_CONTROL_DISABLED,
            .use_parity   = false,
            .baud_rate    = tmp_uart_baud_list[m_cmd_collection.uart_baudrate]
        };
    
        APP_UART_FIFO_INIT(&comm_params,
                           UART_RX_BUF_SIZE,
                           UART_TX_BUF_SIZE,
                           uart_event_handle,
                           APP_IRQ_PRIORITY_LOWEST,
                           err_code);
        APP_ERROR_CHECK(err_code);
    }
    
    
    /**
     * @brief Function for initializing the GATT library. 
     */
    void gatt_init(void)
    {
        APP_ERROR_CHECK(nrf_ble_gatt_init(&m_gatt, gatt_evt_handler));
        NRF_LOG_DEBUG("nrf_ble_gatt_init\r\n");
    
        APP_ERROR_CHECK(nrf_ble_gatt_att_mtu_periph_set(&m_gatt,43));
        NRF_LOG_DEBUG("nrf_ble_gatt_att_mtu_periph_set\r\n");
    }
    
    
    
    * #param[in] length   Length of the data.
     */
    static void nus_data_handler(ble_nus_evt_t * p_evt)
    {
        uint32_t err_code;
    
        switch (p_evt->type) {
            case BLE_NUS_EVT_RX_DATA:
    
                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);
                }
                break;
    
            case BLE_NUS_EVT_TX_RDY:
                if (m_uart_rec_states == UART_REC_DATA_PASS_WAIT) {
                    NRF_LOG_WARNING("uart reboot\r\n");
                    ble_data_notify_handler(NULL);
                }
                break;
            default :   
                break;
        }
    }
    

Reply Children
Related