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
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.
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.