Hi,
I'm using nRF52810 with SDK 17.02.
When I don't download bootloader my application worked normally. After I downloaded bootloader, there logging NRF_ERROR_SVC_HANDLER_MISSING.
Hi,
I'm using nRF52810 with SDK 17.02.
When I don't download bootloader my application worked normally. After I downloaded bootloader, there logging NRF_ERROR_SVC_HANDLER_MISSING.
And another thing, could you try to comment the APP_ERROR_HANDLER() call at line ~119 to ignore com. errors, then check then check if the event gets triggered multiple times or just once.
Strangely! Just when I send "MQTT_QMTOPEN", it will cause this error.
#include "usr_ec600cn.h" #include "app_timer.h" #include "nrf_log.h" #include <stdlib.h> #include <stdio.h> #include "nrf_log_ctrl.h" #include "usr_spi_lora.h" #include "sta_app.h" #include "usr_cJson.h" #define UART_TX_BUF_SIZE 256 /**< UART TX buffer size. */ #define UART_RX_BUF_SIZE 256 /**< UART RX buffer size. */ #define EC600_AT_INTERVAL APP_TIMER_TICKS(3000) /**< AT interval (ticks). **/ APP_TIMER_DEF(m_uwbat_timer_id); ATSTATUS m_ec600at = { 0, //reppeat times AT_ACK_NULL, //ACK_STATUS 0, //CHECK_STATUS {0}, //id {0}, //ICCID {0}, //sta data {0}, //tag data 0, //ָ���ʶ�� 0, //ָ��� 0, //���С�� 0, //��Ŵ�� }; #define EC_AT "AT\r\n" #define EC_CPIN "AT+CPIN?\r\n" #define EC_CSQ "AT+CSQ\r\n" //��ѯ�ź����� #define EC_SETCREG "AT+CREG=1\r\n" //���������ʽ #define EC_CREG "AT+CREG?\r\n" //��ѯ����ע�� #define EC_CGATT "AT+CGATT?\r\n" //��ѯ���總��״̬ #define EC_CEREG "AT+CEREG?\r\n" //��ѯ����״̬ #define EC_ERROR "AT+CMEE=1\r\n" //������� #define EC_ATI "ATI\r\n" //��ѯ�汾��Ϣ #define SIM_CHECK_ICCID "AT+QCCID=?\r\n" //SIM��ICCID #define SIM_READ_ICCID "AT+QCCID\r\n" //��ȡSIM��ICCID //���ĺ��� 1064899192823 #define EC_MESSAGE_CMGF "AT+CMGF=1\r\n" //�ı���ʽ #define EC_MESSAGE_CSCS "AT+CSCS=\"GSM\"\r\n" //GSM���� #define EC_MESSAGE_CMGS "AT+CMGS=\"1064899192823\"\r\n" //���պ��� #define EC_CHECK_NET "AT+QENG=\"servingcell\"\r\n" //��ѯGSM���� //#define EC_RI_QCFG "AT+QCFG=\"risignaltype\",\"physical\"\r\n" //����RING���� //#define EC_RING_QCG "AT+QCFG=\"risignaltype\"\r\n" //��ѯRING���� #define EC_URC_RING "AT+QCFG=\"urc/ri/ring\"\r\n" //#define EC_URC_OTHER "AT+QCFG=\"urc/ri/other\"\r\n" #define EC600N_SLEEP "AT+QSCLK=1\r\n" //�������� #define EC_URC_SET "AT+QURCCFG=\"urcport\",\"usbat\"\r\n" #define EC_URC_CHECK "AT+QURCCFG=\"urcport\"\r\n" //MQTT ��SSL #define MQTT_QMTCFG "AT+QMTCFG=\"recv/mode\",0,0,1\r\n" //MQTT���ݽ��մ��� #define MQTT_QMTOPEN "AT+QMTOPEN=0,\"120.76.159.132\",17883\r\n" #define MQTT_QMTOPEN_C "AT+QMTOPEN?\r\n" //#define MQTT_QMTCONN "AT+QMTCONN=0,\"aabbcc\",\"elec_tag:elec_tag\",\"elec_tag@2022#.\"\r\n" #define MQTT_QMTCONN_C "AT+QMTCONN?\r\n" //#define MQTT_QMTSUB "AT+QMTSUB=0,1,\"elec_tag.in/013489F1\",0\r\n" //�������� //#define MQTT_QMTPUBEX_STA "AT+QMTPUBEX=0,0,0,0,\"elec_tag.out/013489F1\",47\r\n" //������վ���� //#define MQTT_QMTPUBEX_TAG "AT+QMTPUBEX=0,0,0,0,\"elec_tag.out/013489F1\",39\r\n" //����·Ԫ���� char mqtt_qmtopen[37] = "AT+QMTOPEN=0,\"120.76.159.132\",17883\r\n"; char mqtt_qmtconn[80]={0}; char mqtt_qmtsub[80]={0}; char mqtt_qmtpubex_sta[80]={0}; char mqtt_qmtpubex_tag[80]={0}; uint8_t data_array[255]; uint8_t data_index = 0; //AT+CMGF=1 --OK //AT+CSCS="GSM" -- OK //AT+CMGS="13347203907" -- '<' -- xx xx xx xx+1A -- OK /**@brief Function for UWB AT command timeout * @details 3s */ static void m_modem_timeout_handler(void * p_context) { UNUSED_PARAMETER(p_context); m_ec600at.repeat++; NRF_LOG_INFO("TIME OUT %d",m_ec600at.repeat); NRF_LOG_FLUSH(); if(m_ec600at.ack != AT_ACK_SUCCESS) { if(m_ec600at.repeat>=AT_REPEAT_TIME) //30��ʱ { NRF_LOG_HEXDUMP_INFO(data_array,data_index); NRF_LOG_FLUSH(); memset(data_array, 0, sizeof data_array); data_index = 0; m_ec600at.repeat = 0; m_ec600at.ack = AT_ACK_ERROR; } else m_ec600at.ack = AT_ACK_TIMEOUT; }else m_ec600at.repeat = 0; } /**@brief Function for handling app_uart events. * * @details This function will receive a single character from the app_uart module and append it to * a string. The string will be be sent over BLE when the last character received was a * 'new line' '\n' (hex 0x0A) or if the string has reached the maximum data length. */ /**@snippet [Handling the data received over UART] */ void uart_event_handle(app_uart_evt_t * p_event) { uint32_t err_code; switch (p_event->evt_type) { case APP_UART_DATA_READY: UNUSED_VARIABLE(app_uart_get(&data_array[data_index])); data_index++; if(data_index>255)data_index=0; break; case APP_UART_COMMUNICATION_ERROR: // APP_ERROR_HANDLER(p_event->data.error_communication); NRF_LOG_INFO("UART ERROR"); break; case APP_UART_FIFO_ERROR: APP_ERROR_HANDLER(p_event->data.error_code); break; default: break; } } /**@snippet [Handling the data received over UART] */ /**@brief Function for initializing the UART module. */ /**@snippet [UART Initialization] */ void m_uart_init(void) { uint32_t err_code; app_uart_comm_params_t const comm_params = { .rx_pin_no = RX_PIN, .tx_pin_no = TX_PIN, .rts_pin_no = NULL, .cts_pin_no = NULL, .flow_control = APP_UART_FLOW_CONTROL_DISABLED, .use_parity = false, #if defined (UART_PRESENT) .baud_rate = NRF_UARTE_BAUDRATE_115200 #else .baud_rate = NRF_UARTE_BAUDRATE_115200 #endif }; 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); err_code = app_timer_create(&m_uwbat_timer_id, APP_TIMER_MODE_SINGLE_SHOT, m_modem_timeout_handler); APP_ERROR_CHECK(err_code); } /**@snippet [UART Initialization] */ /**@brief Function for close uart */ void m_uart_close(void) { uint32_t err_code; err_code = app_uart_close(); APP_ERROR_CHECK(err_code); } /**@brief Function for uart send */ void m_uart_send(uint8_t *data, uint8_t length) { uint32_t err_code; for(int i=0;i<length;i++) { err_code = app_uart_put(data[i]); APP_ERROR_CHECK(err_code); } } /**@brief Function for uwb config */ static void m_ec600_config(char *atcmd ,uint8_t length,AT_ACK uwbtype) { uint8_t log_buff[80]={0}; ret_code_t err_code; if(m_ec600at.ack!=AT_ACK_ERROR) //��ATָ����� { m_ec600at.ack = AT_ACK_WAIT; err_code = app_timer_start(m_uwbat_timer_id, EC600_AT_INTERVAL, NULL); APP_ERROR_CHECK(err_code); m_uart_send((uint8_t *)atcmd,length); while((m_ec600at.ack != AT_ACK_ERROR)&&(m_ec600at.ack != AT_ACK_SUCCESS)) { if(m_ec600at.ack == AT_ACK_TIMEOUT) { memset(data_array, 0, sizeof data_array); data_index = 0; m_ec600at.ack = AT_ACK_WAIT; m_uart_send((uint8_t *)atcmd,length); err_code = app_timer_start(m_uwbat_timer_id, EC600_AT_INTERVAL, NULL); APP_ERROR_CHECK(err_code); } switch(uwbtype) { case AT_OK: if(strstr((char *)data_array,"OK")) { m_ec600at.ack = AT_ACK_SUCCESS; }else if(strstr((char *)data_array,"ERROR")) { NRF_LOG_HEXDUMP_INFO(data_array,data_index); NRF_LOG_FLUSH(); memset(data_array, 0, sizeof data_array); data_index = 0; } break; case AT_OK_CHECK: if(strstr((char *)data_array,"OK")) { m_ec600at.ack = AT_ACK_SUCCESS; }else if(strstr((char *)data_array,"ERROR:")) { if((data_array[data_index-2] == '\r')&&(data_array[data_index-1] == '\n')) { NRF_LOG_HEXDUMP_INFO(data_array,data_index); NRF_LOG_FLUSH(); memset(data_array, 0, sizeof data_array); data_index = 0; } } break; case AT_OK_READ: if(strstr((char *)data_array,"OK")) { if(sscanf((char *)data_array, "%*[^:]: %[^\r\n]",(char *)m_ec600at.sim_iccid) == 1) { for(int i=0;i<20;i++) { m_eerom_write(AT24CXX_BYTE_ICCID,&m_ec600at.sim_iccid[i],1); } } else { for(int i=0;i<20;i++) { m_ec600at.sim_iccid[i] = 0; m_eerom_write(AT24CXX_BYTE_ICCID,&m_ec600at.sim_iccid[i],1); } } m_ec600at.ack = AT_ACK_SUCCESS; }else if(strstr((char *)data_array,"ERROR")) { NRF_LOG_HEXDUMP_INFO(data_array,data_index); NRF_LOG_FLUSH(); memset(data_array, 0, sizeof data_array); data_index = 0; } break; case AT_BLANK: if(strstr((char *)data_array,"\r\n")) { m_ec600at.ack = AT_ACK_SUCCESS; }else if(strstr((char *)data_array,"ERROR")) { NRF_LOG_HEXDUMP_INFO(data_array,data_index); NRF_LOG_FLUSH(); memset(data_array, 0, sizeof data_array); data_index = 0; } break; case AT_CPIN: if(strstr((char *)data_array,"READY\r\n\r\nOK")) { m_ec600at.ack = AT_ACK_SUCCESS; }else if(strstr((char *)data_array,"ERROR")) { NRF_LOG_HEXDUMP_INFO(data_array,data_index); NRF_LOG_FLUSH(); memset(data_array, 0, sizeof data_array); data_index = 0; } break; case AT_CSQ: if(strstr((char *)data_array,"\r\n\r\nOK")) { for(int i=0;i<data_index;i++) { if(data_array[i]==',') { if( ((data_array[i-2]=='1')&&(data_array[i-1]>'8'))||((data_array[i-2]=='2')||(data_array[i-2]=='3')) ) { m_ec600at.ack = AT_ACK_SUCCESS; }else { NRF_LOG_HEXDUMP_INFO(data_array,data_index); NRF_LOG_FLUSH(); memset(data_array, 0, sizeof data_array); data_index = 0; } } } }else if(strstr((char *)data_array,"ERROR")) { NRF_LOG_HEXDUMP_INFO(data_array,data_index); NRF_LOG_FLUSH(); memset(data_array, 0, sizeof data_array); data_index = 0; } break; case AT_SETCREG: if(strstr((char *)data_array,"\r\nOK")) { m_ec600at.ack = AT_ACK_SUCCESS; }else if(strstr((char *)data_array,"ERROR")) { NRF_LOG_HEXDUMP_INFO(data_array,data_index); NRF_LOG_FLUSH(); memset(data_array, 0, sizeof data_array); data_index = 0; } break; case AT_CREG: if(strstr((char *)data_array,"+CREG: 1,1\r\n\r\nOK")) { m_ec600at.ack = AT_ACK_SUCCESS; }else if(strstr((char *)data_array,"+CREG: 0,1\r\n\r\nOK")) { NRF_LOG_HEXDUMP_INFO(data_array,data_index); NRF_LOG_FLUSH(); memset(data_array, 0, sizeof data_array); data_index = 0; } break; case AT_CGATT: if(strstr((char *)data_array,"+CGATT: 1\r\n\r\nOK")) { m_ec600at.ack = AT_ACK_SUCCESS; }else if((strstr((char *)data_array,"+CGATT: 0\r\n\r\nOK"))||(strstr((char *)data_array,"ERROR"))) { NRF_LOG_HEXDUMP_INFO(data_array,data_index); NRF_LOG_FLUSH(); memset(data_array, 0, sizeof data_array); data_index = 0; } break; /************************************************HTTP************************************************/ /****************************************************************************************************/ case AT_CONNECT: if(strstr((char *)data_array,"CONNECT")) { m_ec600at.ack = AT_ACK_SUCCESS; }else if(strstr((char *)data_array,"ERROR")) { NRF_LOG_HEXDUMP_INFO(data_array,data_index); NRF_LOG_FLUSH(); memset(data_array, 0, sizeof data_array); data_index = 0; } break; case AT_DATA: if(strstr((char *)data_array,"+QHTTPPOST: 0,200")) { m_ec600at.ack = AT_ACK_SUCCESS; }else if(strstr((char *)data_array,"ERROR")) { NRF_LOG_HEXDUMP_INFO(data_array,data_index); NRF_LOG_FLUSH(); memset(data_array, 0, sizeof data_array); data_index = 0; } break; case AT_HTTPREAD: if((strstr((char *)data_array,"+QHTTPREAD: 0")) && (strstr((char *)data_array,"\"msg\":\"ok\""))) { m_ec600at.ack = AT_ACK_SUCCESS; }else if(strstr((char *)data_array,"ERROR")) { if(data_index/80==0) { NRF_LOG_HEXDUMP_INFO(data_array,data_index); NRF_LOG_FLUSH(); memset(data_array, 0, sizeof data_array); data_index = 0; }else if((data_index/80)==1) { NRF_LOG_HEXDUMP_INFO(data_array,80); NRF_LOG_FLUSH(); data_index = data_index%80; NRF_LOG_HEXDUMP_INFO(data_array,data_index); NRF_LOG_FLUSH(); } } break; /************************************************MQTT************************************************/ /****************************************************************************************************/ case AT_QMTOPEN: if(strstr((char *)data_array,"+QMTOPEN: 0,0")) { m_ec600at.ack = AT_ACK_SUCCESS; }else if(strstr((char *)data_array,"ERROR")) { NRF_LOG_HEXDUMP_INFO(data_array,data_index); NRF_LOG_FLUSH(); memset(data_array, 0, sizeof data_array); data_index = 0; } break; case AT_QMTCONN: if(strstr((char *)data_array,"+QMTCONN: 0,0,0")) { m_ec600at.ack = AT_ACK_SUCCESS; }else if(strstr((char *)data_array,"ERROR")) { NRF_LOG_HEXDUMP_INFO(data_array,data_index); NRF_LOG_FLUSH(); memset(data_array, 0, sizeof data_array); data_index = 0; } break; case AT_QMTCONN_C: if(strstr((char *)data_array,"+QMTCONN: 0,3") && strstr((char *)data_array,"OK")) { m_ec600at.ack = AT_ACK_SUCCESS; }else if(strstr((char *)data_array,"ERROR")) { NRF_LOG_HEXDUMP_INFO(data_array,data_index); NRF_LOG_FLUSH(); memset(data_array, 0, sizeof data_array); data_index = 0; } break; case AT_QMTSUB: if(strstr((char *)data_array,"+QMTSUB: 0,1,0,0")) { m_ec600at.ack = AT_ACK_SUCCESS; }else if(strstr((char *)data_array,"ERROR")) { NRF_LOG_HEXDUMP_INFO(data_array,data_index); NRF_LOG_FLUSH(); memset(data_array, 0, sizeof data_array); data_index = 0; } break; case AT_QMTPUBEX: if(strstr((char *)data_array,">")) { m_ec600at.ack = AT_ACK_SUCCESS; }else if(strstr((char *)data_array,"ERROR")) { NRF_LOG_HEXDUMP_INFO(data_array,data_index); NRF_LOG_FLUSH(); memset(data_array, 0, sizeof data_array); data_index = 0; } break; case AT_QMTPUBEXDATA: if(strstr((char *)data_array,"+QMTPUBEX: 0,0,0") && strstr((char *)data_array,"OK")) { m_ec600at.ack = AT_ACK_SUCCESS; }else if(strstr((char *)data_array,"ERROR")) { NRF_LOG_HEXDUMP_INFO(data_array,data_index); NRF_LOG_FLUSH(); memset(data_array, 0, sizeof data_array); data_index = 0; } break; default: break; } //******************************************************************************8 if(m_ec600at.ack == AT_ACK_SUCCESS) { err_code = app_timer_stop(m_uwbat_timer_id); APP_ERROR_CHECK(err_code); if((data_index>0)&&(data_index<=80)) { NRF_LOG_HEXDUMP_INFO(data_array,data_index); NRF_LOG_FLUSH(); }else if((data_index>80)&&(data_index<=160)) { NRF_LOG_HEXDUMP_INFO(data_array,80); NRF_LOG_FLUSH(); for(int i=0;i<80;i++)log_buff[i] = data_array[81+i]; NRF_LOG_HEXDUMP_INFO(log_buff,data_index-80); NRF_LOG_FLUSH(); } memset(data_array, 0, sizeof data_array); data_index = 0; m_ec600at.check_status++; m_ec600at.repeat = 0; //�ظ����� } } } } /**@brief Function for ec600 init */ void m_ec600n_init(void) { ret_code_t err_code; m_ec600n_open();//���� nrf_delay_ms(500); m_ec600_config(EC_AT,strlen(EC_AT),AT_OK); //AT check m_ec600_config(EC_ERROR,strlen(EC_ERROR),AT_OK); //AT EEROR m_ec600_config(EC_URC_SET,strlen(EC_URC_SET),AT_OK_CHECK); //SET URC PORT m_ec600_config(SIM_CHECK_ICCID,strlen(SIM_CHECK_ICCID),AT_OK); //SIM ICCID check m_ec600_config(SIM_READ_ICCID,strlen(SIM_READ_ICCID),AT_OK_READ);//SIM ICCID read m_eerom_read(AT24CXX_BYTE_WORKMODE, &m_tag_type.mode, 1); if(m_ec600at.check_status == 5) { if(m_tag_type.mode == TAG_FACTORY) { m_tag_type.check[TAG_EC600N] = TAG_CHECK_SUCCESS; NRF_LOG_INFO("EC600CN FACTORY INIT SUCCESS."); m_ec600n_close(); }else if(m_tag_type.mode == TAG_NORMAL) { m_ec600_config(EC_CPIN,strlen(EC_CPIN),AT_CPIN); //CPIN check m_ec600_config(EC_CSQ,strlen(EC_CSQ),AT_CSQ); //CSQ check m_ec600_config(EC_SETCREG,strlen(EC_SETCREG),AT_SETCREG); //SET CREG m_ec600_config(EC_CREG,strlen(EC_CREG),AT_CREG); //CREG check m_ec600_config(EC_CGATT,strlen(EC_CGATT),AT_CGATT); //CGATT check m_ec600_config(EC_CEREG,strlen(EC_CEREG),AT_OK); //CEREG check m_ec600_config(EC_CHECK_NET,strlen(EC_CHECK_NET),AT_OK); //NET CHECK //����MQTT���� m_mqtt_string_config(); m_ec600_config(MQTT_QMTCFG,strlen(MQTT_QMTCFG),AT_OK); //����MQTT�����շ�ģʽ m_ec600_config(mqtt_qmtopen,37,AT_QMTOPEN); //�ͻ��˴����� m_ec600_config(mqtt_qmtconn,strlen(mqtt_qmtconn),AT_QMTCONN); //�ͻ����������� m_ec600_config(MQTT_QMTOPEN_C,strlen(MQTT_QMTOPEN_C),AT_OK); //�ͻ��˲�ѯ����״̬ m_ec600_config(mqtt_qmtsub,strlen(mqtt_qmtsub),AT_QMTSUB); //����TOPIC m_ec600n_sleep(); //�������� if(m_ec600at.check_status == 18) { m_tag_type.check[TAG_EC600N] = TAG_CHECK_SUCCESS; NRF_LOG_INFO("EC600CN NORMAL INIT SUCCESS."); }else { m_tag_type.check[TAG_EC600N] = TAG_CHECK_ERROR; NRF_LOG_WARNING("EC600CN INIT SLEEP ERROR.[ERROR: %d]",m_ec600at.check_status); } } }else { m_tag_type.check[TAG_EC600N] = TAG_CHECK_ERROR; NRF_LOG_WARNING("EC600CN INIT ERROR.[ERROR: %d]",m_ec600at.check_status); } if(m_tag_type.check[TAG_EC600N] == TAG_CHECK_ERROR)//�ػ� { m_ec600n_close(); } memset(data_array, 0, sizeof data_array); data_index = 0; m_ec600at.ack = AT_ACK_WAIT; m_ec600at.check_status = 0; } /**@brief Function for update sta data */ void m_device_data_config(uint8_t device_type,uint8_t tag_number) { int32_t sta_temp; sd_temp_get(&sta_temp); sta_temp = sta_temp*0.24; if(device_type == DEVICE_TYPE_STA) { m_ec600at.device_sta_data[0] = '1'; //�豸���� m_ec600at.device_sta_data[1] = m_ascci_hex((m_ec600at.id_number[4]>>4)); //�豸ID1 m_ec600at.device_sta_data[2] = m_ascci_hex((m_ec600at.id_number[4] & 0x0F)); //�豸ID1 m_ec600at.device_sta_data[3] = m_ascci_hex((m_ec600at.id_number[5]>>4)); //�豸ID2 m_ec600at.device_sta_data[4] = m_ascci_hex((m_ec600at.id_number[5] & 0x0F)); //�豸ID2 m_ec600at.device_sta_data[5] = m_ascci_hex((m_ec600at.id_number[6]>>4)); //�豸ID3 m_ec600at.device_sta_data[6] = m_ascci_hex((m_ec600at.id_number[6] & 0x0F)); //�豸ID3 m_ec600at.device_sta_data[7] = m_ascci_hex((m_ec600at.id_number[7]>>4)); //�豸ID4 m_ec600at.device_sta_data[8] = m_ascci_hex((m_ec600at.id_number[7] & 0x0F)); //�豸ID5 if(tag_status_value[0][5] == 0x02)//��ײģʽ { tag_status_value[0][5] = 0x00; m_ec600at.device_sta_data[9] = m_ascci_hex(0x02); //��ײģʽ }else { m_ec600at.device_sta_data[9] = m_ascci_hex((m_tag_type.mode & 0x0F)); //����ģʽ } m_ec600at.device_sta_data[10] = m_ascci_hex((m_tag_type.battery>>12)); //��ص�ѹ m_ec600at.device_sta_data[11] = m_ascci_hex((m_tag_type.battery>>8) & 0x0F); //��ص�ѹ m_ec600at.device_sta_data[12] = m_ascci_hex((m_tag_type.battery>>4) & 0x0F); //��ص�ѹ m_ec600at.device_sta_data[13] = m_ascci_hex((m_tag_type.battery & 0x0F)); //��ص�ѹ m_ec600at.device_sta_data[14] = m_ascci_hex((sta_temp>>12)& 0x0F); //�¶� m_ec600at.device_sta_data[15] = m_ascci_hex((sta_temp>>8)& 0x0F); //�¶� m_ec600at.device_sta_data[16] = m_ascci_hex((sta_temp>>4)& 0x0F); //�¶� m_ec600at.device_sta_data[17] = m_ascci_hex(sta_temp& 0x0F); //�¶� m_ec600at.device_sta_data[18] = m_ascci_hex((m_tag_type.check[TAG_EEROM]) & 0x0F); //flash״̬ m_ec600at.device_sta_data[19] = m_ascci_hex((m_tag_type.check[TAG_GSENSOR]) & 0x0F); //gsensor״̬ m_ec600at.device_sta_data[20] = m_ascci_hex((m_tag_type.check[TAG_EC600N]) & 0x0F); //modem״̬ m_ec600at.device_sta_data[21] = m_ascci_hex((m_tag_type.check[TAG_LORA]) & 0x0F); //lora״̬ m_ec600at.device_sta_data[22] = m_ascci_hex(TAG_HW_VERSION>>4); //Ӳ���汾 m_ec600at.device_sta_data[23] = m_ascci_hex(TAG_HW_VERSION & 0x0F); //Ӳ���汾 m_ec600at.device_sta_data[24] = m_ascci_hex(TAG_FW_VERSION>>4); //����汾 m_ec600at.device_sta_data[25] = m_ascci_hex(TAG_FW_VERSION & 0x0F); //����汾 m_ec600at.device_sta_data[26] = m_ascci_hex(m_tag_type.tag_config[5] & 0x0F); //����ǿ�� for(int i=0;i<20;i++) m_ec600at.device_sta_data[27+i] = m_ec600at.sim_iccid[i]; //ICCID }else if(device_type == DEVICE_TYPE_TAG) { m_ec600at.device_tag_data[0] = '2'; //�豸���� m_ec600at.device_tag_data[1] = m_ascci_hex(tag_status_value[tag_number][1]>>4); //�豸ID1 m_ec600at.device_tag_data[2] = m_ascci_hex(tag_status_value[tag_number][1] & 0x0F); //�豸ID1 m_ec600at.device_tag_data[3] = m_ascci_hex(tag_status_value[tag_number][2]>>4); //�豸ID2 m_ec600at.device_tag_data[4] = m_ascci_hex(tag_status_value[tag_number][2] & 0x0F); //�豸ID2 m_ec600at.device_tag_data[5] = m_ascci_hex(tag_status_value[tag_number][3]>>4); //�豸ID3 m_ec600at.device_tag_data[6] = m_ascci_hex(tag_status_value[tag_number][3] & 0x0F); //�豸ID3 m_ec600at.device_tag_data[7] = m_ascci_hex(tag_status_value[tag_number][4]>>4); //�豸ID4 m_ec600at.device_tag_data[8] = m_ascci_hex(tag_status_value[tag_number][4] & 0x0F); //�豸ID4 m_ec600at.device_tag_data[9] = m_ascci_hex(tag_status_value[tag_number][5] & 0x0F); //����ģʽ m_ec600at.device_tag_data[10] = m_ascci_hex(tag_status_value[tag_number][6]>>4); //��ص�ѹ m_ec600at.device_tag_data[11] = m_ascci_hex(tag_status_value[tag_number][6]& 0x0F); //��ص�ѹ m_ec600at.device_tag_data[12] = m_ascci_hex(tag_status_value[tag_number][7]>>4); //��ص�ѹ m_ec600at.device_tag_data[13] = m_ascci_hex(tag_status_value[tag_number][7]& 0x0F); //��ص�ѹ m_ec600at.device_tag_data[14] = m_ascci_hex(tag_status_value[tag_number][8]>>4); //�¶� m_ec600at.device_tag_data[15] = m_ascci_hex(tag_status_value[tag_number][8]& 0x0F); //�¶� m_ec600at.device_tag_data[16] = m_ascci_hex(tag_status_value[tag_number][9]>>4); //�¶� m_ec600at.device_tag_data[17] = m_ascci_hex(tag_status_value[tag_number][9]& 0x0F); //�¶� m_ec600at.device_tag_data[18] = m_ascci_hex(tag_status_value[tag_number][10] & 0x0F); //flash״̬ m_ec600at.device_tag_data[19] = m_ascci_hex(tag_status_value[tag_number][11] & 0x0F); //gsensor״̬ m_ec600at.device_tag_data[20] = m_ascci_hex(tag_status_value[tag_number][12] & 0x0F); //modem״̬ m_ec600at.device_tag_data[21] = m_ascci_hex(tag_status_value[tag_number][13] & 0x0F); //lora״̬ m_ec600at.device_tag_data[22] = m_ascci_hex(tag_status_value[tag_number][21]>>4); //Ӳ���汾 m_ec600at.device_tag_data[23] = m_ascci_hex(tag_status_value[tag_number][21] & 0x0F); //Ӳ���汾 m_ec600at.device_tag_data[24] = m_ascci_hex(tag_status_value[tag_number][22]>>4); //����汾 m_ec600at.device_tag_data[25] = m_ascci_hex(tag_status_value[tag_number][22] & 0x0F); //����汾 m_ec600at.device_tag_data[26] = m_ascci_hex(tag_status_value[tag_number][23] & 0x0F); //����ǿ�� m_ec600at.device_tag_data[27] = m_ascci_hex(tag_status_value[tag_number][14]>>4); //�����豸ID1 m_ec600at.device_tag_data[28] = m_ascci_hex(tag_status_value[tag_number][14] & 0x0F); //�����豸ID1 m_ec600at.device_tag_data[29] = m_ascci_hex(tag_status_value[tag_number][15]>>4); //�����豸ID2 m_ec600at.device_tag_data[30] = m_ascci_hex(tag_status_value[tag_number][15] & 0x0F); //�����豸ID2 m_ec600at.device_tag_data[31] = m_ascci_hex(tag_status_value[tag_number][16]>>4); //�����豸ID3 m_ec600at.device_tag_data[32] = m_ascci_hex(tag_status_value[tag_number][16] & 0x0F); //�����豸ID3 m_ec600at.device_tag_data[33] = m_ascci_hex(tag_status_value[tag_number][17]>>4); //�����豸ID4 m_ec600at.device_tag_data[34] = m_ascci_hex(tag_status_value[tag_number][17] & 0x0F); //�����豸ID4 m_ec600at.device_tag_data[35] = m_ascci_hex(tag_status_value[tag_number][18]>>4); //������ m_ec600at.device_tag_data[36] = m_ascci_hex(tag_status_value[tag_number][18] & 0x0F); //������ m_ec600at.device_tag_data[37] = m_ascci_hex(tag_status_value[tag_number][19] & 0x0F); //������ m_ec600at.device_tag_data[38] = m_ascci_hex(tag_status_value[tag_number][20] & 0x0F); //����� } } /**@brief Function for ec600 MQTT PUBEX/SUB */ void m_ec600n_mqtt_pubex(uint8_t pubstatus) { uint8_t mqtt_number_count = 0; if(m_tag_type.check[TAG_EC600N] == TAG_CHECK_ERROR) { m_ec600n_open();//���� }else { m_ec600n_wake();//����ģ�� } m_ec600_config(EC_AT,strlen(EC_AT),AT_OK); //AT check m_ec600_config(EC_ATI,strlen(EC_ATI),AT_OK); //VERSION CHECK m_ec600_config(SIM_CHECK_ICCID,strlen(SIM_CHECK_ICCID),AT_OK); //SIM ICCID check m_ec600_config(SIM_READ_ICCID,strlen(SIM_READ_ICCID),AT_OK_READ); //SIM ICCID read m_ec600_config(EC_URC_SET,strlen(EC_URC_SET),AT_OK); //SET URC PORT m_ec600_config(EC_CPIN,strlen(EC_CPIN),AT_CPIN); //CPIN check m_ec600_config(EC_CSQ,strlen(EC_CSQ),AT_CSQ); //CSQ check m_ec600_config(EC_SETCREG,strlen(EC_SETCREG),AT_SETCREG); //SET CREG m_ec600_config(EC_CREG,strlen(EC_CREG),AT_CREG); //CREG check m_ec600_config(EC_CGATT,strlen(EC_CGATT),AT_CGATT); //CGATT check m_ec600_config(EC_CEREG,strlen(EC_CEREG),AT_OK); //CEREG check m_mqtt_string_config(); //����MQTT�ַ���ָ�� if(m_ec600n_mqtt_check()==0) { //MQTT CONFIG m_ec600_config(MQTT_QMTCFG,strlen(MQTT_QMTCFG),AT_OK); //MQTT���ݸ�ʽ m_ec600_config(MQTT_QMTOPEN,strlen(MQTT_QMTOPEN),AT_QMTOPEN); //MQTT������ m_ec600_config(mqtt_qmtconn,strlen(mqtt_qmtconn),AT_QMTCONN); //MQTT�������� m_ec600_config(MQTT_QMTOPEN_C,strlen(MQTT_QMTOPEN_C),AT_OK); //MQTT�鿴������ m_ec600_config(MQTT_QMTCONN_C,strlen(MQTT_QMTCONN_C),AT_QMTCONN_C); //MQTT����״̬ } //MQTT STA PUBEX m_ec600_config(mqtt_qmtpubex_sta,strlen(mqtt_qmtpubex_sta),AT_QMTPUBEX); //����STA TOPIC m_device_data_config(DEVICE_TYPE_STA,0); if(pubstatus == MODEM_PUBSTATUS_BACK)//��ִ { m_ec600at.device_sta_data[9] = m_ascci_hex(0x03); NRF_LOG_INFO("mqtt data back..."); NRF_LOG_FLUSH(); m_ec600_config((char *)m_ec600at.device_sta_data,47,AT_QMTPUBEXDATA); //Data } else //���� { m_ec600_config((char *)m_ec600at.device_sta_data,47,AT_QMTPUBEXDATA); //Data //MQTT TAG PUBEX for(int i=1;i<201;i++) { if(tag_status_value[i][24] == LORA_VALUE_UPDATE) { mqtt_number_count++; nrf_delay_ms(10); m_ec600_config(mqtt_qmtpubex_tag,strlen(mqtt_qmtpubex_tag),AT_QMTPUBEX); //����TAG TOPIC m_device_data_config(DEVICE_TYPE_TAG,i); m_ec600_config((char *)m_ec600at.device_tag_data,47,AT_QMTPUBEXDATA); //Data tag_status_value[i][24] = LORA_VALUE_DONE; } } } m_ec600n_sleep(); //�������� if((m_ec600at.check_status == (3+2*mqtt_number_count)) || (m_ec600at.check_status == (8+2*mqtt_number_count))) { m_tag_type.check[TAG_EC600N] = TAG_CHECK_SUCCESS; NRF_LOG_INFO("EC600CN MQTT PUBEX SUCCESS."); }else { m_tag_type.check[TAG_EC600N] = TAG_CHECK_ERROR; NRF_LOG_WARNING("EC600CN MQTT PUBEX ERROR.[ERROR: %d]",m_ec600at.check_status); } memset(data_array, 0, sizeof data_array); data_index = 0; m_ec600at.ack = AT_ACK_WAIT; m_ec600at.check_status = 0; if(m_tag_type.check[TAG_EC600N] == TAG_CHECK_ERROR) { m_ec600n_close();//�ػ� } } //��ȡ������������ void m_ec600n_mqtt_sub(void) { uint8_t mqtt_sub[20] = {0}; char mqtt_id[10] = {0}; if(strstr((char *)data_array,"+QMTRECV: 0,0,")) { nrf_delay_ms(100); NRF_LOG_HEXDUMP_INFO(data_array,data_index); if((data_array[data_index-2] == '\r') && (data_array[data_index-1] == '\n')) { for(int i=0;i<16;i++) mqtt_sub[15-i] = data_array[data_index-4-i]; mqtt_sub[16] = data_array[data_index-23]; //���ݳ��� mqtt_sub[17] = data_array[data_index-22]; //���ݳ��� NRF_LOG_INFO("SUB DATA: %s",mqtt_sub); if((mqtt_sub[16] == '1') && (mqtt_sub[17] == '6')) { sprintf(mqtt_id,"%02x%02x%02x%02x",m_ec600at.id_number[4],m_ec600at.id_number[5],m_ec600at.id_number[6],m_ec600at.id_number[7]); if(strstr((char *)mqtt_sub,(char *)mqtt_id)) { m_ec600at.mqtt_cmd = (m_ascci_to_hex(mqtt_sub[8])<<4) + m_ascci_to_hex(mqtt_sub[9]); //ָ���ʶ�� m_ec600at.mqtt_status = (m_ascci_to_hex(mqtt_sub[10])<<4) + m_ascci_to_hex(mqtt_sub[11]); //ָ��� m_ec600at.mqtt_low = (m_ascci_to_hex(mqtt_sub[12])<<4) + m_ascci_to_hex(mqtt_sub[13]); //�Ͷ˱�� m_ec600at.mqtt_high = (m_ascci_to_hex(mqtt_sub[14])<<4) + m_ascci_to_hex(mqtt_sub[15]); //�߶˱�� switch(m_ec600at.mqtt_cmd) { case 0x04: NRF_LOG_INFO("MQTT SUB INTRER SET GESENSOR MODE..."); m_ec600at.mqtt_cmd = LORA_GSENSOR_SET_MODE; m_tag_type.event_status = TAG_CONTROL_EVENT; break; case 0x05: NRF_LOG_INFO("MQTT SUB INTRER FLASH ALL MODE..."); m_ec600at.mqtt_cmd = LORA_FLASH_ALL_MODE; m_tag_type.event_status = TAG_CONTROL_EVENT; break; case 0x06: NRF_LOG_INFO("MQTT SUB INTRER FLASH UP MODE..."); m_ec600at.mqtt_cmd = LORA_FLASH_UP_MODE; m_tag_type.event_status = TAG_CONTROL_EVENT; break; case 0x07: NRF_LOG_INFO("MQTT SUB INTRER FLASH UP IN MODE..."); m_ec600at.mqtt_cmd = LORA_FLASH_UP_IN_MODE; m_tag_type.event_status = TAG_CONTROL_EVENT; break; case 0x08: NRF_LOG_INFO("MQTT SUB INTRER FLASH UP OUT MODE..."); m_ec600at.mqtt_cmd = LORA_FLASH_UP_OUT_MODE; m_tag_type.event_status = TAG_CONTROL_EVENT; break; case 0x09: NRF_LOG_INFO("MQTT SUB INTRER FLASH DOWN MODE..."); m_ec600at.mqtt_cmd = LORA_FLASH_DOWN_MODE; m_tag_type.event_status = TAG_CONTROL_EVENT; break; case 0x0A: NRF_LOG_INFO("MQTT SUB INTRER FLASH DOWN IN MODE..."); m_ec600at.mqtt_cmd = LORA_FLASH_DOWN_IN_MODE; m_tag_type.event_status = TAG_CONTROL_EVENT; break; case 0x0B: NRF_LOG_INFO("MQTT SUB INTRER FLASH DOWN OUT MODE..."); m_ec600at.mqtt_cmd = LORA_FLASH_DOWN_OUT_MODE; m_tag_type.event_status = TAG_CONTROL_EVENT; break; case 0x0C: NRF_LOG_INFO("MQTT SUB INTRER FLASH NUMBER SINGLE MODE..."); m_ec600at.mqtt_cmd = LORA_FLASH_NUMBER_SINGLE_MODE; m_tag_type.event_status = TAG_CONTROL_EVENT; break; case 0x0F: NRF_LOG_INFO("MQTT SUB INTRER FLASH NUMBER RANGE MODE..."); m_ec600at.mqtt_cmd = LORA_FLASH_NUMBER_RANGE_MODE; m_tag_type.event_status = TAG_CONTROL_EVENT; break; //*************************************************************************************** case 0x0D: NRF_LOG_INFO("MQTT SUB INTRER UPDATE MODE..."); m_tag_type.event_status = TAG_UPDATE_EVENT; break; case 0x0E: NRF_LOG_INFO("MQTT SUB INTRER FLASH STA MODE..."); m_ec600at.mqtt_cmd = LORA_CONTROL_STA_MODE; m_tag_type.event_status = TAG_CONTROL_EVENT; break; default: NRF_LOG_INFO("MQTT SUB ERROR DATA"); m_tag_type.event_status = TAG_NO_EVENT; break; } }else { NRF_LOG_WARNING("MQTT SUB WRONG STA ID..."); } }else { NRF_LOG_WARNING("MQTT SUB UNUSEFUL DATA..."); } } memset(data_array, 0, sizeof data_array); data_index = 0; } NRF_LOG_FLUSH(); } /**@brief Function for hex to ascci * @Details */ uint8_t m_ascci_hex(uint8_t str) { if((str<=9)&&(str>=0)) { return str+0x30; }else if((str<=15)&&(str>=10)) { return str+0x37; } } uint8_t m_ascci_to_hex(uint8_t str) { if((str<='9')&&(str>='0')) { return str-0x30; }else if((str<='f')&&(str>='a')) { return str-0x57; } } /**@brief Function for open/close/sleep/wake modem * @Details */ void m_ec600n_open(void) { ret_code_t err_code; EC600N_DTR_LOW(); //����DTR MODEM_ON(); nrf_delay_ms(2000); EC600CN_PWK_HIGH(); nrf_delay_ms(2000); EC600CN_PWK_LOW(); nrf_delay_ms(2000); EC600CN_PWK_HIGH(); nrf_delay_ms(2000); } void m_ec600n_close(void) { EC600N_DTR_HIGH(); //����DTR EC600CN_PWK_HIGH(); nrf_delay_ms(1000); EC600CN_PWK_LOW(); nrf_delay_ms(1000); EC600CN_PWK_HIGH(); nrf_delay_ms(800); MODEM_OFF(); nrf_delay_ms(1000); memset(data_array, 0, sizeof data_array); data_index = 0; m_ec600at.ack = AT_ACK_WAIT; m_ec600at.check_status = 0; } void m_ec600n_sleep(void) { m_ec600_config(EC600N_SLEEP,strlen(EC600N_SLEEP),AT_OK);//SLEEP MODE nrf_gpio_pin_set(EC600CN_DTR_PIN); nrf_delay_ms(200); } void m_ec600n_wake(void) { ret_code_t err_code; nrf_gpio_pin_clear(EC600CN_DTR_PIN); nrf_delay_ms(200); } uint8_t m_ec600n_mqtt_check(void) { uint8_t status=0; m_ec600_config(MQTT_QMTCONN_C,strlen(MQTT_QMTCONN_C),AT_QMTCONN_C); if(m_ec600at.ack!=AT_ACK_ERROR) { status = 1; }else { status = 0; } memset(data_array, 0, sizeof data_array); data_index = 0; m_ec600at.ack = AT_ACK_WAIT; m_ec600at.check_status = 0; return status; } void m_mqtt_string_config(void) { sprintf(mqtt_qmtconn,"%s%02x%02x%02x%02x%s%c%c","AT+QMTCONN=0,\"", m_ec600at.id_number[4],m_ec600at.id_number[5],m_ec600at.id_number[6],m_ec600at.id_number[7], "\",\"elec_tag:elec_tag\",\"elec_tag@2022#.\"", '\r','\n'); sprintf(mqtt_qmtsub,"%s%02x%02x%02x%02x%s%c%c","AT+QMTSUB=0,1,\"elec_tag.in/", m_ec600at.id_number[4],m_ec600at.id_number[5],m_ec600at.id_number[6],m_ec600at.id_number[7], "\",0", '\r','\n'); sprintf(mqtt_qmtpubex_sta,"%s%02x%02x%02x%02x%s%c%c","AT+QMTPUBEX=0,0,0,0,\"elec_tag.out/", m_ec600at.id_number[4],m_ec600at.id_number[5],m_ec600at.id_number[6],m_ec600at.id_number[7], "\",47", '\r','\n'); sprintf(mqtt_qmtpubex_tag,"%s%02x%02x%02x%02x%s%c%c","AT+QMTPUBEX=0,0,0,0,\"elec_tag.out/", m_ec600at.id_number[4],m_ec600at.id_number[5],m_ec600at.id_number[6],m_ec600at.id_number[7], "\",39", '\r','\n'); }
And this only happens when the bootloader is present?
And this only happens when the bootloader is present?
Yes. If I just download soft device, this application will work normally.
OK, thanks for confirming. I still don't see how the bootloader could be impacting this. Does the MQTT_QMTOPEN command cause the receiver to respond with more data than the other commands?
MQTT_QMTOPEN command cause the receiver to respond with more data than the other commands?
But I don't edit the application process when I removed bootloader.