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.