找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7480|回复: 7
打印 上一主题 下一主题
收起左侧

[求助]串口发送问题

[复制链接]
跳转到指定楼层
楼主
ID:25357 发表于 2010-8-15 11:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

写了个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);
 
  }
  
  
   }
 }

 

 


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:25357 发表于 2010-8-15 11:50 | 只看该作者

多多指教!!!

 

[此贴子已经被作者于2010-8-15 12:12:58编辑过]
回复

使用道具 举报

板凳
ID:25357 发表于 2010-8-15 22:33 | 只看该作者

发送的问题还是接收的问题???

 

回复

使用道具 举报

地板
ID:25357 发表于 2010-8-16 10:52 | 只看该作者

哈哈,不管它有没有问题了,终于把程序写完,而且测试成功!

第一次发送数据会出现问题,虽然没有解决,但是可以先发送测试的。第二次发送就没问题了

以下是我测试成功的代码,有解决方案的话,不妨说说。。。谢谢


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]
回复

使用道具 举报

5#
ID:1 发表于 2010-8-16 12:58 | 只看该作者

只有第一次发送有问题蛮奇怪的,可惜我没tc35i,要不可帮你试试了

回复

使用道具 举报

6#
ID:25357 发表于 2010-8-16 14:09 | 只看该作者
以下是引用admin在2010-8-16 12:58:31的发言:

只有第一次发送有问题蛮奇怪的,可惜我没tc35i,要不可帮你试试了

问题并不是只存在TC35中。。。。

在51hei里,用你们的串口与单片机通讯那个程序测试也一样有这样的问题。

回复

使用道具 举报

7#
ID:1 发表于 2010-8-16 15:14 | 只看该作者

那我晚上仔细研究下这个问题

回复

使用道具 举报

8#
ID:1 发表于 2010-8-18 00:06 | 只看该作者

楼主乃强人,果然是这个问题,继续共享些有用的程序给大家啊

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表