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;
}