本帖最后由 颩色四葉愺 于 2015-1-7 17:41 编辑
* I2 }+ P, t7 o* Q! I! D
7 u2 v F8 B: i用到sim908进行拨话,与短信、GPS、GPRS服务,需要对模块返回来的信息进行处理,1 ^) O/ T) v0 M; x& `! H& `1 X
源程序如下:- #include "sim908.h"
/ f- ~" O0 D8 }7 C2 c - #include "stdio.h"
* T/ ~1 s x' m% D" p2 I- Z8 W0 o - #include "string.h", h+ `' _6 v* c) H8 _8 k
- #include "usart.h"7 Q h, w7 T/ W" W1 Q6 ~' g" @
- #include "ff.h"
* P3 K$ x+ C3 O, d, q - #include "includes.h"$ G& o$ Z6 V. U# s$ K
- #include "rtc.h"
. E% L! u" W" h. p/ B* e# P - #include "i2c_ee.h"# T* c0 e% m- N' E
- #include "includes.h"5 R" `8 n1 p& K
+ q V" H) d9 C9 E- u8 Sim_Battery[4]; //电池
9 z2 b. _; m. V( Y - u8 Sim_RSSI[3]; //信号强度
: p; X& E6 x& P! B - u8 Sim_Operator = 0; //运营商 1为中国移动
3 ]( c+ P2 J3 i$ `- H% J3 x) M4 s - 7 O2 N" {! z2 g- X8 x5 C" l
- u8 GSM_Response[10];
7 n, I4 O# [; g! ` i - u8 RingNumber[20]; //来电号码" q, E4 e, w2 Q) B* Z
- u8 Messagenum; //保存短信数目( b7 }. w! M+ J+ x9 d' I3 ~5 L
- u8 Messagebuff[50]; //保存短信状态 0 空 1 未读 2 命令短信 3非命令短信3 t2 n% ?) P v6 r
- 2 c: W5 B+ V# g, a
- char ADMINISTRATORPHONE[20] = "13729058953";
% s0 m, ^0 [# F. l6 U - char IPADDR[20] = "220.170.79.210";
! {: G: ^1 C* w0 H# k+ Y; [ - char COM[6] = "40487";
1 u2 ]7 V! Y; b% L3 F& A - char PASSWORD[10] = "0000000000";
$ Z" J- {9 ~0 y/ A$ { X( h - u8 LOCATION[30];
4 h- {: a& v4 E - & G, Q& j& u2 q4 a0 B
- Messagestr MES_STR;, |& g( b! K7 Y+ r) v- r6 M
- GPSStruct GPS_STR;: w' ]+ b/ @6 V" f
- 8 a! [4 W% }) r0 s# n% K" S3 g: n2 P
- 1 @$ _# X3 L9 v, q7 c* ]
- /*
. `/ [9 ~$ A: |* d7 s4 V" P - 函数名:Sim908_IOConfig
1 r/ N7 P& C( p9 L6 b: w - 描述: 复位- X6 D1 j2 a, Q( D2 o: a9 y8 f/ {
- 输入: 无4 v1 P' t8 u- \! q" B5 {! M# p- W
- 输出: 无, t; {3 p7 g" v' @$ }) U3 H% L: b6 f
- */( C$ V8 ^% G/ a' ]. z& I7 D( k8 a
- void Sim908_IOConfig( void )2 ?' ?' B# y. `7 K8 E) `
- {
% o) Y+ P3 v' L0 s. X - GPIO_InitTypeDef GPIO_InitStructure;
8 V" s) M- S4 [2 F" }( u - RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOA, ENABLE); , |. y! q: [* U% a+ o: G( g
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; % [. B8 Q, y5 M H: G" B
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
0 T4 k$ Y2 G- X% C! L4 m \; E - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
# [- d/ c2 M" a3 n/ p - GPIO_Init(GPIOA, &GPIO_InitStructure); ) s- Z; [2 }* T* d
-
. b/ C1 L6 Y' f1 Q - }0 t% B: L7 A' {2 P: f8 ^% I
, h! ~) w! k! L9 |- 6 \/ W9 i0 Q+ J& v7 r
- void Sim908_Reset( void )' m8 Y, {9 l# ~
- {* Z" J# f7 g7 h" ~' t3 k2 U- `/ }
- OS_ERR err;
' h0 q+ h" |+ ]0 y - GPIO_SetBits(GPIOA, GPIO_Pin_1);0 z' c, L8 ]1 b7 d. N
- OSTimeDlyHMSM( 0, 0, 2, 0, OS_OPT_TIME_HMSM_STRICT, &err);1 D3 j, M: G9 T
- GPIO_ResetBits(GPIOA, GPIO_Pin_1);
+ a! N! ?% ^! u - }' J( J1 l7 f1 J. ?) h4 E3 J
- ! I* O Q, [! j3 o6 }; p G
- ) { `7 `% C; d) P( e$ r
- /*
- j( O# ^; ]' j2 t - 函数名:Sim908_SendCmd* N8 {2 u6 \, r- Y
- 描述: 发送at命令,并检验是否收到想要的响应
, Z3 k" O8 Q u) h+ ? - 输入: u8 *cmd 要发送的命令/ {6 [5 ?0 K) d- s4 B1 o. C4 E0 f
- u8 *ack 期待的响应
; B$ _0 s" `: j+ l h( [ - u16 waittime 等待时间 单位10ms
\8 X, S" A2 Q0 A: I) r - u8 *pBuff 接收响应的缓存区地址 为NULL则不保存响应数据: ^$ P+ f3 j5 }* I
- 输出: $ E1 D3 b3 s) I7 o' \* e. i
- */
7 `) b% i( I( a) \4 g6 a8 J - u8 Sim908_SendCmd(u8 *cmd, u8 *ack, u16 waittime, u8 *pBuff)9 M& N2 }( l' v8 ]) f
- {
! Y3 E# T& O) B2 L# G& f - u8 res = SIM_ERR_OTHER;6 V# t3 K5 q- o) a) @) k' g# u4 t
- u8 *pdata = NULL;) f! Y6 v) H+ A2 m9 N
- CPU_TS ts;0 [1 H% k8 t0 ~( z* @
- OS_ERR err;
# O: C( {: I+ D% m2 B8 u: ? - OS_MSG_SIZE msg_size;
- D6 d# z% M7 ^( | K) Y -
4 _* ~( k/ r m- c6 M6 r# ? L0 n7 { - OSMutexPend(&Mutex_USART2, 30000, OS_OPT_PEND_BLOCKING, &ts, &err);
# K: ?$ x7 A; }4 C - if( (u32)cmd <= 0xff ) //用于发送结束标志 0x1A; c. y- X4 B2 q+ x7 V+ Q- B
- {
' X7 b1 _8 J+ r" ` - USART2->DR = (u32)cmd;
6 V. _. `% p8 J F5 S: k' T - }9 R, w# O) {( ]: A+ o4 E, y4 ?
- else$ i& s+ @$ J9 q2 k. [! B
- {
2 ?1 f* ?% h$ I - printf("%s\r\n", ( char *)cmd);
9 V' p: }6 K# t* ?* p# c - }/ B" a1 }' D; k2 Z
- if(ack != NULL)/ U' d5 z# [9 s- z' a
- {6 \. Q: ~9 s; g: E' K* [
- strcpy((char *)&GSM_Response[0], (char *)ack);
: V+ p V t. {* V4 f0 x - while(waittime--)
8 e% t% ]* W0 C3 U* [& o6 S - {1 t5 l- x2 ~6 P0 f, }+ A* k9 i
- //OSSemPend(&Sem_GSMResponse, 10, OS_OPT_PEND_BLOCKING, &ts, &err); //等待信号量
) T* @; w. a: g5 M* h3 s3 p - pdata = OSQPend(&Q_GSMResponse, 10, OS_OPT_PEND_BLOCKING, &msg_size, &ts, &err);0 k. ^8 \: N( r# m+ P# y
- if(err == OS_ERR_NONE)% n3 ~7 X! ^/ A8 m- O4 g% k2 ^+ j: a
- {6 U' i1 u5 \" i0 i+ E. K
- if((NULL != pBuff)&&(NULL != pdata)), j( E5 R# J& m
- {
" K$ C E2 V' t& T# b. G6 \ - strcpy((char *)pBuff, (char *)pdata);/ d g8 J3 @4 J8 E7 ^8 ?
- }* f p8 c! ~. Z% T* s
- OSMemPut(&MyPartition, pdata, &err);
( O& C( k! s9 W1 T: H/ g9 Q Z - res = SIM_ERR_NONE;
; } | {5 U6 E$ y6 o$ @0 v, | - break;
& P; v0 r: y/ e, D% Z; J - }( c9 J1 r9 Y! q/ a& R
- }; {8 |1 T G" T$ ~5 q1 S* S
- if(err != OS_ERR_NONE)0 Z1 a6 V( y4 X* h% |2 K1 T
- {" a* }( E4 m+ p( {! S8 M6 _% M
- res = SIM_ERR_TIMEOUT;
- ]0 S& H: L7 X8 _. F2 ^ - }! J# f! y% x" z& j
- }9 T* Y% N* V- s
- OSMutexPost(&Mutex_USART2, OS_OPT_POST_NONE, &err);
( k6 k5 Q2 K- Z1 X+ O' V - 0 c# Y1 Q7 x, H( U8 n! Y
- return res;2 u2 y0 |3 s" a1 t( x+ |: b4 W
- }8 E. z4 o: p/ k/ u( B" x
- J3 G: }4 q1 l, H
( _! a2 |9 l$ k& S' x1 W H
6 U( f4 U- f! R) J. T7 k- 4 K) ~$ m3 P" f( V. i3 l
5 U2 o! S; r% N( c0 v- V
& a/ c4 ~# ?, |2 {, |
6 k) Q# B$ t6 [- 6 O, j+ _& I5 Q7 R: y$ k
复制代码
; C8 _2 t- b7 O" E9 O7 B( \: U% t8 J$ X6 _8 @
|
6 U9 s$ ?0 {& p6 a0 k
: {; w! }2 j: S* O: ^, G
. E, m! v7 _5 q; ]! t; ^
/*
函数名:Sim908_GetGPSInformation
描述: 获取GPS的相关数据
输入: GPSStruct *gpsstruct 保存gps数据的结构体
u8 *str 保存gps数据的数组指针& h. W& \* d# ]# r& v
输出: 1 操作成功 0 操作失败4 U$ U g! u; K% {# X; Y- s2 h m8 K
*/' l" q X' u3 |+ X* a
u8 Sim908_GetGPSInformation(GPSStruct *gpsstrucr, u8 *pdatabuff)1 e0 Y5 {( ^/ y+ Q
{. \9 j' }4 P* M' L, Q$ E
' I. _3 l1 l4 c* H) ]+ ?1 K# J' \
u8 *p1 = NULL;
u8 *p2 = NULL;( G, i, [4 I1 u) y
u8 res = SIM_ERR_OTHER;0 J4 l+ x: e8 b0 ?# |& O# o
u8 gpsdatabuff[100];
9 h2 {+ r: r' T, l, k3 o
if(SIM_ERR_NONE == Sim908_SendCmd("AT+CGPSSTATUS?", "D Fix", 200, NULL)). u3 C/ h9 Y/ s% a* ?0 l! h
{
if(SIM_ERR_NONE == Sim908_SendCmd("AT+CGPSINF=32", ",A,", 200, &gpsdatabuff[0]))9 a) ]) M7 S) d/ h9 \% ~) w- S. q
{
if(NULL != pdatabuff)1 ^) v, q, R0 b# j) K; _
{2 v9 J5 d! t \% k
strcpy(pdatabuff, gpsdatabuff);
}
p1 = (u8 *)strstr((char *)gpsdatabuff, ",");
p2 = (u8 *)strstr((char *)(p1+1), ",");8 p7 |; ]# R5 f7 u
Sim908_CopyStr(gpsstrucr->Time, p1+1, p2);
p1 = (u8 *)strstr((char *)(p2+1), ",");% k" w+ ?& o3 N/ V/ m. Q7 u: B) S
p2 = (u8 *)strstr((char *)(p1+1), ",");
Sim908_CopyStr(gpsstrucr->Latitude, p1+1, p2+2);
p1 = p2 + 3;- l& W5 Q0 T# y3 Q8 D* @
p2 = (u8 *)strstr((char *)p1, ",");
Sim908_CopyStr(gpsstrucr->Longtude, p1, p2+2);
p1 = p2 + 3;
p2 = (u8 *)strstr((char *)p1, ",");
Sim908_CopyStr(gpsstrucr->Speed, p1, p2);) C, ^+ r% x8 \
9 p7 e4 S5 Q7 W. Y7 U5 N' ?
p1 = p2 + 1;" ~- a4 A v3 |6 \+ H- p9 I/ u$ \
p2 = (u8 *)strstr((char *)p1, ",");" @. w; G6 _+ J: U5 ^" R
Sim908_CopyStr(gpsstrucr->Direction, p1, p2);
p1 = p2 + 1;
p2 = (u8 *)strstr((char *)p1, ",");! ?* Y; p" [+ x, K, h
Sim908_CopyStr(gpsstrucr->Data, p1, p2);
res = SIM_ERR_NONE;
}! f: I; t# D) W/ b: O4 ^
}
else* t; C X, Y$ d( g8 g ^
{6 r% v" `$ o0 v2 j/ W
res = SIM_ERR_GPSNOTFIX;; b- J. x- _9 @! M6 P7 p
} Q& E; X- |8 s
return res;
}$ {' f. v! x) r0 b3 \7 l* A9 X" O. K
/*+ n9 k" `, a# O) k5 w- {1 |
函数名:Sim908_GPSConvert
描述: GPS单位转换 GPS读出的数据单位是 (ddmm.mmmm) 要转换为d3 y& ^- r" Y3 S% y3 d4 r) z2 Y
输入: u8 *latitude 转换前的纬度
u8 *longtude 转换前的经度1 i( D# ~7 y0 Q# h6 Q
u8 *location 转换后的经纬度信息
输出: 无% {6 b2 f- M0 Q* | X* ]
*/
void Sim908_GPSConvert(u8 *latitude, u8 *longtude, u8 *location )9 }; z$ _! h' C: i' s7 F" r6 g0 A* k/ w
{
u8 *p1 = NULL;, Y! p' r6 j3 o& \
u8 *p2 = NULL;
u32 data = 0;
u8 i = 0;
u8 j = 0;' T9 J: H. f z2 ]
u8 a = 0;
p1 = (u8 *)strstr((char *)latitude, ".");
a = p1 - latitude;
+ s3 s& j; l2 v o+ H- T$ r& e9 r% q
if(a == 5)
{* l3 S, b4 N: b7 e: h; ?' z
for(j=0; j<3; j++)
{2 }# X" @% O2 E$ V; Q% b* P' V
location[i] = latitude[i];
i++;' P3 k4 F* j1 M3 A* z* N9 X
}
} j$ b& C2 E- Y! W( h1 d
if(a == 4); Y: c# R0 L N# `8 A' w* s
{2 g. j+ c: q- D- L
for(j=0; j<2; j++)0 W8 q& x3 G8 H4 h6 w9 ]% M6 B9 |
{
location[i] = latitude[i];5 E8 |6 U+ ]- ~- t+ ?! B
i++;
}- g3 o- I: D* ^, Q1 v0 \# a9 F
}2 o% r8 \) e& w0 T; d; o8 ?" P: w; f
if(a == 3)
{9 [6 y9 G" h; M/ B8 D1 h
for(j=0; j<1; j++), A" {. G2 y; X
{7 {# d* H7 e% M, `" e
location[i] = latitude[i];
i++;* X7 ~/ L) Z2 o: N' j) d" P: Y
} ~. ]" `+ Z6 r' E
}6 U/ t3 ~5 b4 v
location[i] = '.';
data = 0;; p: l- M$ x% p2 c# p
data += (*(p1 - 2) - '0') * 10000000;2 l3 y' N+ v+ g
data += (*(p1 - 1) - '0') * 1000000;$ [/ m/ O) ^2 J, B0 D3 f
data += (*(p1 + 1) - '0') * 100000;
data += (*(p1 + 2) - '0') * 10000;1 P, r' R9 L' \* `* d
data += (*(p1 + 3) - '0') * 1000;
data += (*(p1 + 4) - '0') * 100;+ n$ s3 b+ d- D' i: E- ~! _( I
data += (*(p1 + 5) - '0') * 10;4 [" s: z6 O; `' j6 V# t# K
data += (*(p1 + 6) - '0') ;, c9 _( {9 Y2 T# G" \6 i- w; f
data /= 60;
2 ?0 B8 K! X' D8 H' I, v
for(j=6; j>0;j--)
{
location[i+j] = data%10 + '0' ;
data /= 10;
}
if(strstr((char *)latitude, "N"))
{( R5 @3 @3 n$ B; b1 K3 X. M
location[i+7] = 'N';! O6 Q7 K3 G z; p0 }& @
location[i+8] = ' ';! G, D! g0 ^- \5 ~: R2 W; p% [
}& F, l. T- L \( g6 R0 M4 [
if(strstr((char *)latitude, "S"))
{
location[i+7] = 'N';; k- O2 T2 b( ^: W
location[i+8] = ' ';
}
i += 9;
; V0 o2 Q7 w- {& q, X! u6 T. N, b/ p7 I
p2 = (u8 *)strstr((char *)longtude, ".");5 ?- p# c& A4 B: f2 H, E! L
a = p2 - longtude;# Z; p/ y7 j. r1 z$ L
) B5 |0 [& u5 j) ^9 ^, C+ j/ [
if(a == 5)
{" w. ^4 u8 s+ @# X
for(j=0; j<3; j++)
{
location[i] = longtude[j];4 I/ ~3 _6 ]3 L. L
i++;
}0 }1 c* A R1 C- [
}
if(a == 4)8 X/ V7 m9 S& h* S3 r8 a
{/ A: `0 M L" ]+ c3 [
for(j=0; j<2; j++)$ K/ S% H0 N3 X( l8 r( t* [* e5 y
{
location[i] = longtude[j];
i++;
}
}
if(a == 3)
{% f0 v1 u! y s H# l7 x
for(j=0; j<1; j++)) ~- a7 |. q/ N. w( e
{( T1 y6 I& c v! E0 b
location[i] = longtude[j];
i++;
}$ H, J2 i/ w q3 h1 d( B7 ~
}* M* D# v: Y' l' }
) a! s$ u7 i% v% |
location[i] = '.';
data = 0;$ s3 O! V& B" P- L0 a' Q/ U3 Z& ~
data += (*(p2 - 2) - '0') * 10000000;6 X) ?# e9 [) Z/ u/ W" O
data += (*(p2 - 1) - '0') * 1000000;5 {6 m8 E- j+ w% y5 ^
data += (*(p2 + 1) - '0') * 100000;
data += (*(p2 + 2) - '0') * 10000;
data += (*(p2 + 3) - '0') * 1000;& W* A& [! ^8 V1 k* \
data += (*(p2 + 4) - '0') * 100;8 ]7 @8 U) U% l+ c: V
data += (*(p2 + 5) - '0') * 10;4 r& A$ ?/ R3 g: o0 v! r# W
data += (*(p2 + 6) - '0') ;3 m7 d* }: o. H5 `3 H) j
" W0 [# ~6 F6 P
data /= 60;
9 F9 A; a- g8 d% F
8 ^! l- ]- @0 x: c3 J8 H
for(j=6; j>0;j--)
{' H7 E7 T0 K. e, @1 k
location[i+j] = data%10 + '0' ;. h) t& q. W4 d, x
data /= 10;( O( j# {2 F$ j/ O* H4 Z$ F
}
# ]+ w V* g; ?: M; r
if(strstr((char *)longtude, "W"))
{
location[i+7] = 'W';# F. Y Q3 \6 p5 s
location[i+8] = '\0';
}- m8 }( s- ?/ B" I& Y4 Q% b
if(strstr((char *)GPS_STR.Longtude, "E")); r9 J: w. S. F- c: ]2 ?; s
{) T, n* H# \5 ?" V/ C/ }- O
location[i+7] = 'E';! y9 K, t& |' J8 e) I, N" J; A
location[i+8] = '\0';
}
v4 K( c; a& B) h; I) P4 L0 d
}