单片机控制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 编辑 ]
发送端程序如下:
#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个
时间排序
认可量排序
认可0
认可0
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币
Markdown 语法
- 加粗**内容**
- 斜体*内容*
- 删除线~~内容~~
- 引用> 引用内容
- 代码`代码`
- 代码块```编程语言↵代码```
- 链接[链接标题](url)
- 无序列表- 内容
- 有序列表1. 内容
- 缩进内容
- 图片![alt](url)
相关问答
-
2016-03-22 15:04:03
-
2008-07-15 18:06:15
-
2013-05-15 22:19:30
-
2013-11-16 10:13:44
-
2013-11-16 10:09:59
-
2008-07-15 17:37:51
-
62020-11-24 17:44:55
-
2018-12-18 14:32:17
-
2020-10-05 19:11:30
-
02018-12-13 11:21:54
-
12008-07-15 17:26:31
-
2020-11-12 18:10:22
-
2021-01-01 12:31:19
-
2008-07-29 12:56:25
-
2008-07-15 18:45:12
-
2019-08-20 15:37:58
-
02008-07-11 20:58:57
-
2019-01-02 09:27:24
-
2018-12-20 09:07:48
无更多相似问答 去提问
点击登录
-- 积分
-- E币
提问
—
收益
—
被采纳
—
我要提问
切换马甲
上一页
下一页
悬赏问答
-
20帮忙交叉编译个源码
-
5Hi3516CV610 如何使用SD卡升级固件
-
5cat /dev/logmpp 报错 <3>[ vi] [func]:vi_send_frame_node [line]:99 [info]:vi pic queue is full!
-
50如何获取vpss chn的图像修改后发送至vo
-
5FPGA通过Bt1120传YUV422数据过来,vi接收不到数据——3516dv500
-
50SS928 运行PQtools 拼接 推到设备里有一半画面会异常
-
53536AV100的sample_vdec输出到CVBS显示
-
10海思板子mpp怎么在vi阶段改变视频数据尺寸
-
10HI3559AV100 多摄像头同步模式
-
9海思ss928单路摄像头vio中加入opencv处理并显示
举报反馈
举报类型
- 内容涉黄/赌/毒
- 内容侵权/抄袭
- 政治相关
- 涉嫌广告
- 侮辱谩骂
- 其他
详细说明
提醒
你的问题还没有最佳答案,是否结题,结题后将扣除20%的悬赏金
取消
确认
提醒
你的问题还没有最佳答案,是否结题,结题后将根据回答情况扣除相应悬赏金(1回答=1E币)
取消
确认