哈哈,不管它有沒有問題了,終于把程序?qū)懲辏覝y試成功!
第一次發(fā)送數(shù)據(jù)會出現(xiàn)問題,雖然沒有解決,但是可以先發(fā)送測試的。第二次發(fā)送就沒問題了
以下是我測試成功的代碼,有解決方案的話,不妨說說。。。謝謝
1 /***********************************************************************
2 | |
3 | TC35 GSM模塊遠(yuǎn)程控制 ver 1.0 |
4 | |
5 | CopyRight@ GDOU by Edward 2010.08 |
6 | |
7 | All Rights Reserved |
8 | |
9 | QQ:304467973 |
10 | |
11 | E-Mail:magicedward@qq.com |
12 | |
13 /************************************************************************/
14 #include<reg52.h>
15 #define uint unsigned int
16 #define uchar unsigned char
17 //sfr WDT_CONTR=0xe1; //看門狗寄存器
18 uchar i_TC35_RECE;
19
20 uchar i_receive,
21 TC35_RE[90], //儲存串口返回?cái)?shù)據(jù)
22 TC35_MAX,
23 i_TC35;
24
25
26 /* 初始化 用AT&W 寫入EEPROM 一般先在電腦前設(shè)置
27 uchar code IPR[]="AT+IPR=115200"; //波特率 115200
28 uchar code CMGF[]="AT+CMGF=1"; //短信格式為 TEXT 模式
29 uchar code CSCA[]="AT+CSCA=+86"; //設(shè)置中心號碼
30 uchar code CTNUM[]="13800759500"; //湛江移動中心號碼 +8613800759500
31 uchar code CNMI[]="AT+CNMI=1,1,0,0,1"; //自動接收短信
32 */
33 uchar code CMGS[]="AT+CMGS="; //發(fā)短信指令
34 uchar idata SNUM[]="13659717684"; //接收方號碼 //用戶號碼
35 uchar code CMGR[]="AT+CMGR=1"; //讀第一條短信
36 uchar code CMGD[]="AT+CMGD=1"; //刪除第一條短信
37 //修改用戶號碼及身份 先把它們存于電話本
38 //指令 AT+CPBW=1,+9952013659717684,145,######ARMERS
39 // 指令 11位用戶密碼 六位身份
40 uchar idata ORDER[]="ARMERS"; //默認(rèn)六位用戶身份
41 uchar code NEW_MSM[]="+CMTI:"; //新信息標(biāo)志
42 uchar code CPBR[]="AT+CPBR=1"; //讀電話本 把用戶身份/主人號碼儲存于此
43 uchar code MSM[]="I LOVE MIRACLE. MISSING YOU!"; //要發(fā)送的信息內(nèi)容
44 uchar code RFLAG1[]="+99520"; //讀電話本 返回信息標(biāo)志
45 uchar code RFLAG2[]="######";
46 uchar code AT[]="AT"; //AT測試指令
47 //uchar code OK[]="OK"; //成功返回信息
48
49 void delay(uint i) //延時(shí)函數(shù)
50 {uint i_delay,j_delay;
51 for(i_delay=0;i_delay<i;i_delay++)
52 {for(j_delay=0;j_delay<100;j_delay++)
53 {;}}
54 }
55
56 void init_serialcom() //本程序采用22.1184M晶振 其他自行更改
57 {
58 SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
59 //UART為模式1,8位數(shù)據(jù),允許接收
60 TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
61 //定時(shí)器1為模式2,8位自動重裝
62 PCON |= 0x80 ; //SMOD=1;
63 TH1 = 0xFF ;
64 TL1=0xFF; //Baud:115200 fosc="22.1184MHz
65 IE |= 0x90 ; //Enable Serial Interrupt
66 TR1 = 1 ; // timer 1 run
67 TI=1;
68
69 }
70
71
72
73 //向串口發(fā)送-個(gè)ASCII
74 void SendASC(uchar ASC)
75 {
76 SBUF=ASC;
77 while (TI== 0);
78 TI= 0 ;
79 }
80
81 //發(fā)送命令到TC35
82 void SendToTc35(uchar*p,uchar Len)
83 {
84 while(Len--)
85 {
86 SendASC(*p++);
87 }
88 }
89 //串口接收中斷函數(shù)
90 void serial () interrupt 4 using 3
91 {
92 if (RI)
93 {
94 RI = 0 ;
95 i_receive=SBUF;
96 TC35_RE[i_TC35_RECE++]=i_receive;
97 // i_TC35_RECE++;
98 if(i_TC35_RECE>89) i_TC35_RECE=89;
99 if(i_TC35_RECE>TC35_MAX){TC35_MAX=i_TC35_RECE;}
100 }
101 }
102
103
104 /* 初始化函數(shù) 用AT&W 指令鎖定后 不需再設(shè)置
105
106 void CRL_IPR() //設(shè)定波特率為 115200
107 {
108 SendToTc35(IPR,13);
109 SendASC(0x0D);
110 SendASC(0x0D);
111 SendASC(0x0A);
112 }
113
114 void CRL_TEXT() // 設(shè)定短信格式為 TEXT
115 {
116 SendToTc35(CMGF,9);
117 SendASC(0x0D);
118 SendASC(0x0D);
119 SendASC(0x0A);
120 }
121
122 void CRL_CSCA() // 設(shè)定中心號碼
123 {
124 SendToTc35(CSCA,11);
125 SendToTc35(CTNUM,11); //11位中心號碼
126 SendASC(0x0D);
127 SendASC(0x0D);
128 SendASC(0x0A);
129 }
130
131
132
133 void CRL_CNMI() // 設(shè)定為自動接收短信息
134 {
135 SendToTc35(CNMI,17);
136 SendASC(0x0D);
137 SendASC(0x0D);
138 SendASC(0x0A);
139 }
140 */
141
142 void AT_TEST() //AT 測試
143 {
144 SendToTc35(AT,2);
145 SendASC(0x0D);
146 SendASC(0x0D);
147 SendASC(0x0A);
148 }
149
150 void SENT_MSM() //向主人發(fā)送信息
151 {
152 SendToTc35(CMGS,8);
153 SendToTc35(SNUM,11);
154 SendASC(0x0D);
155 SendASC(0x0D);
156 SendASC(0x0A);
157 delay(2000);
158 SendToTc35(MSM,28);
159 SendASC(0x0D);
160 SendASC(0x0D);
161 SendASC(0x0A);
162 delay(2000);
163 SendASC(0x1A);
164 delay(2000);
165 }
166
167 void RE_BOOK() //讀取電話本
168 {
169 SendToTc35(CPBR,9);
170 SendASC(0x0D);
171 SendASC(0x0D);
172 SendASC(0x0A);
173 }
174
175
176
177 void CRL_CMGR() // 讀第一條短信息
178 {
179 SendToTc35(CMGR,9);
180 SendASC(0x0D);
181 SendASC(0x0D);
182 SendASC(0x0A);
183 }
184
185 void CRL_CMGD() // 刪除第一條短信息
186 {
187 SendToTc35(CMGD,9);
188 SendASC(0x0D);
189 SendASC(0x0D);
190 SendASC(0x0A);
191 }
192
193 void CLEAR_DAT() //數(shù)據(jù)清零
194 {
195 for(i_TC35=0;i_TC35<=TC35_MAX;i_TC35++)
196 {
197 TC35_RE[i_TC35]=0;
198 }
199 i_TC35_RECE=0;
200 TC35_MAX=0;
201 }
202
203 uchar RE_BF(uchar b,uchar TC35_RE[],uchar ORDER[]) //利用BF算法 匹配用戶身份
204 {
205 uchar bf1,bf2 ;
206 bf1=b; bf2=0;
207 while(bf1<TC35_MAX && bf2<6)
208 {
209 if(TC35_RE[bf1]==ORDER[bf2])
210 {
211 bf1++;
212 bf2++;
213 } else
214 {
215 bf1=bf1-bf2+1;
216 bf2=0;
217 }
218 }if(bf2>5) return bf1; //返回操作指令位置
219 else return 0;
220 }
221 void main()
222 {
223 uchar num,num1,orders;
224 init_serialcom();
225 delay(500);
226 // WDT_CONTR=0x37;
227 AT_TEST(); //AT測試 用于消除首次發(fā)送錯(cuò)誤
228 delay(1000);
229 CLEAR_DAT();
230 RE_BOOK();//獲取用戶號碼及身份
231 delay(6000); //確保讀取身份
232
233 if(num1=RE_BF(15,TC35_RE,RFLAG1))
234 {
235 for(num=0;num<11;num++)
236 {
237 SNUM[num]=TC35_RE[num1++]; //更新用戶號碼
238 }
239
240 if(num1=RE_BF(30,TC35_RE,RFLAG2))
241 {
242 for(num=0;num<6;num++)
243 {
244 ORDER[num]=TC35_RE[num1++]; //更新用戶身份
245 }
246 }
247
248 }
249
250 CLEAR_DAT(); //數(shù)據(jù)清零
251
252 while(1)
253 {
254
255 while(RE_BF(0,TC35_RE,NEW_MSM))
256
257 {
258 CLEAR_DAT(); //數(shù)據(jù)清零
259 CRL_CMGR() ; // 讀第一條短信息
260 delay(1000);
261 CLEAR_DAT(); //數(shù)據(jù)清零
262 CRL_CMGR() ;
263 delay(1000);
264
265 orders=TC35_RE[RE_BF(60,TC35_RE,ORDER)];
266 // SendASC(orders);
267 if(orders=='8')
268 {
269 SENT_MSM();
270 delay(10000); //確保發(fā)送成功且返回
271 }
272
273 switch(orders) //遠(yuǎn)程控制 自行更改
274 {
275 case '1': P1=0x01; break;
276 case '2': P1=0x03; break;
277 case '3': P1=0x07; break;
278 case '4': P1=0x0f; break;
279 case '5': P1=0x1f; break;
280 case '6': P1=0x3f; break;
281 case '7': P1=0x7f; break;
282 case '8': P1=0xff; break;
283 default: P1=0x00;break;
284 }
285
286 orders=0;
287 CRL_CMGD() ; // 刪除第一條短信息
288 delay(1000);
289 CLEAR_DAT(); //數(shù)據(jù)清零
290
291 }
292 }
293 }
294
295 [/code]
|