COMO HACER UNA CONEXIÓN ENTRE UN PIC Y UN MODEM GSM ENVIANDO Y RECIBIENDO ORDENES POR MEDIO DE MENSAJES DE TEXTO aplicación útil para telemetría, monitoreo, Smart Grid, alarmas, control remoto.

Para lograr esto necesitas entender dos cosas:

Primero Como funcionan las ordenes de modem AT para GSM

Segundo necesitas apropiarte del tema de las tramas de comunicación para Mensajería de texto PDU  PDU  PDU y Opcionalmente GPRS cuando se trabaje con monitoreo en tiempo real vía web

Leer sobre módems

las ordenes AT son las ordenes que suelen usar los módems para comunicarse en el caso de módems GSM o en teléfonos celulares hay pequeñas variaciones que se consultan en los manuales propietarios de empresas de módems GSM como siemens Nokia Sony,etc

En este caso desarrollare las aplicaciones utilizando un económico teléfono celular siemens c56 y compatibles como A56i, c55, también puedes usar celulares Nokia con modem. como procesador usaremos pics de microchip, y los cables del modem se fabrican según los esquemas de pinouts.ru para el celular que uses y tenga modem operativo vías rs323 no sirven celulares con modem USB o bluetoot, ya que no pretendemos trabajar es esos formatos.

Para saber que el modem sirve para esa aplicación debemos hacerle una prueba, instalada la sim card y habiéndose enlazado a la red de telefonía celular previamente se verifico lad banda de frecuencia de tu operador local activas alguna aplicación que te permita monitorear un puerto serial puede ser hiperterminal de windows, movilon, o el monitor de puerto serie de Protón plus compiller, lo configuras en el canal serial que desees o se te permita hacerlo no debes preocuparte por los baudios ya que las comunicaciones con estos módems soportan autodetecion de baudios ósea autobaudios.

escribes AT y das enter si el modem responde con OK es funcional de lo contrario verificar conexiones y si esto definitivamente no es descartarlo y usar otro tipo de modem o celular.

Debes ser cuidadoso con la interface serial del PIC al MODEM generalmente esa interfaz trabaja a 3.1 V y el pic a 5.0 voltios deberás diseñar o consultar un circuito para esto como lo propone la pagina de goofy mas abajo o trabajar el PIC a 3.1v si el modelo elegido de PIC lo soporta.

Los programas deben funcionar de la siguiente forma

Inicializar el modem gms

luego el procesador debe estar atento a una llamada entrante Generalmente se hace esto atendiendo una interrupcion de entrada a la usart, una ves se de un mensaje entrante se decodifica y se genera una orden local puede ser activar un relevo o carga o solicitar un servicio puede ser devolver un dato como un voltaje valor analógico status del sistema o hasta coordenadas de un GPS.

También el sistema debe atender ordenes locales y enrutarlas por el modem al celular del usuario en cualquier lugar del mundo

Un Ejemplo de código escrito en PROTÓN PLUSS COMPILLER (BASIC)

inicialmente configuramos alarmas e interrupciones y el procesador elegido

Device = 16F88

On_Hardware_Interrupt GoTo INTER

Xtal = 4

Config MCLRE_OFF, WDTEN_OFF, PWRT_ON, FOSC2_ON, FOSC1_OFF, FOSC0_OFF, LV_OFF, CP_ON, DEBUG_ON, CPD_OFF

Symbol GIE = INTCON.7

Symbol PEIE = INTCON.6

Symbol INTE = INTCON.4

Symbol RBIE = INTCON.3 _

Symbol INTF = INTCON.1

Symbol RBIF = INTCON.0

Symbol RCIE = PIE1.5

Symbol entrada1 = PORTB.7

Symbol entrada2 = PORTB.6

Symbol TX = PORTB.4

Symbol RX = PORTB.3

Symbol P1=0

Symbol P2=1

Symbol puerto1 = PORTB.0

Symbol puerto2 = PORTB.1

Symbol led_rojo = PORTA.2 ;falla Modem

Symbol led_verde = PORTA.3 ;comunicando pasword ok

Symbol led_azul = PORTA.4 ;falla GPS

Symbol sw1 = PORTA.5

Symbol sw2 = PORTA.1

Symbol buz = PORTA.0

Symbol RCIF = PIR1.5 ' Alias RCIF (USART Receive Interrupt Flag)

Symbol OERR = RCSTA.1 ' Alias OERR (USART Overrun Error Flag)

Symbol CREN = RCSTA.4

GoTo SALTO

LUEGO ESCRIBIMOS LA INTERUPCION

INTER: If RBIF = 1 Then

GoSub alarmas

EndIf

RBIE = 1

RBIF = 0

Context Restore

CONFIGURAMOS EL PIC Y USART

SALTO: OPTION_REG = %00000000

INTCON = %10001000

Hserial_Baud = 2400 ' Set baud rate to 9600

Hserial_RCSTA = %10010000 ' Enable serial port and continuous receive

Hserial_TXSTA = %00100000 ' Enable transmit and asynchronous mode

Hserial_Clear = On ' Optionally clear the buffer before receiving

TRISB = %11001100

TRISA = %00000000

CCP1CON = %00000000

ANSEL = %00000000

ADCON0 = %00000000

CMCON = %00000111

OSCTUNE = %00000000

WDTCON = %00000000

OSCCON = %01100010 'Internal RC set to 4MHZ

PORTA=0

DelayMS 100

PORTA=0

PORTB=0

Low buz

DECLARAMOS TODAS LAS VARIABLES DEL SISTEMA

Dim MSGLEN As Byte

Dim LENPACK As Byte

Dim RESI As Byte

Dim TELNULL As Byte

Dim i As Byte

Dim X As Byte

Dim Y As Byte

Dim Z As Byte

Dim j As Byte

Dim K1 As Byte

Dim K2 As Byte

Dim AUX1 As Byte

Dim AUX2 As Byte

Dim AUX3 As Byte

Dim DS[26] As Byte

Dim DEN[26] As Byte

Dim LONG As Byte

Dim TEL[10] As Byte

Dim cor[26] As Byte

Dim sat[2] As Byte

Dim compare[3] As Byte

Dim tiempo As Word

Dim temporal As Byte

Dim temporal1 As Byte

Dim baudios As Word

Dim brillo As Byte

Dim led_gps As Byte

Dim FALLA As Byte

Dim PU1 As Byte

Dim PU2 As Byte

FALLA =0

tiempo = 1

Dim HAYGPS As Byte

SE ESCRIBEN DATOS FUNDAMENTALES EN LA EEPROM

EData "Pas0000","On1","On2","On3","Of1","Of2","Of3"

EData "1371998863","Gps","Buz","A,0614.4903,N,07536.7776,W" ; A,0614.4903,N,07536.7776,W

; Codificada---------------------- 4116CC16A3B96839D88CE564C16EB599CD75BBDD6CAC2B

 

GoSub LEER_TEL ;carga el ultimo telefono guardado en la eprom "1371998863"

GoSub testGPS

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;DETECTAMOS SI EL MODEN ESTA BIEN O GENERAMOS ERROR DE COMUNICACION

;TAMBIEN HACEMOS LA CONFIGURACION INICIAL

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

GoSub recuperar ;lee las ultimas cordenadas almacenadas en la EEPROM

inicio: HSerOut ["AT",13,10] ;atencion!

HSerIn 1000, BAD, [Wait("OK")] ;no le responde el modem salta a BAD y en bad se actva los led rojo

DelayMS 100

HSerOut ["AT+CNMI=1,1",13,10] ;configuracion inicial

DelayMS 100

HSerOut ["AT+CMGF=0",13,10] ;modo PDU

DelayMS 100

HSerOut ["ATE",13,10] ;SIN ECO

DelayMS 100

HSerOut ["CBST=0,0,1",13,10] ;AUTOBAUDIOS,ASINCRONICO

DelayMS 100

;**************************************************************************************

;HSerOut ["AT+CMUT=1",13,10]

;HSerOut ["AT+CMVIB=0",13,10]

;SE DEBE HACER ACTIVACION INICIAL

;la alarma debe ser activada la primera vez por el usuario

;PARA ASIGNAR UN PASSWORD Y NUMERO TELEFONICO AL SISTEMA

;****************************************************************************

PRINCIPAL: GoSub RECIBIR ; este es el ciclo inutil

Toggle led_verde

If HAYGPS = 1 Then

Low led_azul

Else

High led_azul

EndIf

GoTo PRINCIPAL

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;DETECTAMOS UNA POR UNA CADA UNA DE LAS ORDENES PARA EJECUTARLA

; apartir de aca se aprueba la operacion de la alarma

; identificacion de los mensajes se inicia aca

ORDENES: ; PRIMERA ORDEN: es cambiar el password

For i = 0 To 2 ; detecta orden cambiar de paswword y telefono

temporal1 = ERead i

If DS [ i ] <> temporal1 Then

GoTo ST1 ; se va a buscar otra orden.. ESTA NO FUE

EndIf

Next ; hasta aca OK

GoSub SAVE_PASS ;SALVA PASWOR Y TELEFONO DEL OPERADOR CELULAR TRANSMISOR

HSerOut[Str TEL,"-",Str DS]

Return

;---------------------------------------------------------------

;ESTA ES LA ORDEN DE comparar los passwords PARA CONTINUAR

ST1: j = 0

For i = 0 To 3

j = i + 3

temporal1 = ERead j

If DS[j] <> temporal1 Then

High led_rojo

Return

EndIf

Next

Low led_rojo

High led_verde

;HSerOut ["okkk"] ; pasword correcto , enviamos esto al puerto para probar el sistema

;okkkkkkkkkkkkkkkkkkkk

For i = 0 To 2 ; detecta activar puerto1

compare [i] = ERead i + 7

If DS [i] <> compare [i] Then

GoTo st2 ;VA A BUSCAR OTRA ORDEN

EndIf

Next

PU1 = 1

If PU2=1 Then

PORTB=%00000011

Else

PORTB = %00000001

EndIf

Return

;-----------------------------------------------------------------

st2: For i = 0 To 2 ; detecta activar puerto 2

compare [i] = ERead i + 10

If DS [i] <> compare [i] Then

GoTo st4 ;BUSCA OTRA ORDEN

EndIf

Next

PU2 = 1

If PU1=1 Then

PORTB=%00000011

Else

PORTB = %00000010

EndIf

Return

;-----------------------------------------------------------------

;-----------------------------------------------------------------

st4: For i = 0 To 2 ; detecta apagar puerto1

compare [i] = ERead i + 16

If DS [i] <> compare [i] Then

GoTo st5

EndIf

Next

PU1 = 0

If PU2=1 Then

PORTB = %00000010

Else

PORTB = %00000000

EndIf

Return

;-----------------------------------------------------------------

st5: For i = 0 To 2 ; detecta apagar puerto2

compare [i] = ERead i + 19

If DS [i] <> compare [i] Then

GoTo st7

EndIf

Next

PU2 = 0

If PU1=1 Then

PORTB = %00000001

Else

PORTB = %00000000

EndIf

Return

;-----------------------------------------------------------------

;******************************************************************************************

; ESTA RUTINA DETECTA PETICION DE CORDENADAS DE GPS

;

;********************************************************************************************

st7: For i = 0 To 2 ; detecta solicitud de cordenadas

compare [i] = ERead i + 35

If DS [i] <> compare [i] Then

GoTo st8 ; pero no es esta peticion; salta a ver si es buzzer

EndIf

Next

Low led_azul

GoSub GPS1

MSGLEN = 25

For i = 0 To 25

DEN[i]=cor[i]

Next

GoSub ENVIO_SMS

HSerIn 5000, GGPP, [Wait("+CMGS:")]

GGPP: Return

'*********************************************************************

st8: For i = 0 To 2 ; detecta solicitud de buzzer revelador

temporal = i + 38

temporal1 = ERead temporal

If DS[ i ] <> temporal1 Then

Return

EndIf

Next

For i =0 To 20

High buz

DelayMS 600

Low buz

DelayMS 600

Next

MSGLEN = 5

DEN [0] = "B"

DEN [1] = "U"

DEN [2] = "Z"

DEN [3] = "-"

DEN [4] = "2"

DEN [5] = "0"

GoSub ENVIO_SMS

RP10: Return

;****************************************************************************************

;alarmas por interrupciones del puerto M'B

alarmas: ;aca se detectan la alarma #1

If entrada1 = 0 Then

DelayMS 100

If entrada1 = 0 Then

GoTo st9a

EndIf

EndIf

GoTo st10

st9a: MSGLEN = 7

DEN [0] = "A"

DEN [1] = "L"

DEN [2] = "A"

DEN [3] = "R"

DEN [4] = "M"

DEN [5] = "A"

DEN [6] = " "

DEN [7] = "1"

GoSub ENVIO_SMS

Return

;-----------------------------------------------------------------

; aca se detectan la alarma #2

st10: If entrada2 = 0 Then

DelayMS 100

If entrada2 = 0 Then

GoTo st10a

EndIf

EndIf

Return

st10a: MSGLEN = 7

DEN [0] = "A"

DEN [1] = "L"

DEN [2] = "A"

DEN [3] = "R"

DEN [4] = "M"

DEN [5] = "A"

DEN [6] = " "

DEN [7] = "2"

GoSub ENVIO_SMS

Return

'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

'ESTE PROGRAMA PASA DE OCTETOS CODIFICADOS SMS A SEPTETOS ESTA RUTINA ES FUNDAMENTAL

'FUNCIONA OK viernes 25 de Agosto del 2006.

'EL OCTETO SE COLOCA EN LA CADENA DEN[]

'EL SEPTETO O CARACTER ASCII SE ALMACENA EN DS[]

'ANTES DE INVOCARLA ES FUNDAMENTAL CARGAR LA VARIABLE DATALEN

'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

UNPACK: LENPACK=MSGLEN * 7/8

MSGLEN = MSGLEN - 1

X=0

Y=0

Z=0

K1=0

K2=1

LOOP7:

PRIMERO1:

AUX1=DEN[Y]

i=$7F

DS[Z] = AUX1 & i

If Z=MSGLEN Then Return

SEGUNDO1:'Z=1

Z=Z+1

Y=Z-K1

X=Z-K2

i=7

AUX1=DEN[X]>>i

i=1

AUX2=DEN[Y]<<i

AUX3=AUX1 |AUX2

DS[Z]=AUX3 & $7F

If Z=MSGLEN Then Return

TERCERO1:'Z=2

Z=Z+1

Y=Z-K1

X=Z-K2

i=6

AUX1=DEN[X]>>i

i=2

AUX2=DEN[Y]<<i

AUX3=AUX1 |AUX2

DS[Z]=AUX3 & $7F

If Z=MSGLEN Then Return

CUARTO1: Z=Z+1

Y=Z-K1

X=Z-K2

i=5

AUX1=DEN[X]>>i

i=3

AUX2=DEN[Y]<<i

AUX3=AUX1 |AUX2

DS[Z]=AUX3 & $7F

If Z=MSGLEN Then Return

QUINTO1: Z=Z+1

Y=Z-K1

X=Z-K2

i=4

AUX1=DEN[X]>>i

AUX2=DEN[Y]<<i

AUX3=AUX1 |AUX2

DS[Z]=AUX3 & $7F

If Z=MSGLEN Then Return

SEXTO1: Z=Z+1

Y=Z-K1

X=Z-K2

i=3

AUX1=DEN[X]>>i

i=5

AUX2=DEN[Y]<<i

AUX3=AUX1 |AUX2

DS[Z]=AUX3 & $7F

If Z=MSGLEN Then Return

SEPTIMO1:Z=Z+1

Y=Z-K1

X=Z-K2

i=2

AUX1=DEN[X]>>i

i=6

AUX2=DEN[Y]<<i

AUX3=AUX1 |AUX2

DS[Z]=AUX3 & $7F

If Z=MSGLEN Then Return

OCTAVO1:'Z=7

Z=Z+1

Y=Z-K1

X=Z-K2

AUX2=1

AUX1=DEN[X]>>AUX2

DS[Z]=AUX1 & $7F

If Z=MSGLEN Then Return

Z=Z+1

K1=K1+1

K2=K2+1

Y=Z-K1

X=Z-K2

GoTo LOOP7

 

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

' PACK

'ESTA RUTINA PASA DE septetos ASCII a OCTETOS CODIFICADOS SMS para ser enviados ES FUNDAMENTAL

'viernes 25 de agosto del 2006, funciona perfecto hay que tener cuidado con las

'instrucciones 'tipo >> o << requieren una variable auxiliar o no trabajan

'no hay limite de longitud de cadena ya que la dimension es dinamica segun

'la variable LENPACK

'ANTES DE USARSE SE CARGAN LOS DATOS EN LA CADENA DEN[ ] Y SE LEE LENPACK'

'Y EL RESULTADO SE ALMACENA EN DS[]

;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

PACK: LENPACK = 0

MSGLEN = MSGLEN + 1

LENPACK=MSGLEN*7/8

RESI=MSGLEN*7//8

If RESI>1 Then

LENPACK=LENPACK+1

EndIf

MSGLEN = MSGLEN - 1

Y=1

Z=0

K1=0

K2=1

LOOP8:

PRIMERO2:AUX1=DEN[K1]

i=7

AUX2=DEN[K2]<<i

DS[Z] = AUX1 | AUX2

If Z=MSGLEN Then Return

SEG2:Z=Z+1

K1=K1+1

K2=K2+1

i=1

AUX1=DEN[K1]>>i ' requiere la variable auxiliar I o no trabaja

i=6

AUX2 = DEN[K2] << i

DS[Z]=AUX1 | AUX2

If Z=MSGLEN Then Return

TER2:Z=Z+1

K1=K1+1

K2=K2+1

i=2

AUX1=DEN[K1]>>i

i=5

AUX2=DEN[K2]<<i

DS[Z] = AUX1 | AUX2

If Z=MSGLEN Then Return

CUARTO2:Z=Z+1

K1=K1+1

K2=K2+1

i=3

AUX1=DEN[K1]>>i

i=4

AUX2=DEN[K2]<<i

DS[Z] = AUX1 | AUX2

If Z=MSGLEN Then Return

QUINTO2:Z=Z+1

K1=K1+1

K2=K2+1

i=4

AUX1=DEN[K1]>>i

i=3

AUX2=DEN[K2]<<i

DS[Z] = AUX1 | AUX2

If Z=MSGLEN Then Return

SEXTO2:Z=Z+1

K1=K1+1

K2=K2+1

i=5

AUX1=DEN[K1]>>i

i=2

AUX2=DEN[K2]<<i

DS[Z] = AUX1 | AUX2

If Z=MSGLEN Then Return

SEPTIMO2:Z=Z+1

K1=K1+1

K2=K2+1

i=6

AUX1=DEN[K1]>>i

i=1

AUX2=DEN[K2]<<i

DS[Z] = AUX1 | AUX2

If Z=MSGLEN Then Return

Z=Z+1

K1=K1+1

K2=K2+1

K1=K1+1

K2=K2+1

GoTo LOOP8

;*********************************************************************************

'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

'ANTES DE INVOCARLA DEBEMOS SAVER LA CADENA ASCCI Y EL MSGLEN Y EL TELEFONO RECEPTOR

'MSGLEN ES LA LONGITUD DE LA CADENA ASCII O EN SEPTETOS DE CARACTERES.

'FUNCIONA PERFECTA PROBADA 100 x 100

'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

ENVIO_SMS:

GoSub PACK

MSGLEN = MSGLEN + 1

LONG = LENPACK + 13

HSerOut ["AT+CMGS=", Dec LONG, 13]

HSerIn 9000, ENVIO_SMS, [Wait(">")]

PARA ENTENDER LA LINEA DE ABAJO ES FUNDAMENTAL ENTENDER EL PROTOCOLO PDU EN MODO TRANSMISION

HSerOut ["0011000A91", Str TEL\10, "0000AA", Hex2 MSGLEN]  *****************

For i = 0 To LENPACK - 1

HSerOut [Hex2 DS[i]]

Next

HSerOut [26] ;CONTROL Z

Return

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;RECIBIR RECIBE DATOS....FUNCIONA PERFECTA !OK

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++

RECIBIR: HSerIn 5000, again, [Wait("+CMTI:")]

DelayMS 100

HSerOut ["AT+CMGL=0", 13, 10]

PARA ENTENDER LA LINEA DE ABAJO ES FUNDAMENTAL ENTENDER EL PROTOCOLO PDU EN MODO RECEPCION

HSerIn 6000, again, [Wait("+CMGL:"),skip 32, Str TEL\10, skip 18, Hex2 MSGLEN,_

Hex2 DEN[0], Hex2 DEN[1], Hex2 DEN[2], Hex2 DEN[3], Hex2 DEN[4], Hex2 DEN[5], Hex2 DEN [6]]

HSerOut [Str TEL, Hex2 MSGLEN]

GoSub UNPACK

HSerOut ["DS",Str DS] ;prueba de la orden y se imprime en el puerto

;se inicia la identificacion de comandos.

HSerOut ["AT+CMGD=1",13]

GoSub ORDENES ; EJECUTA LA ORDEN RECIBIDA

again: Return

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

;ESTA RUTINA SALVA EL PASSWORD Y EL NUMERO TELEFONICO

SAVE_PASS:

For i = 3 To 6

temporal1 = DS[i]

EWrite i, [temporal1]

Next

; hasta aca todo oKKKKKK----- almacena el password

SAVE_TEL: j = 0

For i = 0 To 9

j = 25 + i

temporal1 = TEL [ i ]

EWrite j, [temporal1]

Next ; hasta aca ok almacena el TELefono

Return

LEER_TEL: For i = 0 To 9

Let j = 25 + i

TEL[i] = ERead j

Next

If TEL[0]= "0" Then

GoSub JUEGOS

EndIf

Return

JUEGOS: For i=0 To 5

High led_rojo

DelayMS 100

Low led_rojo

DelayMS 100

High led_verde

DelayMS 100

Low led_verde

DelayMS 100

High led_azul

DelayMS 100

Low led_azul

Next

Return

; hasta aca ok lee el TELefono

;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

BAD: Inc FALLA

High led_rojo

If FALLA = 10 Then

GoTo inicio

Low led_rojo

EndIf

GoTo inicio

;****************************************************************************************************************************

; baudios=83 'para 9600 EN 4 Mhz

; esta rutina lee el gps

;

;****************************************************************************************************************************

ESTA RUTINA LEE UN GPS POR UN PUERTO SERIAL DEL PIC QUE NO TIENE USART (comunicacion serie por software; sin USART)

GPS1: ; EJEMPLO----$GPRMC,040140.195,A,0614.4903,N,07536.7776,W,0.000000,,010209,,*02

; EJEMPLO----$GPGGA,040139.195,0614.4903,N,07536.7776,W,2,04,1.6,1629.1,M,1.3,M,1.8,0000*6F

baudios = 83

DelayMS 50

SerIn RX, baudios, 1000, nogps,[ Wait("$GPRMC"), skip 12, Str cor\26]; si falla la lectura salta nogps

DelayMS 50

SerIn RX, baudios, 1000, nogps,[ Wait("$GPGGA"), skip 39, Str sat\2]; si falla la lectura salta nogps ;numero de satelites

DelayMS 50

SerOut TX, baudios, [Str cor] ;prueba el gps imprime cordenadas

For i=0 To 25

j = cor[i]

DEN[i]=j

Next i

If sw2 = 1 Then ; salta si esta en modo prueba

Return

EndIf

If sat[1] = "3" Then ; si se empiesa a perder la señal guarda lo que tiene

GoTo guardar

EndIf

If cor[0]="V" Then ; si pierde la señal recupera lo guardado

GoTo recuperar

EndIf

Return

guardar: For i = 0 To 25

j = i + 41

temporal1 = cor[i]

EWrite j, [temporal1]

Next

Return

recuperar:For i = 0 To 25

j = i + 41

cor[i] = ERead j

Next

Return

;*****************************************************************************************************************************

; si el GPS no responde contesta no gps

;*****************************************************************************************************************************

nogps: Inc TELNULL

If TELNULL < 10 Then

GoTo GPS1 ;REINTENTA LECTURAS DE GPS SI SON MAS DE 10 ENVIA MENSAJE

EndIf

MSGLEN = 5

DEN [0] = "N"

DEN [1] = "O"

DEN [2] = "-"

DEN [3] = "G"

DEN [4] = "P"

DEN [5] = "S"

High led_azul

GoSub ENVIO_SMS

HSerIn 5000, nogps, [Wait("+CMGS:")]; SI FRACASA EL ENVIO SE REENVIA, GARANTIZA LA COMUNICACION

Return

;*********************************************************************************************************************************

;*********************************************************************************************************************************

testGPS: DelayMS 5000

If RX = 1 Then

DelayMS 100

If RX = 1 Then

High led_azul

HAYGPS = 0

Return

EndIf

EndIf

Low led_azul

HAYGPS = 1

Return

;***********************************************************************************************

delDS: For i=0 To 6

DS[i]="0"

Next

Return

End

PUEDES BAJAR ESTE PROGRAMA DE LA SECCION EJEMPLOS TANTO CON EL 16F83A o 16F88

ESTUDIO DE LAS TRAMAS PDU

APLICACIONES DE TELEMETRÍA BASADO EN RED DE TELEFONÍA CELULAR RED GSM o GPRS

vamos a usar un telefono celular siemens por que es barato facil de conseguir y tiene modem interno

atraves de formato RS-232C TTL a 3 voltios evitandonos trasformador de niveles

          

TELEFONO SIEMENS           DESCRIPCION DE CONTACTOS                DETALLE CONECTOR       CONECTOR PARA EL PROCESADOR

PARA NUESTRAS PRACTICAS SE TE SUMINISTRA UN TELÉFONO SIEMENS A56i QUE TIENE UN MODEM GSM GPRS QUE SE COMUNICA A TRAVÉS DE UNA INTERFAZ SERIAL TIPO RS-232 SERIE DE NIVELES LOGICOS TTL (COMO OPERA EL DONGLE QUE YA CONOCEMOS)  EN LA FOTO SE DESCRIBEN LOS PINES DEL CONECTOR USAREMOS CONECTOR DE 4 CABLES

 

VEREMOS COMO SE DEBEN ENVIAR MENSAJES SEA TELÉFONO O MICROCONTROLADOR, VEREMOS LOS REQUERIMIENTOS PARA QUE ESTO FUNCIONE.

A CONTINUACIÓN MANDAMOS MENSAJE DE TEXTO USANDO UNA TERMINAL SERIE CON UN DONGLE QUE LO PEGAMOS AL CONECTOR DEL TELÉFONO DE LA SIGUIENTE FORMA

NOTE COMO PEGA EL CABLE CONECTOR DEL TELÉFONO AL DONGLE DEBE INSTALAR DRIVER DEL DONGLE Y CON ADMINISTRADOR DE DISPOSITIVOS DE WINDOWS MIRAR QUE PUERTO LE ASIGNÓ WINDOWS (QUE PUERTO COM ENUMERO)

EL PROGRAMA ENVIADO ES MOVILON YO SE LOS ENVIO POR MAIL O LO PONGO EN LA WEB

ME REPORTO ERROR POR QUE ME QUEDE SIN MINUTOS PARA MENSAJES SMS

 

Gallina café

E7 30 9B 9D 76 87 41 E3 B0 B9 0C

Descripción del mensaje de texto enviado

AT+CMGS=24 <CR>    24 ES EL NUMERO DE CARACTERES HEX QUE CONFORMAN TODA LA TRAMA MENOS EL PRIMERO QUE ES 00 Y SE OMITE   CON ESTE COMANDO AT SE INICIA LA TRANSMISIÓN DEL MENSAJE

EL MODEM DEVUELVE EL SÍMBOLO O CARÁCTER “>” Y NOSOTROS COMO TRANSMISOR ESCRIBIMOS LA TRAMA SIGUIENTE EN FORMATO HEX

00  SIEMPRE ES 00  O SEGÚN ESPECIFICACIÓN

11 octetos del mensaje SMS-SUBMIT.

00  NUMERO DE REFERENCIA

0A  CANTIDAD DE NÚMEROS DEL TELÉFONO (diez)

91  FORMATO INTERNACIONAL DEL NÚMERO DEL TELÉFONO

1388265380  TELÉFONO DEL RECEPTOR EN BCD INVERTIDO  SI ES IMPAR ACABA EN F

00  identificador de protocolo TP-PID  ES 00

00    00 ES CODIFICACIÓN A 7 BITS TP-DCS

AA   TP-Validez-Período. "AA" significa 4 días.

0C   es el número de septetos del mensaje que sigue +1

E7 30 9B 9D 76 87 41 E3 B0 B9 0C    este es el mensaje en septetos

 CON ESTE CONOCIMIENTO APROPIADO USTED PUEDE ENVIAR MENSAJES DE TEXTO QUE ENCAPSULAN INFORMACIÓN DE SENSORES o VARIABLES ASÍ COMO ESTADOS DIGITALES DE BOTONES SUICHES ALARMAS y HASTA LAS COORDENADAS QUE GENERA UN GPS REMOTO EN CASO DE IMPLEMENTAR UN RASTREADOR SATELITAL. SUPONGA QUE EN OTRA USART DEL MODULO FRDMKL25Z LE CONECTAS UN GPS DE SALIDA SERIE RS 232

EN ESE CASO USTED POR SOFTWARE CREA UN PROGRAMA QUE LE SOLICITE AL SISTEMA ATRAVES DEL MODEM CON MENSAJE DE TEXTO QUE LE DEVUELVE LAS COORDENADAS DEL EQUIPO INSTALADO REMOTAMENTE CON MODEM GMS FUNCIONAL

PARA HACER ESO EL TRUCO ES DEVOLVER UN MENSAJE DE TEXTO ENCAPSULADO DE LA SIGUIENTE FORMA 

CUANDO LE LLEGUE A SU SMARTPHONE ANDROID Y LE HAGA DOBLE CLIC YA QUE TE LO RESALTA EN AZUL POR SER LINK TE METE AUTOMÁTICAMENTE EN GOOGLE MAPAS Y VES LA UBICACIÓN AUTOMÁTICAMENTE.

http://maps.google.com/?q=<lat>,<lng>

where lat- latitude, lng- longitude

 EJEMPLO

http://maps.google.com/?q=-37.866963,144.980615

OJO CON EL SIGNO MENOS SIGNIFICA LATITUD SUR Y OESTE (W)  EN ESTE CASO ES SUR, ESTE

OJO FÍJESE QUE LA COORDENADA SE ENVÍA CON PUNTO Y  6 CIFRAS;  NO SE USA GRADOS MINUTOS SEGUNDOS

ENSAYE CON SU CASA O SITIOS CONOCIDOS PARA QUE VEA QUE FUNCIONA

CODIFICACION DEL MENSAJE DE TEXTO

ALGORITMO PARA PASAR DE OCTETOS A SEPTETOS

gallina café

en rojo los que se quitan

en verde los que se ponen atrás

 ESTOS SON OCTETOS  DE[ ]   y LOS SEPTETOS SERIAN DS[ ]

11100111 00110000 10011011 10011101 01110110 10000111 01000001 11100011 10110000 10111001 00001100

1100111   1100001   1101100   1101100   1101001   1101110   1100001   0100000 --11100011    1100001    1100110    1100101

    67                  61                6C              6C                  69                 6E                       61                   20                     63                   61               66                 65

EL ALGORITMO OPERA DE LA 1 A LA 8 APARTIR DE LA NUEVE CAMBIA QUE ES LA                                                                 61h

 67 61 6c 6c 69 6e 61 20 63 61 66 65  septetos  son 12

E7 30 9B 9D 76 87 41 E3 B0 B9 0C  octetos 11

ESTE ALGORITMO OPERA INVERSO AL DE SACAR OCTETOS

APLICAMOS LA DINAMICA INVERSA Y VEMOS QUE PARA EL PRIMERO SE REDUCE A SACAR EL OCTAVO BIT Y GUARDARLO

PARA EL PROXIMO  Y EN “C” SERIA ASI:

DS[0]=DE[0] & 0x7F

EN EL SEGUNDO

DS[1]= (DEN[1]<<1 & DEN[0]>>7) and 7Fh     PARA ENMASCARAR EL ULTIMO O MSB BIT

DS[2]= (DEN[2]<<2 & DEN[1]>>6) and 7Fh

DS[3]= (DEN[3]<<3 & DEN[2]>>5) and 7Fh

DS[4]= (DEN[4]<<4 & DEN[3]>>4) and 7Fh

DS[5]= (DEN[5]<<5 & DEN[4]>>3) and 7Fh

DS[6]= (DEN[6]<<6 & DEN[5]>>2) and 7Fh

DS[7]= (DEN[7]<<7 & DEN[6]>>1) and 7Fh

DS[8]= (DEN[8]<<8 & DEN[7]>>0) and 7Fh

SE GENERALIZA ASI EN LENGUAJE “C”

DS[i]=(DE[i-1]>>K | DE[i]<<(8-K)) & 0x7F

PARA EL NOVENO NO SE CUMPLE ASI SI DETALLAMOS EL GRAFICO ANTERIOR

DS[9] =   (DEN[8]<<1 & DEN[7]>>7) and 7Fh

DS[10] = (DEN[9]<<2 & DEN[8]>>6) and 7Fh

DS[11] = (DEN[10]<<3 & DEN[9]>>5) and 7Fh

DS[12] = (DEN[11]<<4 & DEN[10]>>4) and 7Fh

DS[13] = (DEN[12]<<5 & DEN[11]>>3) and 7Fh

DS[14] = (DEN[13]<<6 & DEN[12]>>2) and 7Fh

DS[15] = (DEN[14]<<7 & DEN[13]>>1) and 7Fh

DS[16] = (DEN[15]<<8 & DEN[14]>>0) and 7Fh

QUE PASARIA EN EL 18, DEBEMOS EXPLORARLO CON UN EJEMPLO  VEAMOS!!

la gallina cafe esta lista para ser la cena   estos son los septetos ascci

6c 61 20 67 61 6c 6c 69 6e 61 20 63 61 66 65 20 65 73 74 61 20 6c 69 73 74 61 20 70 61 72 61 20 73 65 72 20 6c 61 20 63 65 6e 61

 01101100  01100001  00100000  01100111  01100001  01101100  01101100  01101001  01101110  01100001  00100000 01100011  01100001  01100110  01100101  00100000  01100101  01110011  01110100  01100001  00100000  01101100 01101001  01110011  01110100  01100001  00100000  01110000  01100001  01110010  01100001  00100000  01110011 01100101  01110010  00100000  01101100  01100001  00100000  01100011  01100101  01101110  01100001

 El primer octeto es   11101100   ECh

En octetos es:

EC30E81C66B3D3EE30681C369741E5393D0C62A7E7F430081E968741F3B21CC40E83C6657718

Y en binarios octetos

11101100  00110000  11101000  00011100  01100110  10110011  11010011  11101110  00110000  01101000  00011100 00110110  10010111  01000001  11100101  00111001  00111101  00001100  01100010  10100111  11100111  11110100 00110000  00001000  00011110  10010110  10000111  01000001  11110011  10110010  00011100  11000100  00001110 10000011  11000110  01100101  01110111  00011000

Y en binarios sus septetos:

01101100  01100001  00100000  01100111  01100001  01101100  01101100  01101001  01101110  01100001  00100000 01100011  01100001  01100110  01100101  00100000  01100101  01110011  01110100  01100001  00100000  01101100 01101001  01110011  01110100  01100001  00100000  01110000  01100001  01110010  01100001  00100000  01110011 01100101  01110010  00100000  01101100  01100001  00100000  01100011  01100101  01101110  01100001

  

Y SE GENERALIZA CON LA SIGUIENTE LINEA EN “C”

if (i>8) {DS[i]=(DE[i-2]>>K | DE[i-1]<<(8-K))& 0x7F;}

prueba

 la gallina café se asa

6c 61 20 67 61 6c 6c 69 6e 61 20 63 61 66 65 20 73 65 20 61 73 61

Binarios

01101100  01100001  00100000  01100111  01100001  01101100  01101100  01101001  01101110  01100001  00100000 01100011  01100001  01100110  01100101  00100000  01110011  01100101  00100000  01100001  01110011  01100001

Primer octeto

11101100   ECh..   y todos los octetos son:

EC 30 E8 1C 66 B3 D3 EE 30 68 1C 36 97 41 F3 32 28 3C 0F 03

Y en binario los octetos son                                                                                                                               6                                7

11101100  001100001  1110100000  00011100111  011001100001  1011001101100  11010011101100  111011101101001  00110000  01101000  00011100 00110110  10010111  01000001  11110011     00110010  00101000  00111100  00001111  00000011

Y los septetos son:                                                                                               6                 7                 8                  9 

01101100  01100001  00100000  01100111  01100001  01101100  01101100  01101001  01101110  01100001  00100000 01100011  01100001  01100110  01100101  00100000  01110011  01100101  00100000  01100001  01110011  01100001

                                                                                                                           17

apartir del 17

DS[17] = DE[14]>>7 OR DE[15]<<1 AND 7Fh

DS[18] = DE[15]>>6 OR DE[16]<<2 AND 7Fh

DS[19] = DE[16]>>5 OR DE[17]<<3 AND 7Fh

DS[20] = DE[17]>>4 OR DE[18]<<4 AND 7Fh

DS[21] = DE[18]>>3 OR DE[19]<<5 AND 7Fh

DS[22] = DE[19]>>2 OR DE[20]<<6 AND 7Fh

DS[23] = DE[20]>>1 OR DE[21]<<7 AND 7Fh

DS[24] = DE[21]>>0 OR DE[22]<<8 AND 7Fh

DS[25] = DE[22]>>7 OR DE[23]<<1 AND 7Fh

DS[26] = DE[23]>>6 OR DE[24]<<2 AND 7Fh

SE GENERALIZA A en el tercer ciclo

DS[i] = DE[i-3]>>K OR DE[i-2]<<(8-K) AND 7Fh

Y en el Segundo ciclo dio

DS[i]=(DE[i-2]>>K | DE[i-1]<<(8-K))& 0x7F

Y EN EL PRIMER CICLO

DS[i]=(DE[i-1]>>K | DE[i]<<(8-K)) & 0x7F

SI HACEMOS UN CONTADOR DE LAS VECES QUE K SE HACE CERO

C=0 EN EL PRIMER CICLO

DS[i]=(DE[i-1-C]>>K | DE[i-C  ]<<(8-K)) & 0x7F

 

EL PROGRAMA SERIA ASI:

/*

ALGORITMO PARA PASAR DE OCTETOS A SEPTETOS

EN UN MENSAJE DE TEXTO DE CELULAR EN FORMATO PDU

USA DOS CADENAS UNA DE ENTRADA Y OTRA DE SALIDA

LENIN ES LA LONGITUD DE LA CADENA DE ENTRADA

LENOUT LA LONGITUD DE SALIDA

VERIFIQUE CON EL DECODIFICADOR DE ESTA PAGINA::

http://www.twit88.com/home/utility/sms-pdu-encode-decode

en septetos use esta....http://www.asciitohex.com/

PROBADA EN 12 CARACTERES

SE DEBE PROBAR EN 18 O MAS Y ARREGLAR EL ALGORITMO SI ES EL CASO

*/

 

#include <stdio.h>

#include <stdlib.h>

 

short DE[255];

short DS[255];

int i,K,LENOUT,LENIN,C;

//PROBAR CON ESTOS

//E7309B9D768741E3B0B90C...gallina cafe  67 61 6c 6c 69 6e 61 20 63 61 66 65 son septetos

int main(){

         LENIN=11; //numero de caracteres de abajo soN octetos

         DE[0]=0xE7;

         DE[1]=0x30;

         DE[2]=0x9B;

         DE[3]=0x9D;

         DE[4]=0x76;

         DE[5]=0x87;

         DE[6]=0x41;

         DE[7]=0xE3;

         DE[8]=0xB0;

         DE[9]=0xB9;

         DE[10]=0x0C;

//----------------------------------- ---------------------------

         LENOUT= LENIN*8/7;

         K=7;

         C=0;

         DS[0]=DE[0] & 0x7F;  // la primera sola

         printf("%2X,%d,%d\r\n",DS[0],i,K);

         for (i=1;i < LENOUT;i++){  // inicia el algoritmo

         DS[i]=(DE[i-1-C]>>K | DE[i-C]<<(8-K))& 0x7F;  //valido para todos

         printf("%2X,%d,%d\r\n",DS[i],i,K);

         if (K==0) {K=8;C++;}

         K--;

         }

         system("PAUSE");

}

 

UN PROGRAMA O FUNCION PARA ENVIAR UN MENSAJE

 

         LLAMAR FUNCION QUE PASE EL MENSAJE DE OCTETOS A SEPTETOS

         MSGLEN = MSGLEN + 1

         LONG = LENPACK + 13

         ENVIAR POR LA USART "AT+CMGS=", Dec LONG, <CR> o 13

         ESPERAR RECIBIR POR EL SERIAL SI EL MODEM RESPONDIO CON UN CARÁCTER SIMPLE(">")

         ENVIAR POR LA USART LA TRAMA PERO SOLO EL PREAMBULO "0011000A91", Str TEL\10,

         "0000AA", Hex2 LONGITUD DEL MENSAJE(MSGLEN)….  LOS MARCADOS SUMAN 13

         For i = 0 To LONGITUD DE LA CADENA DE SEPTETOS            

         HSerOut [Hex2 DS[i]] 

         HSerOut [26]  ;CONTROL Z o en c es GSM.putc(0x1A);

         Return

 

 

PERO ANTES DE MANDAR O RECIBIR EL MENSAJES ES OBLIGATORIO ENVIAR LOS SIGUIENTES COMANDOAS AT PARA QUE SEA FUNCIONAL PARA NOSOTROS SI NO LO HACEMOS NI SE DARA POR ENTERADO Y NOS IGNORARA.

 

        EN ALGUN LENGUAJE DE PROGRAMACION BASIC!

 

        SE HACE ESTO ANTES GUIESE PARA HACERLO EN C DE mbed

 

         HSerOut ["AT",13,10]             ;atencion!

         HSerIn 5000, BAD, [Wait("OK")]   ;no le responde el modem salta a BAD y en bad se actva los led rojo

         DelayMS 100

         HSerOut ["AT+CNMI=1,1",13,10]    ;configuracion inicial

         DelayMS 100

         HSerOut ["AT+CMGF=0",13,10]      ;modo PDU

         DelayMS 100

         HSerOut ["ATE",13,10]          ;SIN ECO

         DelayMS 100

         HSerOut ["CBST=0,0,1",13,10]         ;AUTOBAUDIOS,ASINCRONICO

 

ALGO EN mbed SERIA ASI: SEGÚN ESTE MIEMBRO

http://developer.mbed.org/users/khettat/

   /***************************/
   /*      Initialisation     */
   /***************************/
void Init(void)
{
    GSM.baud(9600);//GSM baudios
    GSM.format(8,Serial::None,1); //Formato serial
    GSM.printf("AT+CNMI=1,1");//configuracion inicial
    GSM.putc(0x0D);// \n
    wait(5);
    GSM.printf("AT+CMGF=0");//MODO PDU o HEX
    GSM.putc(0x0D);// \n
//  pc.printf("Modem configurado\r\n");
    wait(2);
    GSM.attach(&Receive, GSM.RxIrq);
    pc.printf("Lista la IRQ...\r\n");
 

}

Si queremos atender la recepción serial de la usart por interupcion escribimos en la inializacion  del programa

GSM.attach(&Receive, GSM.RxIrq);

 PARA RECIBIR MENSAJES SE PROCEDE CON ALGO ASI

         HSerIn 5000, again, [Wait("+CMTI:")]

         DelayMS 100

         HSerOut ["AT+CMGL=0", 13, 10]

         HSerIn 6000, again, [Wait("+CMGL:"),skip 32, Str TEL\10, skip 18, Hex2 MSGLEN,_

         Hex2 DEN[0], Hex2 DEN[1], Hex2 DEN[2], Hex2 DEN[3], Hex2 DEN[4], Hex2 DEN[5], Hex2 DEN [6]]

         GoSub UNPACK

         'HSerOut ["DS",Str DS] ;prueba de la orden y se imprime en el puerto

         ;se inicia la identificacion de comandos.

NOTA:

char  a=0x1A,e=0x22,c=0x0d;
char num[] = "9742920934";
GSM.baud(9600);
pc.baud(9600);
GSM.printf("AT\r\n");
GSM.printf("AT+CMGF+1\r\n");
 
Serial GSM(p9, p10);  // tx, rx
Serial pc(USBTX,USBRX);
 
 GSM.printf("AT+CMGS=%c%s%c\r\n",e,num,e);
 
OTRO CODIGO PARA LEER SMS
http://developer.mbed.org/users/gsulc/code/AntiTheftGPS/file/4415987ca08f/sms.cpp
 
  
 
RUTINAS DE RECEPCION MBED SEGÚN VINCULO ANTERIOR librería sms.cpp
 
void messageReceive(MODSERIAL_IRQ_INFO *q) { //detecta que llego “+CMTI” devuelve command_sent
    MODSERIAL *sys = q->serial;
    sys->move(messageBufferIncoming, MESSAGE_BUFFER_SIZE);
    if (!strncmp(messageBufferIncoming, "+CMTI"sizeof("+CMTI")-1))
        command_sent = true;
    //messageReceived = true;
    return;
}
 
int messageProcess() {   // esto detecta “OK” y devuelve mpResult
    int mpResult = 0;
    wait(0.4);
    if (!strncmp(messageBufferIncoming, "OK"sizeof("OK")-1)) mpResult = 1;
    else if (!strncmp(messageBufferIncoming, "ERROR"sizeof("ERROR")-1)) mpResult = 2;
    else mpResult = 1;
    pc.printf("%s\r\n", messageBufferIncoming);
    gsm.rxBufferFlush();                            //Flush the Buffer
    //messageReceived = false;
    return mpResult;
}
 
 
void check_SMS(){                   //Lee el mensaje o mensajes
    //string text_id;
    //pc.printf("Checking Messages\r\n");
    while (!gsm.writeable()) {}
    //gsm.puts("AT+CMGL=?\r\n");
    //messageProcess();
    //while (1) {
    gsm.puts("AT+CMGL=\"ALL\"\r\n");          //Check ALL messages
    wait(2);
    messageProcess();
    //gsm.puts("AT+CMGR=1\r\n");
    //messageProcess();
    //gsm.puts("AT+CMGD=1\r\n");
    //messageProcess();
    //}
    //wait(0.4);
    /*gsm.scanf("%s", text_id);
    pc.printf("textID = %s\r\n", text_id);
    text_id = strtok(text_id, ": ");
    //messageProcess();                         //Process incoming message
    gsm.puts("AT+CMGR=%s\r\n", text_id);
    messageProcess();*/
}
 
void send_SMS(string phoneNumber, string text) { // para enviar mensaje pero en modo texto
    pc.printf("Sending: %s\r\n", text);
 
    gsm.printf("AT+CMGS=\"%s\"\r\n", phoneNumber);
    wait(0.4);
    gsm.printf("%s", text);
    wait(0.4);
    gsm.printf("%c", SUB);
    wait(0.4);
    gsm.printf("\r\n");
    
    if (messageProcess() == 1) {
        pc.printf("SMS sent\r\n");
    } 
    else {
        pc.printf("SMS send failed\r\n");
    }
}
 
 
Configuración inicial-------------
void GSM_init() {
    pc.printf("Setting up GSM Modem\r\n");
    
    gsm.baud(115200);                         //Set Baud Rate
    
    gsm.puts("AT\r\n");                       //Check Connection
    messageProcess();                         //Process incoming message
    
    // Tune Down Baud
    pc.printf("Slowing Baud Down....");
    gsm.puts("AT+IPR=19200\r\n");            //Select Bearer Servr Type autobaud, No name, Non-transparent
    messageProcess();                         //Process incoming message
    
    gsm.baud(19200);
    gsm.format(8, Serial::None, 1);         //Default format
    
    gsm.attach(&messageReceive, MODSERIAL::RxAutoDetect);     //Attaches Interrupts
    gsm.autoDetectChar('\n');                                 //Set Detection to Line Feed
    
    gsm.puts("AT\r\n");                       //Check Connection
    messageProcess();                         //Process incoming message
   
    gsm.puts("AT+IFC=0,0");                   //Disable handshake lines
    messageProcess();                         //Process incoming message
    
    gsm.puts("AT+CSMP=17,167,0,0\r\n");       //Set Text Parameters (default values)
    messageProcess();                         //Process incoming message
    
    gsm.puts("AT+CSCA?\r\n");                 //Check Service Center
    messageProcess();                         //Process incoming message
 
    gsm.puts("AT+CMGF=1\r\n");                //Set format to Text Mode
    
    messageProcess();                         //Process incoming message
    /*
    gsm.printf("AT+CNMI=1,1,0,0,0\r\n");      //Set the new messages indicator
    wait(0.5);
    messageProcess();                         //Process incoming message
 
    gsm.printf("AT+CSAS\r\n");                //Save the Current Setup, REGLED will light SOLID
    wait(3.0);
    messageProcess();                         //Process incoming message
    //*/
    pc.printf("GSM Setup Done\r\n");
}
 
 
 
Algoritmo septetos a octetos, paselo a función
#include "mbed.h"
Serial pc(USBTX, USBRX); // tx, rx
/*
ALGORITMO PARA PASAR DE SEPTETOS A OCTETOS
EN UNA MENSAJE DE TEXTO DE CELULAR EN FORMATO PDU
USA DOS CADENAS UNA DE ENTRADA Y OTRA DE SALIDA
LENIN ES LA LONGITUD DE ENTRADA
LENOUT LA LONGITUD DE SALIDA
SE USA PARA ENSAMBLAR UNA TRAMA PDU
ESTA CADENA DE SALIDA SE ENVIA SOBRE LA TRAMA PDU COMPLETA
VERIFIQUE CON EL DECODIFICADOR DE ESTA PAGINA::
PROBADA PARA CUALQUIER LONGITUD VER:SEP 24 DEL 2014
http://www.twit88.com/home/utility/sms-pdu-encode-decode
*/
char DE[255];
char DS[255];
int i,K,C,LENOUT,LENIN;
float chk;
 
int main(){
         ; //numero de caracteres de abajo
         char DE[]="la gallina cafe es una verdadera grosera que merece ser cocinada";
         LENIN=strlen(DE);
         /*
         los octetos ASI VIAJA POR LA RED GSM
         EC 30 E8 1C 66 B3 D3 EE 30 68 1C 36 97 41 E5 39 A8 EE 0E 83 EC 65 39 39 4C 2E CB
         C3 A0 B3 FC 3D 2F CB C3 A0 78 BD 0C 6A 97 E5 E5 71 19 34 2F CB 41 E3 F7 38 ED 0E 93 C3
 
         y los septetos ASI HAGO VISIBLE EL MENSAJE RECIBIDO
         6c 61 20 67 61 6c 6c 69 6e 61 20 63 61 66 65 20 65 73 20 75 6e 61 20 76 65 72 64 61 64
         65 72 61 20 67 72 6f 73 65 72 61 20 71 75 65 20 6d 65 72 65 63 65 20 73 65 72 20 63 6f
         63 69 6e 61 64 61
         */
        //----------------------------------- ---------------------------
         K=0;C=0;
         for (i=0;i < LENIN;i++){
         DS[i]=DE[i+C]>>K | DE[i+C+1]<<(7-K);
         if (DS[i]==0x00) {LENOUT=i; goto salir;}
         K++;
         if (K==7) {K=0;C++;} // se chequea que ya se acabaron los bits en un ciclo de conversion.
         }
 
         //--------------------------------------------------------------
salir:   for (i=0;i < LENIN;i++){
         pc.printf("%X",DE[i]);
         }
         pc.printf(":\r\n");
         for (i=0;i<LENOUT;i++){
         pc.printf("%2X,%d\r\n",DS[i]&0x000000FF,i);
         }
         pc.printf("LENOUT:%d,LENIN:%d\r\n",LENOUT,strlen(DE));
         
}   
 
Algoritmo octetos a septetos paselo a funcion 

 

#include "mbed.h"

Serial pc(USBTX, USBRX); // tx, rx

/*

ALGORITMO PARA PASAR DE OCTETOS A SEPTETOS

EN UN MENSAJE DE TEXTO DE CELULAR EN FORMATO PDU

SE APLICA AL RECIBIR UN MENSAJE QUE TRAE OCTETOS

SON VISIBLES EN ASCCI AL SER SEPTETOS

USA DOS CADENAS; UNA DE ENTRADA Y OTRA DE SALIDA

LENIN ES LA LONGITUD DE LA CADENA DE ENTRADA

LENOUT LA LONGITUD DE LA DE SALIDA

VERIFIQUE CON EL DECODIFICADOR DE ESTA PAGINA::

http://www.twit88.com/home/utility/sms-pdu-encode-decode

en septetos use esta....http://www.asciitohex.com/

LA ULTIMA VERSION ES PARA CUALQUIER NUMERO DE CARACTERES VER:SEP 24 DEL 2014

tanto LENIN y LENOUT se deben especificar al ensamblar la trama PDU en el MODEM

GSM o GPRS

*/

 

short DE[255];

short DS[255];

int i,K,LENOUT,LENIN,C;

//PROBAR CON ESTOS

//E7309B9D768741E3B0B90C  son octetos ///.gallina cafe  67 61 6c 6c 69 6e 61 20 63 61 66 65 son septetos

int main(){

         LENIN=11; //numero de caracteres de abajo son los octetos

         DE[0]=0xE7;

         DE[1]=0x30;

         DE[2]=0x9B;

         DE[3]=0x9D;

         DE[4]=0x76;

         DE[5]=0x87;

         DE[6]=0x41;

         DE[7]=0xE3;

         DE[8]=0xB0;

         DE[9]=0xB9;

         DE[10]=0x0C;

//----------------------------------- ---------------------------

         LENOUT= LENIN*8/7;

         K=7;

         C=0;

         DS[0]=DE[0] & 0x7F;  // la primera sola

         pc.printf("%2X,%d,%d\r\n",DS[0],i,K);

         for (i=1;i < LENOUT;i++){  // inicia el algoritmo

         DS[i]=(DE[i-1-C]>>K | DE[i-C]<<(8-K))& 0x7F;  //valido para todos

         pc.printf("%2X,%d,%d\r\n",DS[i],i,K);

         if (K==0) {K=8;C++;}

         K--;

         }

         for (i=0;i < LENOUT;i++){

         pc.printf("%c",DS[i]);

         }

         pc.printf("  ---");

        

}

 

VAMOS A MANDAR AL MODEM    gallina cafe                 

 

AT

AT OK

El modem está conectado

AT+CNMI=1,1

AT+CNMI=1,1 OK

AT+CMGF=0

AT+CMGF=0 OK

ATE

ATE OK

CBST=0,0,1

 +CMTI: "SM",3

AT+CMGL=0

 +CMGL: 2,0,,159

07917503309600720412D0CDB73DCD2EE2D3F43700004101908102730A9CD43A485E1E87E5E730885C06C56030180C042FCFDF73103A0C9AA7C96F90BC1C66A7F5617218347EBB41657C9AFE7681ACE9B3CE0623A7C37317C81A66BFE5A076DA0D7287D9BA582EE70259C3ECB71C346D4E75315ACE05B286D96F396829D4C5662ED0F0ED9ED7D9F430881D9E83E86179DA1C9E83CA6ED0FD7E77B5DFF634BB8C4FD3DFAEF1BB0D

+CMGL: 3,0,,29

0791750380960041040AA1132237173700004101013033150A0CE7309B9D768741E3B0B90C

OK

Llega esto:

0791750380960041040AA1132237173700004101013033150A0CE7309B9D768741E3B0B90C

  Este es el mensaje

07  es en octetos

91 codigo internacional

 E7 30 9B 9D 76 87 41 E3 B0 B9 0C 

Desde 3122737173

0C       tamaño del mensaje  = octetos caracteres + 1

A1   tipo de dirección

4101013033150A tiempo

14 10 10 03 33 51 A0     2014  oct 10 3:33:51   A0 ES LA ZONA HORARIA

E.g.: 99 20 21 50 75 03 21 means 12. Feb 1999 05:57:30 GMT+3

         99 02 12 05 57 30 12

040A     primer octeto  y numero de números de quien manda o sea 10

750380960041   numero que uso el operador para el mensaje

 

___________________________________________________________________________________________

OTROS PROYECTOS Y SISTEMAS

Proyectos sms

Proyecto sms wolfran rank

Olimex

Goofy española

Mikroelectronica