Go Down

Topic: [RESOLVIDO] ARDUINO UNO + IComsat v1.0 shield SIM900 GSM (Read 10849 times) previous topic - next topic

bubulindo

a biblioteca Serial já tem um buffer... O problema é definir exactamente onde começa a password. Se houvesse aspas antes da palavra senha (como acontece com a data e numero de telefone) seria mais simples de detectar isso. ;)

Isso que colocaste é um printout do que o módulo retorna se houver uma SMS?
This... is a hobby.

g7henrique


a biblioteca Serial já tem um buffer... O problema é definir exactamente onde começa a password. Se houvesse aspas antes da palavra senha (como acontece com a data e numero de telefone) seria mais simples de detectar isso. ;)

Isso que colocaste é um printout do que o módulo retorna se houver uma SMS?



Sim, isso é o retorno do módulo na porta quando há SMS.

Dados recebidos na porta gsm_com
========================================================
AT+CMGR=1

+CMGR: "REC UNREAD","8273xxx","","12/10/19,22:08:18-12"
SENHA

OK
========================================================

E se inserimos um caractér de controle (um @ que é 40 em
hexadecimal, não tenho certeza)?
A mensagem do SMS ficaria desta forma:

========================================================
AT+CMGR=1

+CMGR: "REC UNREAD","8273xxx","","12/10/19,22:08:18-12"
@SENHA@

OK
========================================================

Desta forma é possível?
Não escolhi as aspas por não encontra-las em alguns
modelos de celulares, mas pode ser uma opção.

Obrigado.

bubulindo

Ok... bom, podes contar o numero de aspas até à senha... ou ver quando é que é dado um \r ou \n.

Code: [Select]

while (Serial.read() != ','); //encontrar a virgula.

for (int i= 0; i <= 7; i++) {
   phone_number[i] = Serial.read(); //passar o numero de telefone para a variavel.
}

//encontrar o caracter de new line.
while (Serial.read() != '\n'); //aqui vais ter de experimentar para ver se o telemóvel envia \n ou \r.

//estamos prontos para testar a palavra passe...
char temp;

for (int i = 0; i <= 7; i++) { //a senha tem no máximo 8 caracteres.
   if ((temp = Serial.read()) != '\n') {  //aqui tambëm tens de ver qual e o caracter enviado...
       senha[i] = temp;
   } else {
      //senha encontrada
      //d\a um termino na string
      senha [i] = '\0';
      break; //sai do for
   }
}

if (strcmp ("SENHA", senha) == 0){
//password correcta
} else {
//password errada
}

This... is a hobby.

g7henrique


Ok... bom, podes contar o numero de aspas até à senha... ou ver quando é que é dado um \r ou \n.

Code: [Select]

while (Serial.read() != ','); //encontrar a virgula.

for (int i= 0; i <= 7; i++) {
   phone_number[i] = Serial.read(); //passar o numero de telefone para a variavel.
}

//encontrar o caracter de new line.
while (Serial.read() != '\n'); //aqui vais ter de experimentar para ver se o telemóvel envia \n ou \r.

//estamos prontos para testar a palavra passe...
char temp;

for (int i = 0; i <= 7; i++) { //a senha tem no máximo 8 caracteres.
   if ((temp = Serial.read()) != '\n') {  //aqui tambëm tens de ver qual e o caracter enviado...
       senha[i] = temp;
   } else {
      //senha encontrada
      //d\a um termino na string
      senha [i] = '\0';
      break; //sai do for
   }
}

if (strcmp ("SENHA", senha) == 0){
//password correcta
} else {
//password errada
}





Irei testar aqui.
Assim que tiver novidades te retorno.

Obrigado novamente.

g7henrique


Ok... bom, podes contar o numero de aspas até à senha... ou ver quando é que é dado um \r ou \n.

Code: [Select]

while (Serial.read() != ','); //encontrar a virgula.

for (int i= 0; i <= 7; i++) {
   phone_number[i] = Serial.read(); //passar o numero de telefone para a variavel.
}

//encontrar o caracter de new line.
while (Serial.read() != '\n'); //aqui vais ter de experimentar para ver se o telemóvel envia \n ou \r.

//estamos prontos para testar a palavra passe...
char temp;

for (int i = 0; i <= 7; i++) { //a senha tem no máximo 8 caracteres.
   if ((temp = Serial.read()) != '\n') {  //aqui tambëm tens de ver qual e o caracter enviado...
       senha[i] = temp;
   } else {
      //senha encontrada
      //d\a um termino na string
      senha [i] = '\0';
      break; //sai do for
   }
}

if (strcmp ("SENHA", senha) == 0){
//password correcta
} else {
//password errada
}




Modifiquei um código para que o arduino envie comando 'AT+CMGR=1' apenas quando a a tx do gsm enviar '+CMTI: "SM",1', mas qualquer coisa que chega na rx do arduino ele responde enviando 'AT+CMGR=1', no código abaixo troquei o comando pelo texto "CHEGOU SMS",

É possível fazer que uma parte do código espere que o módulo envie o comando '+CMTI: "SM",1' na porta rx do arduino e quando este comando chegar, e somente este, o código continua executando outra parte de código?

Code: [Select]

#include <SoftwareSerial.h> //Include the NewSoftSerial library to send serial commands to the cellular module.
#include <string.h>         //Used for string manipulations

char incoming_char=0;       //Will hold the incoming character from the Serial Port.

SoftwareSerial cell(2,3);   //Create a 'fake' serial port. Pin 2 is the Rx pin, pin 3 is the Tx pin.

void setup()
{
//Initialize serial ports for communication.
cell.begin(9600);

//Let's get started!
cell.println("Iniciando...");
}

void loop() {
//If a character comes in from the cellular module...
if(cell.available() >0)
{
if(cell.read() =='+CMTI: "SM",1'); //waiting sms from the cellular serial port. (GOSTARIA DE ESPERAR ESSE COMANDO E SOMENTE QUANDO CHEGAR PASSO A EXECUTAR O RESTO)
{
cell.println("CHEGOU SMS"); //Print text
cell.flush();
}
}
}

g7henrique


Ok... bom, podes contar o numero de aspas até à senha... ou ver quando é que é dado um \r ou \n.

Code: [Select]

while (Serial.read() != ','); //encontrar a virgula.

for (int i= 0; i <= 7; i++) {
   phone_number[i] = Serial.read(); //passar o numero de telefone para a variavel.
}

//encontrar o caracter de new line.
while (Serial.read() != '\n'); //aqui vais ter de experimentar para ver se o telemóvel envia \n ou \r.

//estamos prontos para testar a palavra passe...
char temp;

for (int i = 0; i <= 7; i++) { //a senha tem no máximo 8 caracteres.
   if ((temp = Serial.read()) != '\n') {  //aqui tambëm tens de ver qual e o caracter enviado...
       senha[i] = temp;
   } else {
      //senha encontrada
      //d\a um termino na string
      senha [i] = '\0';
      break; //sai do for
   }
}

if (strcmp ("SENHA", senha) == 0){
//password correcta
} else {
//password errada
}




Bubulindo;

Montei o código da senha, mas este não funciona, por favor, verifique meu código.
Obrigado.

Code: [Select]

char myStr[] = {"OK"};
char myCpy[2];
int i;

void setup(){
  char temp;
inicio:
  Serial.begin(9600);
  if (Serial.available() > 0) {
    for (int i=0; i <= 2; i++)
    {
      temp = Serial.read();   
      myCpy[i]=temp;}
      delay(100);
      if (strcmp (myStr, myCpy) == 0){
        Serial.println("Senha Correta");
      }
      else {
        Serial.println("Senha Errada");
      }
    }
  Serial.end();
  delay(100);
  goto inicio;
}
void loop(){
}

bubulindo

A mim sempre me disseram para nunca usar goto... O professor que o disse, apesar de saber de programação foi estúpido por não exemplificar porque não se devem usar gotos. Este é um exemplo perfeito.

Tens uma função chamada loop que corre indefinidamente, e em vez disso, preferes tornar o código mais complexo de ler com gotos?

Isto não é a mesma coisa?

Code: [Select]

char myStr[] = {"OK"};
char myCpy[2];
int i;

void setup(){

}
void loop(){
  char temp;
  Serial.begin(9600);
  if (Serial.available() > 0) {
    for (int i=0; i <= 2; i++)
    {
      temp = Serial.read();   
      myCpy[i]=temp;}
      delay(100);
      if (strcmp (myStr, myCpy) == 0){
        Serial.println("Senha Correta");
      }
      else {
        Serial.println("Senha Errada");
      }
    }
  Serial.end();
  delay(100);
}
????

Aqui vejo um erro... tu defines strings sem espaço para um caracter terminador \0... mas depois usas a strcmp que procura um caracter terminador para terminar a função. O que acontece com este código é que provavelmente crasha. Correcto?

Ou defines as strings com espaço para o terminador.... ou passas a usar a strncmp desta forma:

Code: [Select]
if (strncmp (myStr, myCpy,2) == 0){

O problema disto é que sempre que mudares a password, tens de te lembrar de mudar este número. Se definires os vectores com um espaço a mais, isso não será necessário.

This... is a hobby.

g7henrique

Troquei a forma de comparação de string pela qual você sugeriu, mas ainda não tive sucesso.
Também não entendi qual a forma correta de usar o strcmp.

Obrigado;

g7henrique


a biblioteca Serial já tem um buffer... O problema é definir exactamente onde começa a password. Se houvesse aspas antes da palavra senha (como acontece com a data e numero de telefone) seria mais simples de detectar isso. ;)

Isso que colocaste é um printout do que o módulo retorna se houver uma SMS?


Qual o tamanho desse buffer? só consigo capturar 64bytes da porta.
É possivel alterar o tamanho do buffer para 128 ou 256 bytes?

Obrigado

bubulindo

Não é aconselhado porque senão corres o risco de ficar sem memória.

This... is a hobby.

g7henrique

Muito obrigado Pessoal!

Meu rastreador GPS está funcionando.

Ainda falta fazer alguns poucos ajustes no meu código para remover alguns bugs e crashes, mas são apenas detalhes.
Assim que terminar vou postar o código inteiro, conforme prometi.

Bubulindo e HugoPT,
Obrigado por toda ajuda e pela paciência.

Também quero deixar meus parabéns a todos os colaboradores da comunidade que movem e compartilham conhecimento e informações.

Valeu!!!


bubulindo

This... is a hobby.

Go Up