Hi,
I am communicating SIM808 with nRF52840. I have made changes in libuarte example and send AT commands to send SMS. I have the following question.
- How can I know that I have received complete data?
- How can I send (char) 26 (termination character) at the end of SMS?
- Is there any library available for sending sms and MQTT communication?
Thanks!
/**
* Copyright (c) 2018 - 2020, Nordic Semiconductor ASA
*
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this
* list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form, except as embedded into a Nordic
* Semiconductor ASA integrated circuit in a product or a software update for
* such product, must reproduce the above copyright notice, this list of
* conditions and the following disclaimer in the documentation and/or other
* materials provided with the distribution.
*
* 3. Neither the name of Nordic Semiconductor ASA nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* 4. This software, with or without modification, must only be used with a
* Nordic Semiconductor ASA integrated circuit.
*
* 5. Any software provided in binary form under this license must not be reverse
* engineered, decompiled, modified and/or disassembled.
*
* THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/
/** @file
* @defgroup libuarte_example_main main.c
* @{
* @ingroup libuarte_example
* @brief Libuarte Example Application main file.
*
* This file contains the source code for a sample application using libuarte.
*
*/
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include "nrf_libuarte_async.h"
#include "nrf_drv_clock.h"
#include <bsp.h>
#include "nrf_log_ctrl.h"
#include "nrf_log_default_backends.h"
#include "nrf_queue.h"
#include "nrf_delay.h"
NRF_LIBUARTE_ASYNC_DEFINE(libuarte, 0, 0, 0, NRF_LIBUARTE_PERIPHERAL_NOT_USED, 255, 3);
static uint8_t text[] = "UART example started5.\r\nLoopback:\r\n";
static uint8_t text_size = sizeof(text);
static volatile bool m_loopback_phase;
static uint8_t command[]="123456789012345123456534623465351235412344123412341234";
unsigned char received_data[50];
int count_data=0;
bool data_completed=false;
typedef struct {
uint8_t * p_data;
uint32_t length;
} buffer_t;
NRF_QUEUE_DEF(buffer_t, m_buf_queue, 10, NRF_QUEUE_MODE_NO_OVERFLOW);
void uart_event_handler(void * context, nrf_libuarte_async_evt_t * p_evt)
{
nrf_libuarte_async_t * p_libuarte = (nrf_libuarte_async_t *)context;
ret_code_t ret;
switch (p_evt->type)
{
case NRF_LIBUARTE_ASYNC_EVT_ERROR:
bsp_board_led_invert(0);
break;
case NRF_LIBUARTE_ASYNC_EVT_RX_DATA:
//if(((unsigned char)*(p_evt->data.rxtx.p_data)>=0x20&(unsigned char)*(p_evt->data.rxtx.p_data)<=0xFE))
if((unsigned char)*(p_evt->data.rxtx.p_data)!=0)
{
received_data[count_data]=(unsigned char)*(p_evt->data.rxtx.p_data);
count_data=count_data+1;
}
//else
//{
// printf("%d\n",(unsigned char)*(p_evt->data.rxtx.p_data));
//}
//if(received_data[count_data-2]==13 &received_data[count_data-1]==10)
// printf("Carriage\n");
// //data_completed=true;
m_loopback_phase = true;
// printf("Rx Called\n");
break;
case NRF_LIBUARTE_ASYNC_EVT_TX_DONE:
if (m_loopback_phase)
{
nrf_libuarte_async_rx_free(p_libuarte, p_evt->data.rxtx.p_data, p_evt->data.rxtx.length);
if (!nrf_queue_is_empty(&m_buf_queue))
{
buffer_t buf;
ret = nrf_queue_pop(&m_buf_queue, &buf);
APP_ERROR_CHECK(ret);
UNUSED_RETURN_VALUE(nrf_libuarte_async_tx(p_libuarte, buf.p_data, buf.length));
}
}
bsp_board_led_invert(2);
// printf("Tx Called\n");
break;
default:
break;
}
}
/**
* @brief Function for main application entry.
*/
bool send_command(char cmd[],int size_cmd)
{
ret_code_t err_code;
count_data=0;
for (int i=0;i<25;i++)
{
received_data[i]=0;
}
printf("Sending : ");
printf(cmd);
memset(command, 0, sizeof(command));
for (int i=0;i<size_cmd;i++)
{
command[i]=cmd[i];
}
do {
err_code = nrf_libuarte_async_tx(&libuarte, command,sizeof(command));
}
while (err_code == NRF_ERROR_BUSY);
APP_ERROR_CHECK(err_code);
nrf_delay_ms(1000);
printf("Received : %s\n",received_data);
//char *ret;
//ret = strstr(received_data, "OK");
//printf("Response is: %s\n", ret);
printf("-----------------------------------------------------\n");
}
int main(void)
{
bsp_board_init(BSP_INIT_LEDS);
ret_code_t ret = nrf_drv_clock_init();
APP_ERROR_CHECK(ret);
nrf_drv_clock_lfclk_request(NULL);
ret_code_t err_code = NRF_LOG_INIT(app_timer_cnt_get);
APP_ERROR_CHECK(err_code);
NRF_LOG_DEFAULT_BACKENDS_INIT();
nrf_libuarte_async_config_t nrf_libuarte_async_config = {
.tx_pin = TX_PIN_NUMBER,
.rx_pin = RX_PIN_NUMBER,
.baudrate = NRF_UARTE_BAUDRATE_9600,
.parity = NRF_UARTE_PARITY_EXCLUDED,
.hwfc = NRF_UARTE_HWFC_DISABLED,
.timeout_us = 100,
.int_prio = APP_IRQ_PRIORITY_LOW
};
err_code = nrf_libuarte_async_init(&libuarte, &nrf_libuarte_async_config, uart_event_handler, (void *)&libuarte);
APP_ERROR_CHECK(err_code);
nrf_libuarte_async_enable(&libuarte);
//send_command("AT\n",sizeof("AT\n"));
//send_command("AT+GSN\n",sizeof("AT+GSN\n"));
//send_command("AT+CSQ\n",sizeof("AT+CSQ\n"));
//send_command("AT+CCID\n",sizeof("AT+CCID\n"));
//send_command("AT+CREG?\n",sizeof("AT+CREG?\n"));
//send_command("AT+CMGF=1\n",sizeof("AT+CMGF=1\n"));
//send_command("AT+CMGR=1\n",sizeof("AT+CMGR=1\n"));
//sim.println("AT+CMGS=\"" + Auth_Number + "\"\r"); //Mobile phone number to send message
//delay(1000);
//sim.print(BLE_Feedback);
//delay(100);
//sim.println((char)26);// ASCII code of CTRL+Z
send_command("AT\n",sizeof("AT\n"));
send_command("AT+GSN\n",sizeof("AT+GSN\n"));
send_command("AT+CSQ\n",sizeof("AT+CSQ\n"));
//send_command("AT+CCID\n",sizeof("AT+CCID\n"));
//send_command("AT+CREG?\n",sizeof("AT+CREG?\n"));
send_command("AT+CMGF=1\n",sizeof("AT+CMGF=1\n"));
//send_command("AT+CSCS=\"GSM\"\r\n",sizeof("AT+CSCS=\"GSM\"\r\n"));
send_command("AT+CMGS=\"+923026620366\"\r\n",sizeof("AT+CMGS=\"+923026620366\"\r\n"));
send_command("Hello World\n",sizeof("Hello World\n"));
//send_command("\x1a",sizeof("\x1a"));
nrf_serial_write()
while (true)
{
NRF_LOG_FLUSH();
}
}
/** @} */




