Go Down

Topic: Gestire messaggi di risposta da modulo GPRS. (Read 547 times) previous topic - next topic

alearc

Ciao a tutti,
spero tanto che mi possiate essere d'aiuto.
Desidero gestire i messaggi di risposta provenienti da un modem GPRS (http://www.cooking-hacks.com/index.php/shop/arduino/shields/arduino-gprs-module.html) collegato al mio Arduino Uno.
L'obiettivo è quello di inviare un qualunque comando "AT" attendendo e catturando la corrispondente risposta da parte del modem. Molti sketch che ho trovato in rete fanno uso di semplici delay senza analizzare il contenuto della risposta fornita dal dispositivo.
Accludo al messaggio il codice di esempio che non riesco a far funzionare. Il codice mi restituisce l'eco della seriale che utilizzo per il monitor. Dov'è che sbaglio???
Grazie in anticipo!

Alessandro

Codice:

#include <SoftwareSerial.h>

const int rxpin = 1;
const int txpin = 2;

SoftwareSerial gsm = SoftwareSerial(rxpin, txpin);

int onModulePin = 2;

void setup()
{
  Serial.begin(9600);
  delay(2000);
  gsm.begin(9600);
  delay(2000);
 
  switchModule();
  for (int i=0;i<2;i++)
  delay(20000);
 
  Serial.print("Modulo acceso...");
}

void loop()
{
  gsm.println("AT");
  while(gsm.available())
  {
    Serial.write((byte)gsm.read());
    Serial.println();
    delay(500);
  }
}

void switchModule()
{
  digitalWrite(onModulePin,HIGH);
  delay(2000);
  digitalWrite(onModulePin,LOW);
}

alearc

Ciao a tutti,
in questi giorni ho eseguito ulteriori prove sull'argomento.
Sono riuscito a trovare in rete una piccola funzione che ahime non funziona!
Ma è possibile che non si riesca a catturare e gestire le risposte provenienti da un modem?
E' possibile che sia un problema di condivisione della seriale/usb?
Grato in anticipo a chiunque possa aiutarmi (spero tanti :-)).
Ciao

Alessandro

P.S.: qui di seguito ulteriore codice dal quale non riesco ad avere nessun feedback dal modem.

   int led = 13;
   int ad = 0;
   int onModulePin = 2;        // the pin to switch on the module (without press on button)

   int timesToSend = 1;        // Numbers of SMS to send
   int count = 0;
   #define LINEBUF_SIZE 10
   #define INLENGTH 16
   char inString[INLENGTH+1];
   int inCount;
   int i = 0;
   char databuffer[LINEBUF_SIZE];

void switchModule()
{
  digitalWrite(onModulePin,HIGH);
  delay(2000);
  digitalWrite(onModulePin,LOW);
}

void setup()
{
  pinMode(led, OUTPUT);
  pinMode(onModulePin, OUTPUT);
 
  Serial.begin(9600);               // the GPRS baud rate
     
  switchModule();                    // swith the module ON
  for (int i=0;i<2;i++)
  {
    delay(20000);
  }
}

void loop()
{
  digitalWrite(led,HIGH);
  ad=SendGsmCommand("AT\r\n",2,databuffer);
  if (ad > 0)
  {
    digitalWrite(led,LOW);
  }
  delay(5000);
}

int SendGsmCommand(char *command, int size, char *lineArray)
{
  int success = false; 
  int c;
  byte i;
 
  //initialize the rx_buff to nulls
  i = 0;
  while (i < size)
  {
    lineArray = 0; 
    i++;
  }
  // flush the rx serial buffer
  // Serial.flush();
  while (Serial.available())
  {
    c = Serial.read();
    delay(200);
  }
  //  delay(50);

  Serial.println(command);       // send the command to the modem

// fill the rx_buff with characters until a OK or ERROR or '>' is read
  i = 0;
  int timeout = 1200; //WAIT 24 SECONDS (1200 * 20)
  boolean eol = false;

  while (timeout > 0 && i < size && eol == false)
  {
    if (Serial.available() > 0)
    {
      c = Serial.read();
      lineArray = c;
      if ((char)c  == 'K')
      {
        if ((char)lineArray[i-1] == 'O')
        { //OK
          lineArray[i+1] = 0;  //terminate the buffer with a NULL
          success = true;
          eol = true;
        }
      }
      if ((char)c  == 'R')
      {
        if ((char)lineArray[i-1] == 'O')
        { //ERROR
          lineArray[i+1] = 0;
          success = false;
          eol = true;
        }
      }
      if ((char)c  == '>')
      {
        lineArray[i+1] = 0;
        success = -10;
        eol = true;
      }
      i++;
    }
    else
    {
      delay(20); //give chars a chance to come in
      timeout--;
    }
  }
return success;
}

alearc

Ciao a tutti,
problema risolto.
Il modulo della Libelium (GPRS Quadband Module for Arduino - HiLo/Sagem) richiede necessariamente l'applicazione del condensatore elettrolitico da 220 µF come richiesto dal fornitore. Il modem si spegne durante alcune fasi di tx in rete, e comunque quando si verifica per un'istante un picco massimo di richiesta di corrente.
Un saluto.

Alessandro

Go Up