Skocz do zawartości

Arduino Fibocom GSM G510


wojtek6000

Pomocna odpowiedź

Witam

Mam problem z modułem GSM Fibocom G510 i Arduino Due. Poniższy kod poprawnie odbiera odpowiedzi na krótkie komendy typu: AT, AT+HTTPSET, itp. Poprawnie odbiera to znaczy że nie gubi żadnych znaków i zawsze zwraca odpowiedz. Problem pojawia się w przypadku gdy odpowiedź modułu składa się z kilku fragmentów jak np: AT+HTTPACT lub AT+MIPCALL. Funkcja odbierz() powoduje wysłanie komendy do modułu i nasłuchiwanie odpowiedzi aż do momentu kiedy nastąpi ciąg "OK\r\n" lub "ERROR\r\n", z tym że nie czeka w nieskończoność tylko zadaną liczbę sekund. Natomiast funkcja odbierz_puste dział niemal identycznie z tą różnicą że nie wysyła przed sobą żadnej komendy. Właśnie ta funkcja działa nieprawidłowo i kończy się zbyt szybko. Podczas debugowania programu przez SerialPort zauważyłem też dziwne zjawisko: kolejność komunikatów zawartych w kodzie jest inna niż komunikaty wyświetlające się w terminalu: komunikat debugujący który miał wyświetlać się jako pierwszy wyświetla się trzeci lub czwarty... kolejność jest losowa... Ktoś wie co może być nie tak?

void GSMpower()
// software equivalent of pressing the GSM shield "power" button
{
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
czekaj(5000);
digitalWrite(7, LOW);
digitalWrite(6, LOW);
czekaj(30000);
}

void czekaj(int czas){

unsigned long now=millis();
int licznik=0;
while(licznik<=czas){

if(now!=millis()){
now=millis();
licznik++;
}
int tmp=1;
}
}


/****************ustanowienie połączenia z internetem********/
void connect_to_internet(){
while(1){
String odpowiedz=odbierz("AT",1,10);
Serial.println(odpowiedz); 
odpowiedz=odbierz("AT+MIPCALL=1,\"playmetric\"",3,10);
Serial.println(odpowiedz);
Serial.println("wchodze w odbierz puste");
odpowiedz=odbierz_puste(10);
Serial.println(odpowiedz);
if(odpowiedz.indexOf("MIPCALL:")){
break;
}
czekaj(3000); //oczekiwanie zeby urzadznei sie odwiesilo
}
}
/*************************************************************/


/*********Wysłanie stringa metoda serial.write ****/
void writeString(String stringData) { 
while (!Serial2.available()){};
for (int i = 0; i < stringData.length(); i++)
{
Serial2.write(stringData[i]); // Push each char 1 by 1 on each loop pass
//Serial2.flush();
}
} 

String odbierz_puste(byte czas){
String wynik="";
char inChar;
int tim=czas*1000;
for(int i=0;i<tim;i=i+10){
while(Serial2.available()>0) {
inChar = (char)Serial2.read();
wynik.concat(inChar);
}
if(wynik.indexOf("OK\r\n")){
return wynik;
}
else{
if(wynik.indexOf("ERROR\r\n")){
wynik="";
}
}
czekaj(10);
}
return wynik;
}



String odbierz(String komenda,byte powtorzenia,byte czas){
String wynik="";
for(byte x=0;x<powtorzenia;x++){
writeString(komenda);
writeString("\r");
Serial2.flush();
int tim=czas*1000;
char inChar;
for(int i=0;i<tim;i++){
while(Serial2.available()>0) {
inChar = (char)Serial2.read();
wynik.concat(inChar);
}
if(wynik.indexOf("OK\r\n")){
return wynik;
}else{
if(wynik.indexOf("ERROR\r\n")){
wynik="";
}
}
czekaj(1);
}
}
return wynik;
}

/*****pobieranie ilości znaków w pobranej stronie PACTEM*****/ 
int get_read_page(String odpowiedz){
int pocz = odpowiedz.lastIndexOf("<");
int kon = odpowiedz.lastIndexOf(">");
if(pocz<1 || kon<2){
return 0; 
}
if(pocz>=kon){
return 0;
}
pocz++;
String tmp="";
for(int i=pocz;i<kon;i++){
tmp+=odpowiedz[i];
}
return tmp.toInt();
}
/******************************************************/

/*****funkcja pobiera dane z serwera (stawienia) ta powyzej jest zła do ustawien*****/

String get_data_config_json(String adres){
String dane="{\"device\":790141753}";
return send_data(adres,dane);
}

/************************************************************************/

/******wyslanie danych na serwer****/
String send_data(String adres, String dane){
int dlugosc=0;
while(dlugosc==0){
String odp=odbierz("AT+HTTPSET=\"URL\",\"http://"+adres+"\"",1,3);
Serial.print(odp);
odp=odbierz("AT+HTTPSET=\"UAGENT\",\"fibocom\"",1,3);
Serial.print(odp);
odp=odbierz("AT+HTTPSET=\"CONTYPE\",\"application/json\"",1,3);
Serial.print(odp);

odp=odbierz("AT+HTTPDATA="+String(dane.length()),1,3);
Serial.print(odp);
writeString(dane);
odp=odbierz("\r",1,3);
Serial.print(odp);

odp=odbierz("AT+HTTPACT=1",1,10);
Serial.print(odp);
odp=odbierz_puste(20);
Serial.print(odp);
dlugosc=get_read_page(odp);
Serial.println(dlugosc);
}
String dupa;
dupa=odbierz("AT+HTTPREAD=0,"+String(dlugosc),5,5);
dupa=odbierz_puste(10);
dupa=odbierz_puste(10);
return cut_to_json(dupa);
}

/********funkcja obcina stringa do samego jsona*****/
String cut_to_json(String obj){
int pocz=obj.indexOf('{');
int kon=obj.lastIndexOf('}');

if(pocz<1 || kon<2){
return ""; 
}
if(pocz>=kon){
return "";
}

kon++;
String biez;
String last=" ";
String wynik="";
for(int i=pocz;i<kon;i++){
biez=obj[i];
if((!(biez.equals(" "))) && (!(last.equals(" ")))){
if((!(biez.equals("\r"))) && (!(last.equals("\n")))){
wynik+=obj[i];
}
}
last=biez;
}

return wynik;
}
/****************************************************/


void setup() {
pinMode(6,OUTPUT); //piny do załączania modułu gsm
pinMode(7,OUTPUT);

Serial.begin(19200);
Serial2.begin(19200);

Serial.println("Start Program");
GSMpower();

String odp=odbierz("AT",1,5);
Serial.println(odp);

czekaj(500);
Serial.println("Ĺ‚Ä…cze z internetami");
connect_to_internet();
}

void loop() {
odbierz("AT",1,5);
czekaj(1000);

String dane = get_data_config_json(String("http://adres_URL.com")); //pobranie ustawien z standardowego adresu ustawien
Serial.print("Dane odebrane: ");
Serial.println(dane);

czekaj(3000);

}
Link do komentarza
Share on other sites

Sorki za kod bez wcięć🙂 Już poprawiłem:


void GSMpower()
// software equivalent of pressing the GSM shield "power" button
{
digitalWrite(7, HIGH);
digitalWrite(6, HIGH);
czekaj(5000);
digitalWrite(7, LOW);
digitalWrite(6, LOW);
czekaj(30000);
}

void czekaj(int czas){

unsigned long now=millis();
int licznik=0;
while(licznik<=czas){

	if(now!=millis()){
		now=millis();
		licznik++;
	}
	int tmp=1;
}
}


/****************ustanowienie polaczenia z internetem********/
void connect_to_internet(){
while(1){
	String odpowiedz=odbierz("AT",1,10);
	Serial.println(odpowiedz);
	odpowiedz=odbierz("AT+MIPCALL=1,\"playmetric\"",3,10);
	Serial.println(odpowiedz);
	Serial.println("wchodze w odbierz puste");
	odpowiedz=odbierz_puste(10);
	Serial.println(odpowiedz);
	if(odpowiedz.indexOf("MIPCALL:")){
		break;
	}
	czekaj(3000); //oczekiwanie zeby urzadznei sie odwiesilo
}
}
/*************************************************************/


/*********Wysłanie stringa metoda serial.write ****/
void writeString(String stringData) {
while (!Serial2.available()){};
for (int i = 0; i < stringData.length(); i++)
{
	Serial2.write(stringData[i]); // Push each char 1 by 1 on each loop pass
	//Serial2.flush();
}
}

String odbierz_puste(byte czas){
String wynik="";
char inChar;
int tim=czas*1000;
for(int i=0;i<tim;i=i+10){
	while(Serial2.available()>0) {
		inChar = (char)Serial2.read();
		wynik.concat(inChar);
	}
	if(wynik.indexOf("OK\r\n")){
		return wynik;
	}
	else{
		if(wynik.indexOf("ERROR\r\n")){
			wynik="";
		}
	}
	czekaj(10);
}
return wynik;
}



String odbierz(String komenda,byte powtorzenia,byte czas){
String wynik="";
for(byte x=0;x<powtorzenia;x++){
	writeString(komenda);
	writeString("\r");
	Serial2.flush();
	int tim=czas*1000;
	char inChar;
	for(int i=0;i<tim;i++){
		while(Serial2.available()>0) {
			inChar = (char)Serial2.read();
			wynik.concat(inChar);
		}
		if(wynik.indexOf("OK\r\n")){
			return wynik;
			}else{
			if(wynik.indexOf("ERROR\r\n")){
				wynik="";
			}
		}
		czekaj(1);
	}
}
return wynik;
}

/*****pobieranie ilości znaków w pobranej stronie PACTEM*****/
int get_read_page(String odpowiedz){
int pocz = odpowiedz.lastIndexOf("<");
int kon = odpowiedz.lastIndexOf(">");
if(pocz<1 || kon<2){
	return 0;
}
if(pocz>=kon){
	return 0;
}
pocz++;
String tmp="";
for(int i=pocz;i<kon;i++){
	tmp+=odpowiedz[i];
}
return tmp.toInt();
}
/******************************************************/

/*****funkcja pobiera dane z serwera (stawienia) ta powyzej jest zła do ustawien*****/

String get_data_config_json(String adres){
String dane="{\"device\":790141753}";
return send_data(adres,dane);
}

/************************************************************************/

/******wyslanie danych na serwer****/
String send_data(String adres, String dane){
int dlugosc=0;
while(dlugosc==0){
	String odp=odbierz("AT+HTTPSET=\"URL\",\"http://"+adres+"\"",1,3);
	Serial.print(odp);
	odp=odbierz("AT+HTTPSET=\"UAGENT\",\"fibocom\"",1,3);
	Serial.print(odp);
	odp=odbierz("AT+HTTPSET=\"CONTYPE\",\"application/json\"",1,3);
	Serial.print(odp);

	odp=odbierz("AT+HTTPDATA="+String(dane.length()),1,3);
	Serial.print(odp);
	writeString(dane);
	odp=odbierz("\r",1,3);
	Serial.print(odp);

	odp=odbierz("AT+HTTPACT=1",1,10);
	Serial.print(odp);
	odp=odbierz_puste(20);
	Serial.print(odp);
	dlugosc=get_read_page(odp);
	Serial.println(dlugosc);
}
String dupa;
dupa=odbierz("AT+HTTPREAD=0,"+String(dlugosc),5,5);
dupa=odbierz_puste(10);
dupa=odbierz_puste(10);
return cut_to_json(dupa);
}

/********funkcja obcina stringa do samego jsona*****/
String cut_to_json(String obj){
int pocz=obj.indexOf('{');
int kon=obj.lastIndexOf('}');

if(pocz<1 || kon<2){
	return "";
}
if(pocz>=kon){
	return "";
}

kon++;
String biez;
String last=" ";
String wynik="";
for(int i=pocz;i<kon;i++){
	biez=obj[i];
	if((!(biez.equals(" "))) && (!(last.equals(" ")))){
		if((!(biez.equals("\r"))) && (!(last.equals("\n")))){
			wynik+=obj[i];
		}
	}
	last=biez;
}

return wynik;
}
/****************************************************/


void setup() {
pinMode(6,OUTPUT); //piny do załączania modułu gsm
pinMode(7,OUTPUT);

Serial.begin(19200);
Serial2.begin(19200);

Serial.println("Start Program");
GSMpower();

String odp=odbierz("AT",1,5);
Serial.println(odp);

czekaj(500);
Serial.println("Ĺ‚Ä…cze z internetami");
connect_to_internet();
}

void loop() {
odbierz("AT",1,5);
czekaj(1000);

String dane = get_data_config_json(String("http://adres_URL.com")); //pobranie ustawien z standardowego adresu ustawien
Serial.print("Dane odebrane: ");
Serial.println(dane);

czekaj(3000);

} 
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

Sprawdziłem tę funkcje, poprawiłem to tak:

String odbierz_puste(byte czas){
 String wynik="";
 char inChar;
 int tim=czas*1000;
 for(int i=0;i<tim;i=i+10){
      while(Serial2.available()>0) {
         inChar = (char)Serial2.read();
         wynik.concat(inChar);
      }
     if(!(wynik.indexOf("OK\r\n")<0)){
       return wynik;
      }
      else{
       if(!(wynik.indexOf("ERROR\r\n")<0)){
         wynik="";
       }
      }
      delay(10);
 }
 return wynik;
}

Lecz nie przyniosło to żadnego efektu... moduł podłaczyłem nawet do innej płytki arduino:P ale to też nic nie dało..

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.