U260 vs E402 RSSI, E402 returns 1

Using the same code between a U260 module and a E402 module the RSSI value in the E402 always returns 1 while the U260 returns expected values.

Below is the code I’m using. Is there a difference with how the E402 returns RSSI?

void wirelessSignalDisplay() {
  static int16_t wirelessRSSI = -1;
  static uint32_t prevRSSIMillis = 0; // timer to only read the cellular rssi at certain frequency
  static const uint8_t x = 160;
  static const uint8_t y = 16;

  if (millis() - prevRSSIMillis >= 500){
    if (Particle.connected()) {
      #if PLATFORM_ID == PLATFORM_ELECTRON_PRODUCTION //This is broken out seperately due to uint64 var size.
        #define RADIO Cellular
        CellularSignal sig = Cellular.RSSI();
        Serial.print("sig: "); Serial.println(sig);
        wirelessRSSI = sig.rssi;
      #elif PLATFORM_ID == PLATFORM_P1
        #define RADIO WiFi
        wirelessRSSI = WiFi.RSSI();

      if (wirelessRSSI < -95){ //low
        // pxs.drawCompressedBitmap(x, y, img_wifi_0_BL_png_comp);
        drawConnectionStatusIcon(x, y, WIRELESS25);
      } else if (wirelessRSSI < -85){ //25%
        // pxs.drawCompressedBitmap(x, y, img_wifi_33_BL_png_comp);
        drawConnectionStatusIcon(x, y, WIRELESS50);
      } else if (wirelessRSSI < -70){ //50%
        // pxs.drawCompressedBitmap(x, y, img_wifi_66_BL_png_comp);
        drawConnectionStatusIcon(x, y, WIRELESS75);
      } else if (wirelessRSSI < -1){ //75%
        // pxs.drawCompressedBitmap(x, y, img_wifi_full_BL_png_comp);
        drawConnectionStatusIcon(x, y, WIRELESS100);
      } else {
        // pxs.drawCompressedBitmap(x, y, img_wifi_0_BL_png_comp);
        drawConnectionStatusIcon(x, y, WIRELESS0);
      eraseWirelessExclamation(x, y);
    } else if (RADIO.connecting()){
      drawConnectionStatusIcon(x, y, WIFICONNECTING);
    } else if (battPower){
    prevRSSIMillis = millis();

What system firmware version are you using on your E402?

I used this code:

#include "Particle.h"

SerialLogHandler logHandler;

const unsigned long CHECK_PERIOD_MS = 10000;
unsigned long lastCheck = 0;

void setup() {

void loop() {
	if (millis() - lastCheck >= CHECK_PERIOD_MS) {
		lastCheck = millis();

		Log.info("rssi=%d", Cellular.RSSI().rssi);

And got this result:

0000010023 [app] INFO: rssi=-75
0000020023 [app] INFO: rssi=-77

Using system firmware 0.8.0-rc.10 and 0.8.0-rc.11.

Im using 0.8.0-rc.11.

I other testing code for my device expected values for the RSSI are being read. There is then something in the code causing this.

Do you have any thoughts what could cause the RSSI value to return as 1 but still be connected to the cloud and publish data?

Also do you know why the QUAL is always 0 for the E402?

I’d try the minimal test program above and see what it returns.

Qual will always be 0 as it’s not supported by the SARA-R410M

• Only LTE RAT is supported.
• The parameter is not supported, and will be always set to 99.

(99 gets mapped to 0 by the Cellular.RSSI call)


Also my above program started to report expected RSSI vaulues on 10/22 and I didnt change anything, but today it is now reporting RSSI as 1. This is strange behavior. I am having my device go to Deep sleep frequently, so maybe the procedure to turning off the LTE is causing something to happen…

Are you waiting until Cellular.ready() is true, or using AUTOMATIC mode? If you query the RSSI too soon you might get an odd value.

Im using:

if (Particle.connected()) in semi automatic mode.

Even with if (Particle.connected()) its still not showing correctly at times.

It seems that thiss issue happens after the device goes to deep sleep and then wakes up. When RSSI was returning 1 i removed all power (hard reset) and then the RSSI values showed up correctly.

@rickkas7 I’ve been trying many things to resolve this issue with RSSI returning 1.

Do you know what causes CellularSignal sig = Cellular.RSSI(); to return 1?

CellularSignal sig = Cellular.RSSI();
        wirelessRSSI = sig.rssi;

@rickkas7, I’ve found that the only way to clear up the RSSI of returning 1 while the device is still connected to Particle and able to publish events is to deep sleep the device for 5 or 10 seconds.

This is less than ideal becasue it is a device that a user intacts with multiple times a day.

@wesner0019 please try v1.0.1