Stránka 1 z 1

SIM800L data ze sériové linky

Napsal: 31 led 2022, 15:54
od epzlin
Jakým způsobem převedu informaci o síle signálu do proměnné "silaSignalu"?

Kód: Vybrat vše

#define PIN_TX 3
#define PIN_RX 2
#include <SoftwareSerial.h>
SoftwareSerial VIRTUAL_UART(PIN_TX, PIN_RX);

char serialBuffer[100];
unsigned long cas;
byte silaSignalu;


void setup(){
  Serial.begin(9600);
  VIRTUAL_UART.begin(9600);
}

void loop(){
  if( millis() >= cas+1000){
        cas = millis();
        VIRTUAL_UART.println("AT+CSQ");
        getResponse();
        }   
}

void getResponse(){
  uint8_t var;
  var = VIRTUAL_UART.available();
  if (0 < var){
  VIRTUAL_UART.readBytes(serialBuffer, var);
  Serial.write(serialBuffer, var);
  }
}

void kontrolaSignalu(){
Serial.println("Kontrola sily signalu.");
VIRTUAL_UART.println("AT+CSQ");
getResponse();
}
Na sériové lince dostávám toto:
OK
AT+CSQ

+CSQ: 28,0

OK
AT+CSQ

+CSQ: 28,0

OK
AT+CSQ

+CSQ: 28,0

Re: SIM800L data ze sériové linky

Napsal: 31 led 2022, 17:38
od jankop
Tady je to dobře popsáno a mohlo by to i platit
https://m2msupport.net/m2msupport/atcsq-signal-quality/

Re: SIM800L data ze sériové linky

Napsal: 09 úno 2022, 12:31
od epzlin
Tak toto mi vůbec nepomohlo. Používám teď tuto knihovnu
https://github.com/Seeed-Studio/GPRS_SIM900

#include <GPRS_Shield_Arduino.h>

ve které by mělo být zakomponované to získání signálu.

Kód: Vybrat vše

    bool getSignalStrength(int* buffer);

    /** Send USSD Command Synchronously (Blocking call until unsolicited response is received)
        @param
     *		*ussdCommand string command UUSD, ex: *123#
     *		*resultCode	char Result Code, see AT+CUSD command
     *		*response	string response
     *		*cellBroadcast	int Cell Broadcast Data Coding Scheme
        @returns
            true on success
            false on error
    */

Kód: Vybrat vše

bool GPRS::getSignalStrength(int* buffer) {
    //AT+CSQ						--> 6 + CR = 10
    //+CSQ: <rssi>,<ber>			--> CRLF + 5 + CRLF = 9
    //OK							--> CRLF + 2 + CRLF =  6

    byte i = 0;
    char gprsBuffer[26];
    char* p, *s;
    char buffers[4];
    sim900_flush_serial();
    sim900_send_cmd(F("AT+CSQ\r"));
    sim900_clean_buffer(gprsBuffer, 26);
    sim900_read_buffer(gprsBuffer, 26, DEFAULT_TIMEOUT);
    if (NULL != (s = strstr(gprsBuffer, "+CSQ:"))) {
        s = strstr((char*)(s), " ");
        s = s + 1;  //We are in the first phone number character
        p = strstr((char*)(s), ",");  //p is last character """
        if (NULL != s) {
            i = 0;
            while (s < p) {
                buffers[i++] = *(s++);
            }
            buffers[i] = '\0';
        }
        *buffer = atoi(buffers);
        return true;
    }
    return false;
}
Jakým příkazem a jak si z toho dokážu zjistit tu sílu signálu?

Re: SIM800L data ze sériové linky

Napsal: 09 úno 2022, 16:26
od jankop
Je to velmi jednoduché a pochybuji, že změnou knihovny něco vyřešíš. Ten odkaz, který jsem ti dal, je prakticky vyčerpávající. Příkaz AT+CSQ ti vrátí dvě hodnoty. Pravděpodobně dva stringy oddělené čárkou. Ty vezmeš tu první hodnotu, převedeš ji na číslo. Čtyřmi podmínkami vyhodnotíš stavy 0,1,31 a 99 a hodnoty 2 - 30 přemapuješ třeba polem o 29 prvcích. Za příkaz map() bych v tomto případě ruku do ohně nedal. Hledáš vědu, kde není. Ve svém původním programu vytvoř proměnnou integer CSQ a najdi způsob, jak do ní uložit tu část odpovědi 28 z celé odpovědi +CSQ: 28,0. Prostě vezmeš náležitou část řetězce a uděláš konverzi na integer. Protože údaj v dBm je pro mnoho lidí matoucí, je možné udělat ještě další konverzi na procenta síly signálu.
SIM800L.png
Na druhé straně tohle pravděpodobně vraci přímo hodnotu RSSI i když pro mě je to poněkud nepřehledné.

Kód: Vybrat vše

bool GPRS::getSignalStrength(int* buffer) {
    //AT+CSQ						--> 6 + CR = 10
    //+CSQ: <rssi>,<ber>			--> CRLF + 5 + CRLF = 9
    //OK							--> CRLF + 2 + CRLF =  6

    byte i = 0;
    char gprsBuffer[26];
    char* p, *s;
    char buffers[4];
    sim900_flush_serial();
    sim900_send_cmd(F("AT+CSQ\r"));
    sim900_clean_buffer(gprsBuffer, 26);
    sim900_read_buffer(gprsBuffer, 26, DEFAULT_TIMEOUT);
    if (NULL != (s = strstr(gprsBuffer, "+CSQ:"))) {
        s = strstr((char*)(s), " ");
        s = s + 1;  //We are in the first phone number character
        p = strstr((char*)(s), ",");  //p is last character """
        if (NULL != s) {
            i = 0;
            while (s < p) {
                buffers[i++] = *(s++);
            }
            buffers[i] = '\0';
        }
        *buffer = atoi(buffers);
        return true;
    }
    return false;
}

Re: SIM800L data ze sériové linky

Napsal: 13 úno 2022, 14:18
od epzlin
Stále tápu. Jak tato funkce může vrátit sílu signálu, když je typu boolean?

Kód: Vybrat vše

bool GPRS::getSignalStrength(int* buffer) {
    //AT+CSQ						--> 6 + CR = 10
    //+CSQ: <rssi>,<ber>			--> CRLF + 5 + CRLF = 9
    //OK							--> CRLF + 2 + CRLF =  6

    byte i = 0;
    char gprsBuffer[26];
    char* p, *s;
    char buffers[4];
    sim900_flush_serial();
    sim900_send_cmd(F("AT+CSQ\r"));
    sim900_clean_buffer(gprsBuffer, 26);
    sim900_read_buffer(gprsBuffer, 26, DEFAULT_TIMEOUT);
    if (NULL != (s = strstr(gprsBuffer, "+CSQ:"))) {
        s = strstr((char*)(s), " ");
        s = s + 1;  //We are in the first phone number character
        p = strstr((char*)(s), ",");  //p is last character """
        if (NULL != s) {
            i = 0;
            while (s < p) {
                buffers[i++] = *(s++);
            }
            buffers[i] = '\0';
        }
        *buffer = atoi(buffers);
        return true;
    }
    return false;
}

Re: SIM800L data ze sériové linky

Napsal: 13 úno 2022, 15:16
od jankop
Parametr je ovšem typu ukazatel. Pročpak tam asi je? Funkci je možné parametry hodnoty předat a funkce může také hodnoty prostřednictvím parametrů vracet.