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

Problem integrating simple_at example to my application

Dear All,

I am trying to integrate the simple_at example to my own application, in order to be able to configure the modem in the beginning and then run my code.

I can run the example on its own and run it without an issue. The same goes for my application. But when I try to combine the 2, then I get the following message:

Exception occurred in Secure State
***** HARD FAULT *****
  Fault escalation (see below)
***** BUS FAULT *****
  Precise data bus error
  BFAR Address: 0x50008120
 ***** Hardware exception *****
Current thread ID = 0x200201b4
Faulting instruction address = 0x2fabc
Fatal fault in ISR! Spinning...


I am using tag v 0.4.0 and the nRF9160 DK.

What I am actually doing is the following:

Use the void app_socket_start() from the example as is (adding a few more at commands that I need to add in the at_commands array).

void app_socket_start(void)
{
	int at_socket_fd = socket(AF_LTE, 0, NPROTO_AT);

	printk("Starting simple AT socket application\n\r");

	if (at_socket_fd < 0) {
		printk("Socket err: %d, errno: %d\r\n", at_socket_fd, errno);
	}
	for (int i = 0; i < ARRAY_SIZE(at_commands); i++) {
		wdt_feed(wdt, wdt_channel_id);
		int bytes_written = send(at_socket_fd, at_commands[i],
					 strlen(at_commands[i]), 0);
		if (bytes_written > 0) {
			int r_bytes =
				blocking_recv(at_socket_fd, recv_buf,
					      sizeof(recv_buf), MSG_DONTWAIT);
			if (r_bytes > 0) {
                printk("%s\n", at_commands[i]);
				printk("%s", recv_buf);
			}
		}
	}
	printk("Closing socket\n\r");
	close(at_socket_fd);
	// int err;
	// int k = 0;
	// while (k < 10){
	// 	err = close(at_socket_fd);
	// 	printk("Closing err: %d\n", err);
	// 	wdt_feed(wdt, wdt_channel_id);
	// 	k_sleep(1000);
	// 	k++;
	}
}
}

Then I am sending a UDP message like this:

void app_send_udp_message(u8_t *buffer, ssize_t size) 
{
    int err;

    struct addrinfo *dest_addr;
    err = getaddrinfo(HOST, NULL, NULL, &dest_addr);
    if (err < 0) {
        printk("getaddrinfo err: %d\n\r", err);
    }
    
    if (err != -1) {
        ((struct sockaddr_in *)dest_addr->ai_addr)->sin_port = htons(UDP_PORT);
        ((struct sockaddr_in *)dest_addr->ai_addr)->sin_family = AF_INET;
        
        int socket_sender_fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
		printk("Success until here\n\n\n\n");
        if (socket_sender_fd < 0) {
            printk("socket_sender_fd: %d\n", socket_listener_fd);
        }
        
        printk("Sending UDP Message\n");
        err = sendto(socket_sender_fd, buffer, size, MSG_DONTWAIT, (struct sockaddr *)dest_addr->ai_addr, sizeof((struct sockaddr *)dest_addr->ai_addr));
        if (err < 0) {
            printk("Sending response err: %d errno: %d\n", err, errno);
        }
		ssize_t count = blocking_recv(socket_sender_fd, recv_buf, sizeof(recv_buf) - 1, 0);

        if (socket_sender_fd != -1) {
            (void)close(socket_sender_fd);
        }
        freeaddrinfo(dest_addr);
    }
}

What I noticed is that if I add a long delay after closing the socket that I open in the app_socket_start() (un-commenting the last lines in the app_socket start()), then the program doesn't crush. But I haven't found a way to make my code wait until that socket is properly closed in order to allow my code to continue.

Any ideas on how to best tackle this issue?

Parents Reply Children
No Data
Related