Uso de un celular GSM con PIC o PC

Muchas gracias, voy a probar y ver que resulta, tb voy a probar con otro pic, a seguir intentando no mas a que resulte :p
Aviso mis resultados :)
 
Mal me a ido no e podido enviar obtener una salida, conecte Vss y Vdd. cristal de 20Mhz. Visualizo la señal en un osciloscopio y no obtengo salida al presionar el pulsador. Tengo una fuente regulada a 5 volt y en la salida del pic tb 5 volt pero como un tren de pulso .
Algo que me falte? ayuda!
:)
 
Hola chicos!
Estuve tratando de comunicarme con un Nokia 2760 a traves del Hyperterminal, pero no tuve suerte.
Conecte los pines FbusTx, FbusRx y GNC a los correspondientes al circuito que tiene el MAX232, pero en el Hyperterminal no veo nada de lo ke escribo...Y despues de un tiempo de intentar se clava el programa y tengo ke volver a abrirlo.
Primero probé escribiendo AT, despues ATE, despues apretando solo ENTER para ver si obtenia alguna respuesta..pero nada!!
Alguno que haya tenido una experiencia como esta podría darme algún consejo?
Muchas gracias!
Miguel
 
Gonxalo, que estás intentando?? que es lo que quieres hacer?
Qete, puede ser que tengas conectados al revez los pines del Cel o que no configures de manera correcta el hyperterminal juega con los baudios y checa que tengas 8bits de datos, sin paridad, 1bit de STOP y el control de flujo desactivado.
Saludos
 
Hola ericklarva, mucha gracias por tu respuesta!
Ya probé con todas la velocidades que hay disponibles, las otyras configuraciones están como me aconsejaste, tambien probe el puerto para descartar que éste estuviera quemado y las conexiones Tx y Rx del puerto al celu están bien....lo mismo me pasó con un Siemens A56.
No se que puede ser...medi los niveles de tension a la salida del puerto y del circuito con el MAX232 y esta todo dentro de los parámetros!!
PAra que se conecte el cel solo tengo que conectar los cables Rx, Tx y GND, verdad?
Muchas gracias a todos!
Miguel
 
En teoría así es pero para que quede claro que está mal, conecta el TX y RX que van al Cel en "corto" o puenteados como lo quieras entender, une los cables y envía datos del hyperterminal, deberan retornar los caracteres si el circuito está correctamente armado. Si tu escribres caracteres y estos no aparecen en la pantalla haciendo la unión, significa que algo no está bien en tu MAX o en tu cable COM. Checa esto primero que es muy importante y comentas.
Saludos
 
Gracias a todos lo que han aportado en el foro,

Ya estoy enviando mensajes de texto con arduino y un viejo t637 que tenia por ahi dando vueltas... la conexion la he hecho directa del arduino al celular y todo ha funcionado muy bien.
quiero compartir con uds el codigo, se basa en una libreria que se llama sserial2movile es facil de encontrar con google y newsoftserial de la misma procedencia.

se que se pueden hacer mas cosas con esto... pero por lo pronto se cumple lo que esperaba, gracias a todos por la colaboracion y con sus recomendaciones,

tambien queria contarle que probé con hyperterminal con 9600baudios y el resto por defecto, control de flujo hardware... en fin todo lo recomedado. :D

adjunto el codigo

Francisco desde colombia

Código:
#include <SSerial2Mobile.h>
#include <NewSoftSerial.h>
#define RXpin 10
#define TXpin 11 
#define ACTIVADApin 9  //sirena
#define ARMADApin 8 //boton de panico

int armada = 0;
int returnVal=10;
    SSerial2Mobile phone = SSerial2Mobile(RXpin,TXpin);

void setup(){

  phone.sendTxt("300xxxxxxxx","Alarma REINICIADA");
  phone.sendTxt("31xxxxxxxxx","Alarma REINICIADA");
  delay(3000);
pinMode(9, INPUT);
pinMode(8, INPUT);
}
void loop(){
  
  if(ACTIVADApin==0){
    phone.sendTxt("300xxxxxxx","Alarma SONANDO!");
    phone.sendTxt("317xxxxxxx"," Alarma SONANDO!");
    delay(3000);
  }
  if(ARMADApin==0){
    phone.sendTxt("300xxxxxxx","Alarma PANICO!");
    phone.sendTxt("317xxxxxxx","Alarma PANICO!");

    delay(3000);
  }
 

}
 
Hola amigo sucede que se me hace dificil leer un sms con formato pdu desde un pic ..el cel es un siemens a56 el envio es bárbaro pero para leer me quiebra la cabeza .Yo pensaba que era facil solo de captura el ultimo byte (ya que lo mismo funciona con un nokia en formato texto)peo con el siemens se comporta extraño el envio pdu.
ejemplo realizado:
07450b345670000xxxxxxB0A1041
41 corresponde a la letra A

LO facil seria a pues facil despues de los 27 caracteres tomo el 41 y listo pues eso pense y nunva recibo el 41 .
include modedefs.bas
dat var byte(50)
lo var byte
co var byte ;counter
co=0

ini:
serin portb.0,n9600,lo
dat(co)=lo
if co>=50 then env
co++
goto ini

env:
pause 10
for co=0 to 49 step 1
serout portb.1,n9600,(#dat(co),dat(co)) ;data are lost .41 is not shown on pc
pause 2
next co
goto ini

Si conecto el cel con la pc atarves de la interfaz si funciona recibo :
07450b345670000xxxxxxB0A1041
pero con el pic no.

Gracias a todos de antemano.
 
Hola a todos , en esta ocación les traigo un fragmento de código en el cuál se muestra como leer una trama de datos desde un modem GSM para poder realizar acciones según la información contenida en un mensaje de texto.
El código no lo he probado pero está completo y debería funcionar...si alguien lo puede probar y postear resultado estaría buenismo. :D

Código:
#include <18f2550.h>
#fuses hs,noprotect, mclr,nowdt
#use delay(internal=4M)//delay(clock=4000000)k
#use rs232(baud=9600, xmit=PIN_c6,rcv=PIN_c7,STREAM=MODEM)
#use rs232(baud=9600, xmit=PIN_B5,rcv=PIN_B6,STREAM=DEVICES)
#use rs232(baud=9600, xmit=PIN_c0,rcv=PIN_c1,STREAM=MASTER)
#include <string.h>
#include <math.h>
//#include <input.c>
#define mensaje pin_a0
#define relay   pin_a1
#define RESET  pin_a2
#define ALARM pin_b3
#define on output_high
#define off output_low
//#priority EXT1,RDA
/////////////////////////////////////////////////////////////////////////////////////////
INT STRING[300]="                            ",modo=0,dispositivos[]="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0",num[]="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0";
INT OK[]="OK",ERROR[]="ERROR",RING[]="RING",CMTI[]="+CMTI:",ON[]="ON",OFF[]="OFF",ESTADO[]="DISPOSITIVOS?",VARIABLES[]="VARIABLES?",varis[]="voltaje=0,temperatura=0,pocicion=0";
int1 listo=0,captura_cadena=1;
char a=0,b=0,s0[]="off",s1[]="off",s2[]="off",s3[]="off";
int x,estado_dispositivo,FOCOS=0;
//////////////////////////////////////////////////////////////////////////////////////
const int mensaje_leido=1,RESETEAR=2;
//////////////////////////////////////////////////////////////////////////////////////
int1 verificar_estado(int estados,int disp);
void asignar_estados(char modo);
int1 verificar_falla(int cont);
//////////////////////////////////////////////////////////////////////////////////////
VOID MAIN()
{
enable_interrupts(int_rda);
enable_interrupts(int_ext1);
enable_interrupts(int_ext2);
enable_interrupts(global);
ON(RESET);
for(x=0;x<16;x++)
num

    * =read_eeprom(x);

CICLO:

GOTO CICLO;
}
//////////////////////////////////////////////////////////////////////////////////////////
#int_rda
void capturar()
{
if(kbhit()!=0)
fgets(string,modem);
 if(strcmp(string,RING)==0)
  {
 fputs("ATA",modem);
  on(relay);
  }
else if((strncmp(string,ON,2)==0)||(strncmp(string,OFF,3)==0))
  {
  if(strncmp(string,ON,2)==0)
    dispositivos[0]='A';
  else if(strncmp(string,OFF,3)==0)
    dispositivos[0]='B';
    for(x=1;x<12;x++)
    dispositivos

    * =0;

    for(x=1;x<12;x++)
       {
       dispositivos

    * =string
    * ;

       }
       MODO=MENSAJE_LEIDO;
  }
else if(strcmp(string,OK)==0)
  {
  output_high(pin_b7);
  switch(modo)
    {
    case mensaje_leido:
         for(x=0;x<12;x++)
         fputc(dispositivos

    * ,devices);

         delay_ms(610);
       /*  if(!verificar_falla(11))
         goto MEN;*/
         fputs("AT+CMGD=1,4",modem);///////////////////////////borra los mensajes leidos
         modo=resetear;
         off(mensaje);       
         break;
    case RESETEAR:
      if(listo==1)
         {
          modo=0;
          captura_cadena=0;
          if(focos==1)         
          asignar_estados(';');   
          else if(focos==2)
          asignar_estados('*'); 
          MEN:
          fprintf(modem,"AT+CMGS=\"%s\"%c",num,13); 
          delay_ms(1000);         
          if(focos==1)
          fprintf(modem,"foco0=%s;\nfoco1=%s;\nfoco2=%s;\nfoco3=%s%c",s0,s1,s2,s3,26);
          else if(focos==2)
          fprintf(modem,"%s%c",varis,26);         
          focos=0;         
         }
         delay_ms(300);
         listo=0;
         off(reset);                         
         break;
    }
  }
else if(strcmp(string,ERROR)==0)
 {
  output_low(pin_b7);
  off(mensaje);
 }
else if(strncmp(string,CMTI,6)==0)
  {
  a=b=0;
  a=string[12];
  b=string[13];
  fprintf(modem,"AT+CMGR=%c%c%c",a,b,13);
  modo=mensaje_leido;
  on(mensaje);
  }
else if(strcmp(string,ESTADO)==0)
  {
  listo=1;
  FOCOS=1;
  }
 else if(strcmp(string,VARIABLES)==0)
  {
  listo=1;
  FOCOS=2;
  }
}

///////////////////////////////////////////////////////////////////////////////////////////
#INT_EXT1
void alarma()
{
if(input(alarm))
{
fputs("AT",modem);
delay_ms(200);
fprintf(modem,"ATD%s;%c",num,13);
delay_ms(9000);
fputs("ATH",MODEM);
delay_ms(300);
OFF(RESET);
}
}
//////////////////////////////////////////////////////////////////////////////////////////
#INT_EXT2
void actualizar()
{
char comand=0;
comand=fgetc(master);
if(comand==10)
 {
  fgets(num,master);
  for(x=0;x<16;x++)
  write_eeprom(x,num

    * );

}
if(comand==11)
 {
  fgets(dispositivos,master);
  for(x=0;x<2;x++)
   fputc(dispositivos

    * ,devices);

}

delay_ms(100);
OFF(RESET);
}
//////////////////////////////////////////////////////////////////////////////////////////
int1 verificar_estado(int estados,int disp)
{
 int resultado=0;
 int1 bool=0;
 int and=0;
 resultado=pow(2,disp);
 and=estados&resultado;
 if(and==resultado)
 bool=1;
 else
 bool=0;
 return bool;
}
/////////////////////////////////////////////////////////////////////////////////////////
void asignar_estados(char modo)
{
estado_dispositivo=0;
    fputc(modo,devices);
    if(modo=='*')
    fgets(varis,devices);
    else if(modo==';')
        {
         estado_dispositivo=fgetc(devices);         
         for(x=0;x<4;x++)
         {
          switch(x)
          {
          case 0:if(verificar_estado(estado_dispositivo,x)==1) strcpy (s0,ON);               
                 else strcpy (s0,OFF);
               break;
          case 1:if(verificar_estado(estado_dispositivo,x)==1) strcpy (s1,ON);               
                 else strcpy (s1,OFF);
               break;
          case 2:if(verificar_estado(estado_dispositivo,x)==1) strcpy (s2,ON);               
                 else strcpy (s2,OFF);
               break;
          case 3:if(verificar_estado(estado_dispositivo,x)==1) strcpy (s3,ON);               
                 else strcpy (s3,OFF);
               break;         
          }
         }         
      }
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
int1 verificar_falla(int cont)
{
int1 res=false;
int y;
fputc(';',devices);
estado_dispositivo=fgetc(devices);
for(y=1;y<cont;y++)
  {
  if((dispositivos[y]>='0')&&(dispositivos[y]<='9'))
    {
     if(verificar_estado(estado_dispositivo, dispositivos[y]-48)&&dispositivos[0]=='A')
      res=true;
     else if(!verificar_estado(estado_dispositivo, dispositivos[y]-48)&&dispositivos[0]=='B')
      res=true;
     else
     {
     res=false;
     goto salir;
     }
    }
  }
  SALIR:
return res;
}
El código lo encontré navegando en la red...no se su autor pero en cuanto lo encuentre lo pongo.(y)
 
Bueno acabo de hacer las pruebas con resultados satisfactorio pero a la vez extraños
http://img17.imageshack.us/i/hyperterminal.jpg/
+CPMS: 0,70,19,20,0,70 que significan esos caracteres ?


Saludos cordiales,
He intentado leer un mensaje desde el celular (mensajes no leídos “unread”) con el hiperterminal siguiendo los mismos pasos que realizaste tu en la pantalla que aparece aquí, pero el resultado es el mismo que tienes tu en esa pantalla, no se como lograste leer el mensaje de texto mediante la orden at+cmgl="rec unread", es decir, en tu siguiente comentario: "Listo ya mandé un mensaje al T237 y lo pude leer con el comando at+cmgl="rec unread".”, quisiera saber como lo hiciste porque yo he intentado 14 mil veces leer los mensajes que llegan al celular (no leídos “unread”) y no he podido, mas si he logrado leer los que ya están leídos “read”, los que no se han enviado y cualquier otro, menos los que llegan. Que puedo estar haciendo mal específicamente con esta orden, por que cualquier otra orden al celular mediante comandos at la ejecuta satisfactoriamente.

Muchas gracias de antemano.
 
Hola, luego de mucho andar logre leer con el micro cualquier cosa que envie el moden . El metodo que emplee fue leer en tiempo real, osea no lo guardo en memoria como lo hacia rizy en su codigo sino que mientra recibo la cadena de caracteres la voy analizando. En esta oportunidad les cuelgo el primer codigo que me funciono. El codigo esta hecho en asm ya que nunca logre adaptarme del todo al C supongo que algun dia lo are.
Luego les cuelgo el que emplea un moden gsm y un gps, pero el principio es el mismo que emplee en este.
 

Adjuntos

  • pager.txt
    15.5 KB · Visitas: 201
Hola a todos.... he trabajado un tiempo con el envío y recepción de SMS, usando un celular Sony Ericsson T630 y un micro... todo de maravilla. La cosa es que ahora debo ir un poco más allá, y hacer la transmisión de la información haciendo uso del GPRS, alguien tiene idea de por donde empezar?
De antemano, gracias
 
stich como estás...si tenés tiempo nos pondrías como hiciste para poder decodificar los mensajes del T237 ...yo puse un código más arriba pero me gustaría tener una opinion de alguien que lo haya probado.
 
Hola, a ver estoy usando un sony Ericsson t290 (porq lei or aki que aceptaba modo texto), y bueno, desde terminal de windows envio y leo mensajes. Me puse entonces ha hacerlo desde el pic.. y envio mensajes sin ningun problema.. pero lo que no consigo es leerlos. He partido del codigo que puso moyano y na de na. A ver os pongo lo que hago:

PHP:
void leerSMS(char* cadena)
{
   fputs("AT+CPMS=\"ME\",\"ME\",\"ME\"\r\n",modem);//Establezco todas las memorias del telefono, no de la SIM    //ok
   delay_ms(300);
    fputs("AT+CMGF=1\r\n",modem);//configura modo texto
    delay_ms(300);
    fputs("AT+CMGR=1\r\n",modem);//leo mens de posición 1 modo texto
    delay_ms(300);
   //Aqui ya me devuelve el mensaje
    if(kbhit(modem)!=0){
    fgets(cadena,modem); //Aqui se me queda colgado
   }

Como pongo el el codigo, en fgets, se me queda colgado, entonces coloque fgetc(), y me devuelve primero una A luego una T(poniendo dos seguidos), y si coloco otro.. se cuelga.

Alquien ha conseguido leer?? En principio no estoy usando interrupciones 


En mi desesperación tambien intente con interrupción del siguiente modo:
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7, STREAM=modem)
int8 posLCD;

//Defino interrupción
#int_rda
void serial_isr() {
  int8 caracter=0x00;
  if(kbhit(modem)){
    caracter=getc();
    if(posLCD==16)
      posLCD=1;
    lcd_gotoxy(posLCD,2);
    printf(Lcd_putc, "%c",caracter);
    posLCD++;
    }
  }

void main(void){
enable_interrupts(global);
  enable_interrupts(int_rda);
leerSMS(texto);
while(true){}
}

void leerSMS(char* cadena)
{
   fputs("AT\r\n", modem);
}

y con todo esto, se me muestra en la lcd unicamente AT (que supongo q es el echo del telefono), pero no se me muestra OK, q devuelve cuando hago lo mismo con Hiperterminal.
Alguna idea?
 
Última edición por un moderador:
EDITO:
Me voy a responder a mi mismo, buscando y buscando vi que el RS232 del pic tiene un buffer de dos caracteres, por lo tanto, necesito del uso de interrupciones.
El codigo de interrupciones que postee anteriormente, tengo codigo para que me muestre por pantalla lcd a traves de I2C el codigo leido, lo cual supongo crea un retardo muy grande, que era el problema(no le daba tiempo a recoger todos los caracteres).
Solución: creo una variable char buffer[300]; y voy añadiendo al final lo que me llega al saltar la interrupción.
 
Buenas a todos. Os expongo mi duda. Estoy tratando de hacer un sistema de comunicación PIC-móvil. El tema sería que un usuario mandase un SMS a una estación meteorológica de manera que fuera un mensaje predeterminado. Por ejemplo, si el usuario mandase un SMS con la palabra 'Humedad'. El sistema electrónico respondería enviándole los datos de humedad. Si el usuario mandase 'Temperatura', el sistema enviaría los datos de temeperatura y así... Si el usuario mandase algo, fuera de los mensajes predeterminados, el sistema no respondería.
Ahora viene mi duda, que es como podría hacer para diferenciar esos mensajes. Estoy utilizando los comandos AT y programando en ensamblador. ¿Hay algun comando que te permita diferenciar mensajes o algo así?

Perdón pero tengo bastante desconocimiento sobre el tema porque estoy empezando con esto. Si alguien pudiera darme una idea o pegarme alguna programación similar o algo, sería de agradecer.

Gracias de antemano por la ayuda! Saludos!
 
El modem responde con el mensaje en formato ascii... asique solo seria de hacer comparaciones de letras para reconocer el comando... algo muy facil de hacer

Primero manda el mensaje recibido a una variable tipo string y despues solo comparala con cases... por ejemplo

Código:
switch(strValue)
{
  case "Value X":
    DoThis();
    break;
  case "Value Y":
    DoThat();
    break;
  case "Value Z";
    DoSomethingElse();
    break;
  default:
    DontKnowWhatToDo();
    break;
}

obvio el ejemplo es general y habria que adecuarse al tipo de programacion que uses... algunos compiladores no soportan comparacion de cadenas en el Switch por lo que tendrias que usar sentencias IF
 
Tampoco creo que hayan compiladores de C que soporten if(algo == "asd") (donde algo es un array de chars)

Una solución es strcmp(f1,f2), que devuelve 0 en caso de que dos cadenas sean iguales.

Si tu compilador no lo incluye en sus librerías, quizás necesites implementarlo.

Saludos,
Gonzalo
 
Atrás
Arriba