寫了個TC35的程序,但是,不知道為什么,每次重啟的時候,第一次發(fā)送的數(shù)據(jù)會不完整
的?請問這是什么原因��???
#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不能設(shè)定得100呢??????
//查過有關(guān)資料后終于明白了,原來是變量類型沒有設(shè)置,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位數(shù)據(jù),允許接收 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; } //向串口發(fā)送-個ASCII void SendASC(uchar ASC) { SBUF=ASC; while (TI== 0); TI= 0 ; } //發(fā)送命令到TC35 void SendToTc35(uchar*p,uchar Len) { while(Len--) { SendASC(*p++); } } //串口接收中斷函數(shù) 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() //數(shù)據(jù)清零 { 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() ;//進入循環(huán)前,我向串口發(fā)送兩條讀短信的指令,就第一條會缺少一個‘T’
CRL_CMGR() ;
// WDT_CONTR=0x37; CLEAR_DAT(); //數(shù)據(jù)清零 while(1) { if((TC35_RE[2]=='+')&&(TC35_RE[3]=='C')&&(TC35_RE[4]=='M')&& (TC35_RE[5]=='T')&&(TC35_RE[6]=='I')) { //CLEAR_DAT(); //數(shù)據(jù)清零 CRL_CMGR() ; // 讀第一條短信息 delay(5000); // CLEAR_DAT(); //數(shù)據(jù)清零 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(); //數(shù)據(jù)清零 delay(2000); }else { // WDT_CONTR=0x37; //喂狗 // delay(5000); } } }
多多指教!!!
發(fā)送的問題還是接收的問題???
哈哈,不管它有沒有問題了,終于把程序?qū)懲辏覝y試成功!
第一次發(fā)送數(shù)據(jù)會出現(xiàn)問題,雖然沒有解決,但是可以先發(fā)送測試的。第二次發(fā)送就沒問題了
以下是我測試成功的代碼,有解決方案的話,不妨說說。。。謝謝
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], //儲存串口返回數(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"; //默認六位用戶身份 41 uchar code NEW_MSM[]="+CMTI:"; //新信息標志 42 uchar code CPBR[]="AT+CPBR=1"; //讀電話本 把用戶身份/主人號碼儲存于此 43 uchar code MSM[]="I LOVE MIRACLE. MISSING YOU!"; //要發(fā)送的信息內(nèi)容 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) //延時函數(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 //定時器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ā)送-個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ā)送錯誤 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) //遠程控制 自行更改 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]
只有第一次發(fā)送有問題蠻奇怪的,可惜我沒tc35i,要不可幫你試試了
只有第一次發(fā)送有問題蠻奇怪的,可惜我沒tc35i,要不可幫你試試了
問題并不是只存在TC35中。。。。
在51hei里,用你們的串口與單片機通訊那個程序測試也一樣有這樣的問題。
那我晚上仔細研究下這個問題
樓主乃強人,果然是這個問題,繼續(xù)共享些有用的程序給大家啊
歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |