Pages: 1 [2]   Go Down
Author Topic: [RESOLVIDO] ARDUINO UNO + IComsat v1.0 shield SIM900 GSM  (Read 8179 times)
0 Members and 1 Guest are viewing this topic.
'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3267
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3267
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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
}

Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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:
#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();
}
}
}
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Code:
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:
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(){
}
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3267
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3267
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Offline Offline
Newbie
*
Karma: 0
Posts: 14
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 42
Posts: 3267
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yeay, é para isso que cá estamos. smiley
Logged

Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

Pages: 1 [2]   Go Up
Jump to: