Hi,
I am testing connection with electron but witnessing a very strange behavior. With my test using AT commands to check connection I am seeing the following
Connections only once in a while
I must put Cellular.connect() in loop() to at least get any connection. If this function is not put in loop(), I don’t get any connection at all. If I call connect() only in setup(), nothing works. Really strange!
With the current behavior it’s impossible to use the module for what we are planning to do. Has anyone noticed this behavior before? Below is the code and the output I get.
#include "AssetTracker.h"
//SYSTEM_MODE(MANUAL) //SEMI_AUTOMATIC
SYSTEM_THREAD(ENABLED)
String gAtResponse;
int callbackAT(int type, const char* buf, int len, char* param)
{
gAtResponse = buf;
gAtResponse[len]='\0';
Serial.println("Length: " + (String) len+ " Buff:"+gAtResponse);
return WAIT;
}
int bOnce = 0;
void setup()
{
Cellular.on();
Particle.connect();
Serial.begin(9600);
}
int cnt = 0;
void loop()
{
//Without constantly calling connect() here nothing works
while (true) {
if (Cellular.ready()) {
Serial.printlnf("There is connection: %d", cnt);
break;
}
Serial.printlnf("Not connected: %d", cnt);
Cellular.connect();
delay(1000);
cnt++;
if (cnt > 1000)
cnt = 0;
}
char response[32] = "";
int err = 0;
err = Cellular.command(callbackAT, response, 10000, "AT+CIFSR\r\n");
if (err == RESP_OK)
Serial.printlnf("Wireless OK: "+gAtResponse);
else
Serial.println("Wireless fails :"+gAtResponse);
err = Cellular.command(callbackAT, response, 10000, "AT+CIPSTATUS\r\n"); //IP STATUS
if (err == RESP_OK)
Serial.println("Yeah we have an IP address: "+gAtResponse);
else
Serial.println("No IP address: "+gAtResponse);
}
Output:
Length: 23 Buff: +CME ERROR: unknown
No IP address: +CME ERROR: unknown
There is connection: 10
Length: 26 Buff: +UDNSRN: "54.89.10.58"
Length: 26 Buff: +UDNSRN: "54.89.10.58"
Length: 26 Buff: +UDNSRN: "54.89.10.58"
Length: 13 Buff: +USOCR: 0
Length: 37 Buff: +CME ERROR: operation not allowed
Wireless fails : +CME ERROR: operation not allowed
Yeah we have an IP address: OK
Not connected: 10
Not connected: 11
...
Not connected: 27
Not connected: 28
Wireless OK: OK
Yeah we have an IP address: OK
I would suggest getting it working first with SYSTEM_THREAD() disabled, and SYSTEM_MODE(AUTOMATIC)… You won’t need Particle.connect() or Cellular.on() or Cellular.connect() at all. You can still use Cellular.ready() and also Cellular.localIP() https://docs.particle.io/reference/firmware/electron/#localip- for the IP address. However this IP is private, not public… so only really good for knowing you in fact do have an IP address, which means you have a PDP context and can communicate over the internet.
The commnand “AT+CIFSR” is what I have been using to check is a module has an IP Address attached to it. I have not seen that in the recent link you sent. Perhaps it’s now absolute.
The reason why I use SYSTEM_THREAD(ENABLED) is because I was not getting any output to hyperterminal and when I inserted it in the code, I started getting output generated with Serial.print(). The output helped me and I didn’t check and further implication of using it. I have taken it out and things seem to look pretty fine.
The only issue I am having is that all my Serial.println() now do not print anything when I open hyperterminal.
Is this a known issue. The code is just as before with Cellular.on(), Cellular.connect() removed.
#include "AssetTracker.h"
SYSTEM_MODE(AUTOMATIC) //SEMI_AUTOMATIC
//SYSTEM_THREAD(ENABLED)
AssetTracker t = AssetTracker()
String gAtResponse;
int callbackAT(int type, const char* buf, int len, char* param)
{
gAtResponse = buf;
gAtResponse[len]='\0';
Serial.println("Length: " + (String) len+ " Buff:"+gAtResponse);
return WAIT;
}
void setup()
{
t.begin();
t.gpsOn();
pinMode(D7, OUTPUT);
Serial.begin(9600);
}
void loop()
{
t.updateGPS();
Serial.println("NMEA:");
Serial.println(t.preNMEA()); //Never print any output even when I have a fix
Serial.println("IMEI READ:");
err = Cellular.command(callbackAT, response, 10000, "AT+CGSN\r\n");
if (err == RESP_OK)
Serial.println(gAtResponse);
//Light up D7 LED
digitalWrite(D7, HIGH);
delay(1000);
//Switch off LED
digitalWrite(D7, LOW);
delay(500);
//Check IP address
Serial.print("IP Address: ");
Serial.println(Cellular.localIP());
}
…
Observations:
Without SYSTEM_THREAD(ENABLED), nothing is printed to hyperterminal and the LED D7 never lights up. The RGB LEDS however does blink white(indicating there is connection). Without LED D7 blinking and no output it shows the code is not even being executed.
With SYSTEM_THREAD(ENABLED), I get outputs on hyperterminal, LED D7 blinks but I never get a connection i.e. RGB LED only blinks blue
With SYSTEM_THREAD(ENABLED) and calling Cellular.connect() in loop(), I can get connection at time but most of the time not.
I have not succeeded to print NMEA data with t.preNMEA(); evene when I have a fix
So with this effect, I do not have any mean to see my code being executed (LED 7 on and off) and getting connections.
Blinking white is not an indication of a working connection and in AUTOMATIC mode this means no application code execution till you see breathing cyan.
Blinking blue would suggest a problem with the SIM (e.g. not inserted, bad connection, ...)
I'd try leaving your AT commands away for the test to see if they trip up the connection with treading enabled.