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

How to get "OK" message after sending an AT command "AT+CFUN=1"?

<environment>
-  Windows10
- modem fw v1.2.0
- nrf v1.3.0

I try to receive "OK" message after sending an AT command "AT+CFUN=1" using at_cmd.c functions but can't receive it.

How can I do that?

This doesn't work

#include <modem/at_cmd.h>
#define RX_BUF_LEN 256
char buf[RX_BUF_LEN];

void main()
{
	int ret = 0;
    enum at_cmd_state state;

    if (at_cmd_init() != 0) {
        printk("Error: ret = %d\n", ret);
    }
    
    ret = at_cmd_write("AT+CFUN=1", buf, RX_BUF_LEN, &state);
    printk("---------\n%s\n%s", "AT+CFUN=1", buf);
    if (ret != 0) {
        printk("Error: ret = %d\n", ret);
    }
    
    .
    .
    .
    
}

Then I used semaphore  and and at_notif.c referring to lte_lc.c but at_handler doesn't receive a message. 

What's the difference between at_cmd_write_with_callback and at_notif_register_handler?

#include <zephyr.h>
#include <string.h>
#include <stdio.h>
#include <modem/lte_lc.h>
#include <modem/at_cmd.h>

#define RX_BUF_LEN 256

char buf[RX_BUF_LEN];
static struct k_sem link;
static void at_handler(void *context, const char *response)

static void at_handler(void *context, const char *response)
{
	ARG_UNUSED(context);

	if (response == NULL) {
		printk("Response buffer is NULL-pointer\n");
		return;
	}
    printk("%s\n",response);
    k_sem_give(&link);
}

void main()
{
	int ret = 0;
    enum at_cmd_state state;

    k_sem_init(&link, 0, 1);
    at_notif_init();

    if (at_cmd_init() != 0) {
        printk("Error: ret = %d\n", ret);
    }

	ret = at_notif_register_handler(NULL, at_handler);
	if (ret) {
		printk("Can't register AT handler, error: %d\n", ret);
		return;
	}
	
    ret = at_cmd_write("AT+CFUN=1", NULL, 0, NULL);
    printk("%s\n", "AT+CFUN=1");
    if (ret < 0) {
        printk("Error: ret = %d\n", ret);
        return;
    }
    ret = k_sem_take(&link, K_SECONDS(60));
    if (ret == -EAGAIN) {
        printk("Network connection attempt timed out\n");
        return;
    }

Any tip?

Parents
  • Hello,

    Is ret = 0 after this call?

    ret = at_cmd_write("AT+CFUN=1", buf, RX_BUF_LEN, &state);

    If it returns 0 it means that you receive the "OK" message. The at_notif_handler is only used if you expect any other callbacks, such as CEREG updates. If you expect a callback you can use at_cmd_write_with_callback(). 

    So if ret = 0, then the AT+CFUN=1 is successful.

    Best regards,

    Edvin

Reply
  • Hello,

    Is ret = 0 after this call?

    ret = at_cmd_write("AT+CFUN=1", buf, RX_BUF_LEN, &state);

    If it returns 0 it means that you receive the "OK" message. The at_notif_handler is only used if you expect any other callbacks, such as CEREG updates. If you expect a callback you can use at_cmd_write_with_callback(). 

    So if ret = 0, then the AT+CFUN=1 is successful.

    Best regards,

    Edvin

Children
Related