Search code examples
c++stm32gsmmbedadafruit

Adafruit Fona 3g Library; How exactly does this work?


I am trying to send a packet to a server over 3g and TCP connection. Below is a link to the .cpp and .h file I have found:

https://os.mbed.com/users/Nels885/code/Adafruit_FONA_3G/

More specifically, I am really confused on how TCPSend works under the Adafruit_FONA_3G class. I am trying to implement it but my code seems to get stuck at packet[0] = 0; under function bool Adafruit_FONA_3G::TCPsend(char *packet).

I have tried commenting out packet[0] = 0; and the code runs all the way through. I have also tried initializing char* packet[32]; before packet[0] = 0; and the code runs all the way through. I am assuming the function is not detecting the packet input.

Here is the specific function from the .cpp file:

bool Adafruit_FONA_3G::TCPsend(char *packet)
{
    if (strlen(packet) > 0) 
    { 
        mySerial.printf("%s", packet);
        //mySerial.printf("%s\r\n", packet);
        readline();
        packet[0] = 0;
        return true;
    } 
    else 
        return false;
}

Here is my main code:

#include "mbed.h"
#include "Adafruit_FONA.h"

#define FONA_RST D4
#define FONA_TX D1
#define FONA_RX D0
#define FONA_RI D7 //not used

char replybuffer[255];


Adafruit_FONA_3G fona(FONA_TX, FONA_RX, FONA_RST, FONA_RI);
Serial pc(USBTX, USBRX);

int main() 
{

    fona.TCPinitialize();

    char Timeout[21];
    fona.getTCPtimeout(Timeout);

    char * Server = "52.14.99.26";
    uint16_t Port = 10001;
    fona.TCPconnect(Server,Port);

    char *Packet = "Pick Up %";
    fona.TCPsend(Packet);

    fona.TCPclose();

}

Solution

  • Adafruit_FONA_3G::TCPsend() assumes that you pass it a writable buffer. You're passing a read-only buffer. So, replace

    char *Packet = "Pick Up %";
    

    with

    char Packet[] = "Pick Up %";
    

    The problem is really that your compiler allows you to initialize writable pointers with read-only values. This is a shortcoming of your compiler.