📄 gsm.c
字号:
/*
;**************************************************************
;* 北京达盛科技有限公司
;* 研 发 部
;*
;* http://www.techshine.com
;*************************************************************/
/*----------------------- 文件信息 ----------------------------
;*
;* 文件名称 : GSM.C (AT命令试验文件)
;* 适用平台 : DSP(ARM)CPU挂箱、接口挂箱(用三条扁平电缆连接);
;*(注意:DSP(ARM)CPU挂箱上CPU模块上方的开关SW3有且只有最左侧的一位在"ON"位置);
;* CPU类型 : DSP320VC5409
;* 软件环境 : CCS2.20 (5000系列)
;* 扩展模块 : E-LAB:GSM模块(正确安装在接口挂箱上)
;* 试验接线 : 1、用短路帽短接GSM模块上的片选CS50的CS0
;* 2、GSM模块上的FLY8用跳线帽短接MCU端
;* 3、GSM模块上安装好有效的SIM卡
;* 试验现象 : 模拟手机功能,完成电话接听、呼叫、通话、收发短信等功能
;* 备注:开机上电,按GSM模块上的复位键,等待模块上的发光二极管开始闪烁后
;* 打开CCS运行软件,编译、运行本程序。可在CPU挂箱上的液晶屏上显示
;* GSM 模块信息,包括生产厂家、型号,及回显测试,最后检查是否插入SIM卡
;* 当检测到有效地SIM卡时,清屏,显示当前SIM卡的运营商(移动或联通)
;* 当前日期、当前时间及当前的信号质量,至此完成了系统的初始化。用户可发短信、
;* 拨打电话或接收短信、接听电话了,也可以进入电话本菜单进行操作(未完善)
;* 此时按'A'键,进入时钟设置菜单;按'B'键,进入铃音设置菜单;
;* 按'C'键,进入通话记录菜单;按'D'键,进入手机设置菜单;
;* 按'E'键,进入短信菜单; 按'F'键,进入电话本菜单;
;* 按任一数字键,进入拨号呼叫状态
;* 1、拨打电话:通过键盘直接键入要拨打的电话号码,完成拨号后,按‘F’键
;* 开始不叫,当对方摘机后就可以通话了,在此过程中可随时按‘E’键结童话
;* 2、发送短信:进入短信菜单后,按'A'键,进入编写短信界面,可通过键盘输入端新内容
;* 结束后,按'F'键,提示输入接收方的手机号,完成后再按'F'键,开始发送。
;* 3、接听电话:当有电话打进来时,液晶屏上会提示‘有电话啦!’,
;* 按'F'键接听,按'E'键挂断。
;* 4、阅读短信:当有接收到短信时,液晶屏上会提示‘有短信啦’
;* 按'F'键可阅读短信内容。
:* 修改日期:2006、5、20(长春展会)
:* 修改内容:1、每次从M22中读出时间和日期是要进行检验,避免读入无效数据,引起时间、日期的显示乱码
:* 2、增加连续拨号功能,以增加拨号的成功率。
;* 编写时间:2006、1、20
;* 审核时间:
*/
//------------------头文件--------------------------------------
#include "system.h" //包括CPU寄存器的定义、编译环境定义、试验系统定义
//----------------------------------------------------------
#define SRTHR CS0 //接收、发送缓冲器
#define SIER port0801 //中断允许寄存器
#define SLCR port0803 //线路控制寄存器
#define SRLSR port0805 //线路状态寄存器
#define SLSB CS0 //波特率除数锁存器低位
#define SMSB port0801 //波特率除数锁存器高位
/*******************************************
函数声明
*********************************************/
void CLEAR_BUFF(uchar *buff);
void CLEAR_STAT(void);
/*******************************************
变量定义
*********************************************/
uchar rdata[200],phone[20],netsev[10];
uchar modeinfo[] = "GSM 模块信息";
uchar ch_moid[] = "\"CHINA MOBILE\"";
uchar ch_mo[] = "中国移动";
uchar ch_cuid[] = "\"CHN-CUGSM\"";
uchar ch_cu[] = "中国联通";
uchar ready[] = "READY";
uchar nosim[] = "请插入SIM 卡!";
uchar income[] = "来电话啦!";
uchar newmsg[] = "收到短信啦!";
uchar newmsghint[] = "阅读(F) 跳过(E)";
uchar newmsgpro[] = "删除(F) 跳过(E)";
uchar at[] = "AT:";
uchar cgmi[] = "Manu:";
uchar cgmm[] = "Mode:";
uchar find[] = "Searching for...";
uchar ddate[] = "日期:";
uchar dtime[] = "时间:";
uchar signal[] = "信号强度:";
uchar retu[] = "返回(F):";
uchar msgall[] = "ALL";
uchar msgread[] = "REC READ";
uchar msgunread[] = "REC UNREAD";
uchar incomeflag[] = "CLIP:";
uchar msgindex[20],incomenum[12],status=0;
//-------------------------------------------------------------------
/*******************************************
函数定义
*********************************************/
/*********************************************************
- 函数名称 : void SEND(uchar udata)
- 函数说明 : 发送数据
- 输入参数 : 无
- 输出参数 : 无
**********************************************************/
void SEND(uchar udata)
{
while((SRLSR & 0x20)==0); //等待450发送缓冲器空
SRTHR = udata;
}
/****************************************
- 函数名称 : Init_16c450(void)
- 函数说明 : 初始化16c450
- 输入参数 : 无
- 输出参数 : 无
*********************************************/
void Init_16c450(void)
{
uchar tempd;
SLCR = 0x80; //设置波特率控制位 使能
SLSB = 0x0C;
SMSB = 0x00; //设置波特率96000
SLCR = 0x03; //8个数据位,2个停止位,无奇偶校验
SIER = 0x01; //允许接收器数据就绪中断
tempd = SRLSR; //清除线路状态寄存器
tempd = SRTHR; //清除16C450中的接收数据
tempd = tempd;
}
/****************************************************
- 函数名称 : void RECV(void *prdata)
- 函数说明 : 接收数据,且有超时退出功能
- 输入参数 : 保存接收到的数据的指针
- 输出参数 : 接收到的字节数
******************************************************/
uchar RECV(uchar *prdata)
{
uchar num = 0,tmp;
uint16 cnt=0x8ff;
CLEAR_BUFF(prdata);
/*
while(((SRLSR & 0x01)==0)&&(cnt>0))
{
cnt--;
}
*/
while(cnt>0)
{
while((SRLSR & 0x01)!=0)//等待450接收缓冲器有数
{
tmp = SRTHR;
if((tmp!='\r')&&(tmp!='\n'))
*prdata++ = tmp;
else *prdata++ = ' ';
num++;
cnt = 0x8ff;
}
cnt--;
}
CLEAR_STAT();
return num;
}
int RECV1(uchar *prdata)
{
uint16 cnt=0x8ff,tmp,num=0;
CLEAR_STAT();
while((SRLSR & 0x01)==0);//等待450接收缓冲器有数
goto rec;
while(1)
{
while((SRLSR & 0x01)==0)
{//等待450接收缓冲器有数,且有超时退出功能
cnt--;
if(cnt==0)
{
*prdata = 0x00; //接受完数据后使最后一个数为零。
goto back;
}
}
rec:
tmp = SRTHR;
if((tmp!='\r')&&(tmp!='\n'))
*prdata++ = tmp;
else *prdata++ = ' ';
cnt = 0x8ff;
num++;
}
back:
return num;
}
/************************************************
- 函数名称 : char str_comp(uchar *str1,uchar start1,uchar *str2,uchar start2,uchar num)
- 函数说明 : 字符串中一段字符的比较
- 输入参数 : 两个比较字符串的起始指针、比较的起始位置、比较的字节数
- 输出参数 : 比较结果中的不相同的字节数
*************************************************/
uchar str_comp(uchar *str1,uchar start1,uchar *str2,uchar start2,uchar num)
{
uchar i,error=0;
str1 +=start1;
str2 +=start2;
for(i=0;i<num;i++)
{
if(*str1++ != *str2++) error++;
}
return error;
}
/************************************************
- 函数名称 : char str_search(uchar *source,uchar start,uchar *dest)
- 函数说明 : 在源字符串中搜索与目标字符串相同部分的位置
- 输入参数 : 被搜索的源字符串的首指针、目标字符串的首指针
- 输出参数 : 目标字符串在源字符串的首位置
*************************************************/
uchar str_search(uchar *source,uchar start,uchar *dest)
{
uchar i,j=0,destlenth=0,sourcestart=0xff;
i=start;
while(dest[destlenth]!='\0') destlenth++; //计算出目标字符串的长度
while((j<destlenth)&&(source[i]!='\0'))
{
while((source[i]!=dest[j])&&(source[i]!='\0')) i++;
if((j==0)&&(source[i]!='\0')) sourcestart = i;
if((i!=(sourcestart+j))||(source[i]=='\0'))
{
//i=sourcestart+1;
i=i-j;
sourcestart=0xff;
j=0;
}
else j++;
}
//if(i != (sourcestart+destlenth-1)) sourcestart=0xff;
return sourcestart;
}
/************************************************
- 函数名称 : void str_copy(uchar *dest,uchar start1,uchar *source,uchar start2,uchar num)
- 函数说明 : 字符串复制
- 输入参数 : 源和目的字符串的起始指针、复制源的起始位置、复制目标的起始位置,复制的字节数
- 输出参数 : 无
*************************************************/
void str_copy(uchar *dest,uchar start1,uchar *source,uchar start2,uchar num)
{
uchar i;
dest +=start1;
source +=start2;
for(i=0;i<num;i++) *dest++ = *source++;
}
/************************************************
- 函数名称 : void CLEAR_STAT(void)
- 函数说明 : 清除线路状态寄存器和接受缓冲器
- 输入参数 : 无
- 输出参数 : 无
*************************************************/
void CLEAR_STAT(void)
{
uchar utemp;
utemp = SRLSR; //清除线路状态寄存器
utemp = SRTHR; //清除16C450中的接收数据
utemp = utemp;
}
/*************************************************
- 函数名称 : void CLEAR_BUFF(uchar *buff)
- 函数说明 : 清除缓冲区的数据
- 输入参数 : 缓冲区的首地址
- 输出参数 : 无
**********************************************/
void CLEAR_BUFF(uchar *buff)
{
uchar i;
for(i=0;i<100;i++) buff[i] = 0;
}
/*************************************************
- 函数名称 : void lcdclean(uchar st,uchar end)
- 函数说明 : 清除液晶屏的显示
- 输入参数 : 液晶屏的开始清除行和结束行
- 输出参数 : 无
**********************************************/
void lcdclean(uchar st,uchar end)
{
uchar null[] = " ",i,mode;
for(i=st;i<=end;i++)
{
switch (i)
{
case 1:
mode=0x80;
break;
case 2:
mode=0x90;
break;
case 3:
mode=0x88;
break;
case 4:
mode=0x98;
break;
}
Display(null,mode,0,16);
}
}
/*************************************************
- 函数名称 : void callsend(uchar *buff)
- 函数说明 : 发出呼叫
- 输入参数 : 呼叫方号码的首地址
- 输出参数 : 无
**********************************************/
void callsend(uchar *buff)
{
uchar i,temp,calling[]="正在呼叫:请稍侯...挂机(E)";
lcdclean(1,1);
Display(calling,0x80,0,9);
lcdclean(3,4);
Display(calling,0x8b,9,18);
Display(calling,0x9a,18,27);
SEND('A');
SEND('T');
SEND('D');
i=0;
temp = *(buff++);
while((temp!='\0')&&(i<13))
{
SEND(temp);
temp = *(buff++);
i++;
}
SEND(0x0d);
//while(RECV1(rdata)==0);
}
/*************************************************
- 函数名称 : void phonebookmenu(void)
- 函数说明 : 电话本菜单
- 输入参数 : 无
- 输出参数 : 无
**********************************************/
void phonebookmenu(void)
{
uchar phonebook[] = "电话本(F):";
uchar phonebookadd[] = "添加记录(A):";
uchar phonebookmodefy[] = "修改记录(B):";
Display(phonebook,0x80,0,10);
Display(phonebookadd,0x91,0,14);
Display(phonebookmodefy,0x89,0,12);
Display(retu,0x99,0,8);
key7279 = 0xff;
while((key7279 != 0xa)&&(key7279 != 0xb)&&(key7279 != 0xf));
lcdclean(1,4);
switch (key7279)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -