个粉丝

问答

专栏

资料

 发布于  2008-05-25 14:32:58
采纳率 0%
128个问答
5795

单片机控制GSM模块Tc35i时的问题

   
最近在做毕业设计用到GSM无线模块进行短信数据发送接收,在使用8位单片机控制Tc35i时出现了问题,百思不得其解,贴出程序请大家帮忙~~


发送端程序如下:

#include "reg51.h"
#include "string.h"

#define uchar unsigned char
#define uint unsigned int

uchar RsBuf[24];
uchar FlagRs = 0;

char code Init_Tc35i[] = "^SYSSTART";
char code AT_Tc35i[] = "AT+";           //连机
char code Send_Tc35i[] = "CMGS=";       //发送信息
char code AT_Code[]="OK";
char code SK[]=">";
char code PhonNum[] = "15880022125";
char code Test[] = "test123";

//延时t毫秒
void Delay(uchar t)
{
uint i;
while(t--)
{
  for(i=0;i<125;i++)
  {}
}
}

//串口初始化
void InitCom(void)
{
SCON = 0x50;//串口方式1,8位UART
TMOD = 0x20;//定时器T1,工作方式2,8位重载
PCON = 0x80;//波特率加倍
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;     //T1开始
ES = 1;
}

//发送一个ASCII
void SendASC(uchar ASC)
{
bit es;
es = ES;
ES = 0;
TI = 0;
SBUF = ASC;
while(!TI);
TI = 0;
ES = es;
}

//发送命令到Tc35i
void SendComTc35i(uchar *p,uchar Long)
{
while(Long--)
{
  SendASC(*p++);
}
}

//  通讯中断接收程序
void Rs232_Rxd(void) interrupt 4 using 1
{
if(RI==1)
{
  RI=0;
  RsBuf[FlagRs++]=SBUF;
  if(FlagRs>=sizeof(RsBuf))
  {
   FlagRs=0;
  }                 
}
}

//搜索Tc35i
void Search_Tc35i(void)
{
uchar *p;
while(1)
{
  ES = 1;
  p = strstr(RsBuf,Init_Tc35i);
  if(p != NULL) break;
}
}

//清缓冲区
void ClrRsBuf()
{
uchar len;
len = strlen(RsBuf);
while(len--)
{
  RsBuf[FlagRs++] = 0;
}
}

// 发送AT连机命令
void Send_AT(void)
{
uchar *p;
while(1)
{
     ClrRsBuf();
     SendComTc35i(AT_Tc35i,2);    //"AT"
     SendASC(0x0d);
                              
     ES=1;                        //等待应答"OK"
     Delay(1000);
  Delay(1000);
     p=strstr(RsBuf,AT_Code);
     if(p!=NULL) break;
}
}

//发送短信息
void SendMsgStart(void)
{
uchar *p,i=250;
SendComTc35i(AT_Tc35i,3);    //"AT+"
SendComTc35i(Send_Tc35i,sizeof(Send_Tc35i)-1);//"AT+CMGS="
SendASC(0x22);
SendComTc35i(PhonNum,sizeof(PhonNum)-1);         
SendASC(0x22);                                //"AT+CMGS="PhonNum""
SendASC(0x0d);
ES=1;
while(i--)
{
    Delay(1500);        //Get">"
    p=strstr(RsBuf,SK);//">"
    if(p!=NULL)
    {
      ClrRsBuf();
      Delay(1000);    //Get">"
      break;
  }
}
}


void main(void)
{
EA = 1;
InitCom();
Delay(1000);
Search_Tc35i();
Delay(1000);
Send_AT();
Delay(1000);
SendMsgStart();
Delay(1000);
SendComTc35i(Test,sizeof(Test)-1);
SendASC(0x1a);
}

上面是单片机控制GSM模块的测试代码,出现问题如下:
1、首先,主程序中并没有循环,但是在程序运行主函数时却出现循环现象!!
2、主函数加了Search_Tc35i()函数时,程序运行到Send_AT()进入while循环,不断发送AT等待返回OK,结果程序却会无由地断掉(貌似是跑飞了);但是去掉了Search_Tc35i()后整个程序运行正常~~~

至今也找不出问题所在,恳请大家指点迷津!

[ 本帖最后由 lush 于 2008-5-28 12:17 编辑 ]
我来回答
回答4个
时间排序
认可量排序

aduadu

0个粉丝

98

问答

0

专栏

45

资料

aduadu 2008-05-25 22:32:58
认可0
哈哈 你没发现吧 !
综合你的一二问题可以肯定地是 你的程序down在了
search_tc35i()那里! 是没有等到search_tc35!()的响应!
你在search_tc35!中人为案件控制它中断!!然后看看!

aduadu

0个粉丝

98

问答

0

专栏

45

资料

aduadu 2008-05-27 00:40:34
认可0
可以肯定地一点就是循环没有打破,既然在循环那么就是你的GSM模块没有回应。要读读文档看看GSM模块是怎么响应的。。
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区