寫了個TC35的程序,但是,不知道為什么,每次重啟的時候,第一次發送的數據會不完整
的?請問這是什么原因啊???
#include<reg52.h> #define uint unsigned int #define uchar unsigned char //sfr WDT_CONTR=0xe1; //看門狗寄存器 uchar i_TC35_RECE; uchar i_receive,
TC35_RE[90], //??? 為什么90不能設定得100呢??????
//查過有關資料后終于明白了,原來是變量類型沒有設置,data idata pdata code
//xdata這些可不能忽略,因為資源是有限的,超出了就不能編譯了。
TC35_MAX,
i_TC35;
uchar code CMGR[]="AT+CMGR=1"; //讀第一條短信
uchar code CMGD[]="AT+CMGD=1"; //刪除第一條短信
uchar code ORDER[]="ARMERS"; //六位用戶身份
void delay(uint i)
{uint i_delay,j_delay;
for(i_delay=0;i_delay<i;i_delay++)
{for(j_delay=0;j_delay<100;j_delay++)
{;}}
}
void init_serialcom()
{
SCON = 0x50 ; //SCON: serail mode 1, 8-bit UART, enable ucvr
//UART為模式1,8位數據,允許接收
TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
//定時器1為模式2,8位自動重裝
PCON |= 0x80 ; //SMOD=1;
TH1 = 0xFF ;
TL1=0xFF; //Baud:115200 fosc="22.1184MHz
IE |= 0x90 ; //Enable Serial Interrupt
TR1 = 1 ; // timer 1 run
TI=1;
}
//向串口發送-個ASCII
void SendASC(uchar ASC)
{
SBUF=ASC;
while (TI== 0);
TI= 0 ;
}
//發送命令到TC35
void SendToTc35(uchar*p,uchar Len)
{
while(Len--)
{
SendASC(*p++);
}
}
//串口接收中斷函數
void serial () interrupt 4 using 3
{
if (RI)
{
RI = 0 ;
i_receive=SBUF;
TC35_RE[i_TC35_RECE++]=i_receive;
// i_TC35_RECE++;
if(i_TC35_RECE>89) i_TC35_RECE=89;
if(i_TC35_RECE>TC35_MAX){TC35_MAX=i_TC35_RECE;}
}
}
void CRL_CMGR() // 讀第一條短信息
{
SendToTc35(CMGR,9);
SendASC(0x0D);
SendASC(0x0D);
SendASC(0x0A);
}
void CRL_CMGD() // 刪除第一條短信息
{
SendToTc35(CMGD,9);
SendASC(0x0D);
SendASC(0x0D);
SendASC(0x0A);
}
void CLEAR_DAT() //數據清零
{
for(i_TC35=0;i_TC35<=TC35_MAX;i_TC35++)
{
TC35_RE[i_TC35]=0;
}
i_TC35_RECE=0;
TC35_MAX=0;
}
void main()
{
uchar oders;
init_serialcom();
delay(1000);
CRL_CMGR() ;//進入循環前,我向串口發送兩條讀短信的指令,就第一條會缺少一個‘T’
CRL_CMGR() ;
// WDT_CONTR=0x37;
CLEAR_DAT(); //數據清零
while(1)
{
if((TC35_RE[2]=='+')&&(TC35_RE[3]=='C')&&(TC35_RE[4]=='M')&&
(TC35_RE[5]=='T')&&(TC35_RE[6]=='I'))
{
//CLEAR_DAT(); //數據清零
CRL_CMGR() ; // 讀第一條短信息
delay(5000);
// CLEAR_DAT(); //數據清零
CRL_CMGR() ;
delay(5000);
if((TC35_RE[72]==ORDER[0])&&(TC35_RE[73]==ORDER[1])&&(TC35_RE[74]==ORDER[2])&&(TC35_RE[75]==ORDER[3])&&(TC35_RE[76]==ORDER[4])&&(TC35_RE[77]==ORDER[5])) {
oders=TC35_RE[78];
CLEAR_DAT();
}else
{
oders=0;
CLEAR_DAT();
}
switch(oders)
{
case 0: P1=0x00; break;
case 1: P1=0x01; break;
case 2: P1=0x03; break;
case 3: P1=0x07; break;
case 4: P1=0x0f; break;
case 5: P1=0x1f; break;
case 6: P1=0x3f; break;
case 7: P1=0x7f; break;
case 8: P1=0xff; break;
}
CRL_CMGD() ; // 刪除第一條短信息
delay(2000);
CLEAR_DAT(); //數據清零
delay(2000);
}else
{
// WDT_CONTR=0x37; //喂狗
// delay(5000);
}
}
}
多多指教!!!
發送的問題還是接收的問題???
哈哈,不管它有沒有問題了,終于把程序寫完,而且測試成功!
第一次發送數據會出現問題,雖然沒有解決,但是可以先發送測試的。第二次發送就沒問題了
以下是我測試成功的代碼,有解決方案的話,不妨說說。。。謝謝
1 /***********************************************************************
2 | |
3 | TC35 GSM模塊遠程控制 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], //儲存串口返回數據
22 TC35_MAX,
23 i_TC35;
24
25
26 /* 初始化 用AT&W 寫入EEPROM 一般先在電腦前設置
27 uchar code IPR[]="AT+IPR=115200"; //波特率 115200
28 uchar code CMGF[]="AT+CMGF=1"; //短信格式為 TEXT 模式
29 uchar code CSCA[]="AT+CSCA=+86"; //設置中心號碼
30 uchar code CTNUM[]="13800759500"; //湛江移動中心號碼 +8613800759500
31 uchar code CNMI[]="AT+CNMI=1,1,0,0,1"; //自動接收短信
32 */
33 uchar code CMGS[]="AT+CMGS="; //發短信指令
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"; //默認六位用戶身份
41 uchar code NEW_MSM[]="+CMTI:"; //新信息標志
42 uchar code CPBR[]="AT+CPBR=1"; //讀電話本 把用戶身份/主人號碼儲存于此
43 uchar code MSM[]="I LOVE MIRACLE. MISSING YOU!"; //要發送的信息內容
44 uchar code RFLAG1[]="+99520"; //讀電話本 返回信息標志
45 uchar code RFLAG2[]="######";
46 uchar code AT[]="AT"; //AT測試指令
47 //uchar code OK[]="OK"; //成功返回信息
48
49 void delay(uint i) //延時函數
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位數據,允許接收
60 TMOD |= 0x20 ; //TMOD: timer 1, mode 2, 8-bit reload
61 //定時器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 //向串口發送-個ASCII
74 void SendASC(uchar ASC)
75 {
76 SBUF=ASC;
77 while (TI== 0);
78 TI= 0 ;
79 }
80
81 //發送命令到TC35
82 void SendToTc35(uchar*p,uchar Len)
83 {
84 while(Len--)
85 {
86 SendASC(*p++);
87 }
88 }
89 //串口接收中斷函數
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 /* 初始化函數 用AT&W 指令鎖定后 不需再設置
105
106 void CRL_IPR() //設定波特率為 115200
107 {
108 SendToTc35(IPR,13);
109 SendASC(0x0D);
110 SendASC(0x0D);
111 SendASC(0x0A);
112 }
113
114 void CRL_TEXT() // 設定短信格式為 TEXT
115 {
116 SendToTc35(CMGF,9);
117 SendASC(0x0D);
118 SendASC(0x0D);
119 SendASC(0x0A);
120 }
121
122 void CRL_CSCA() // 設定中心號碼
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() // 設定為自動接收短信息
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() //向主人發送信息
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() //數據清零
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測試 用于消除首次發送錯誤
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(); //數據清零
251
252 while(1)
253 {
254
255 while(RE_BF(0,TC35_RE,NEW_MSM))
256
257 {
258 CLEAR_DAT(); //數據清零
259 CRL_CMGR() ; // 讀第一條短信息
260 delay(1000);
261 CLEAR_DAT(); //數據清零
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); //確保發送成功且返回
271 }
272
273 switch(orders) //遠程控制 自行更改
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(); //數據清零
290
291 }
292 }
293 }
294
295 [/code]
只有第一次發送有問題蠻奇怪的,可惜我沒tc35i,要不可幫你試試了
只有第一次發送有問題蠻奇怪的,可惜我沒tc35i,要不可幫你試試了
問題并不是只存在TC35中。。。。
在51hei里,用你們的串口與單片機通訊那個程序測試也一樣有這樣的問題。
那我晚上仔細研究下這個問題
樓主乃強人,果然是這個問題,繼續共享些有用的程序給大家啊
| 歡迎光臨 (http://www.raoushi.com/bbs/) | Powered by Discuz! X3.1 |