📄 send.c
字号:
/*
;**************************************************************
;* 北京达盛科技有限公司
;* 研 发 部
;*
;* http://www.techshine.com
;*************************************************************/
/*----------------------- 文件信息 ----------------------------
;*
;* 文件名称 : Send.C
;* 适用平台 : 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端
;* 试验现象 : 设置好CCS的环境,打开本工程,编译、下载。
;* 在程序表示处设置断点,运行程序到断点观察变量LCD变化。
;* 短信自收发时,发送短信正确时,LCD显示为:
;* 第一行:发送:XXXXXXXXXXX(发送至手机号11位,在程序中可修改)
;* 第二行:信息:Welcome To Techshine(Welcome To Techshine为短信内容)
;* 第三行:(第二如显示不完短信,则剩余部分在第三行显示;如第二行显示完,刚第四行内容,在第三行显示。)
;* 第四行:返回:71 OK (71为返回短信条数)
;* 如发送失败或发送错误,则在LCD从第一行最左起显示M22返回的错误信息,如:Error。
;* 备注:
;* 编写时间: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 //波特率除数锁存器高位
uchar sjhao[]="13146891434";//接收手机号为13146891434,可修改
uchar Msg[]=" Welcome to Techshine"; //短信内容可以修改
//-------------------------------------------------------------------
/*
************************************************************************
*********************** 函数定义 ******************
************************************************************************
*/
/*
*************************************************************************************************************
- 函数名称 : 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中的接收数据
}
/*
*************************************************************************************************************
- 函数名称 : void RECV(void *prdata)
- 函数说明 : 接收数据,且有超时退出功能
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void RECV(uchar *prdata){
uint16 cnt=0x8ff;
while((SRLSR & 0x01)==0);//等待450接收缓冲器有数
goto rec;
while(1){
while((SRLSR & 0x01)==0){//等待450接收缓冲器有数,且有超时退出功能
cnt--;
if(cnt==0){
*prdata = 0x00; //接受完数据后使最后一个数为零。
goto back;
}
}
rec:
*prdata++ = SRTHR;
cnt = 0x8ff;
}
back: ;
/*__asm{
WAIT0:
ldrb r2,[0xac00805]
tst r2,#1
bne REC
b WAIT0
WAIT1:
mov r1,#0x4ff
WAIT:
ldrb r2,[0xac00805]
tst r2,#1
bne REC
sub r1,r1,#1
cmp r1,#0
bne WAIT
beq chu
REC:
ldrb r2,[0xac00800]
strb r2,[r0],#1
nop
nop
b WAIT1
chu:
} */
}
/*
*************************************************************************************************************
- 函数名称 : void SEND(uchar udata)
- 函数说明 : 发送数据
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void SEND(uchar udata){
//dellay(50);
while((SRLSR & 0x20)==0); //等待450发送缓冲器空
SRTHR = udata;
}
/*
*************************************************************************************************************
- 函数名称 : void ATT(void)
- 函数说明 : 发送ATT命令
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void ATT(void){
SEND('A');
SEND('T');
SEND(0x0d);
}
/*
*************************************************************************************************************
- 函数名称 : void ATE(void)
- 函数说明 : 发送ATT命令
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void ATE(void){
SEND('A');
SEND('T');
SEND('E');
SEND('0');
SEND(0x0d);
}
/*
*************************************************************************************************************
- 函数名称 : void CGMI(void)
- 函数说明 : 发送CGMI命令
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void CGMI(void){
SEND('A');
SEND('T');
SEND('+');
SEND('C');
SEND('G');
SEND('M');
SEND('I');
SEND(0x0d);
}
/*
*************************************************************************************************************
- 函数名称 : void CGMR(void)
- 函数说明 : 发送CGMR命令
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void CGMM(void){
SEND('A');
SEND('T');
SEND('+');
SEND('C');
SEND('G');
SEND('M');
SEND('M');
SEND(0x0d);
}
/*
*************************************************************************************************************
- 函数名称 : void CMGF1(void)
- 函数说明 : 设置GSM模块短信格式为:1
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void CMGF1(void){
SEND('A');
SEND('T');
SEND('+');
SEND('C');
SEND('M');
SEND('G');
SEND('F');
SEND('=');
SEND('1');
SEND(0x0d);
}
/*
*************************************************************************************************************
- 函数名称 : void CMGS(uchar *ptr)
- 函数说明 : 发送手机号;AT+CMGS="xxxxxxxxxxx(11位手机号)"<CR>
- 输入参数 : 接收手机号码
- 输出参数 : 无
*************************************************************************************************************
*/
void CMGS(uchar *ptr){
uchar l=0, i1;
while ((ptr[l])!='\0')
{l++;} //统计数组字符数
SEND('A');
SEND('T');
SEND('+');
SEND('C');
SEND('M');
SEND('G');
SEND('S');
SEND('=');
SEND('"');
for (i1=0;i1<l;i1++)
SEND(ptr[i1]);//发送单个字符
SEND('"');
SEND(0x0d);
}
/*
*************************************************************************************************************
- 函数名称 : void Send_Msg(unchar *pMsg)
- 函数说明 : 发送短信
- 输入参数 : 短信内容
- 输出参数 : 无
*************************************************************************************************************
*/
void Send_Msg(uchar *pMsg){
uchar l=0, i1;
while ((pMsg[l])!='\0')
{l++;}
for (i1=0;i1<l;i1++)
SEND(pMsg[i1]);//发送单个字符
SEND(26); //发送完毕结束符
}
/*
*************************************************************************************************************
- 函数名称 : uchar Check(uchar *prdata)
- 函数说明 : 检查回车换行次数,来确定是正确返回结果,还是错误结果
- 输入参数 : 接收缓冲区
- 输出参数 : 回车换行次数
*************************************************************************************************************
*/
uchar Check(uchar *prdata){
uchar i=0,ucnt=0;
while(prdata[i] != 0x00){
if(prdata[i] == 0x0d)
ucnt++;
i++;
}
return ucnt;
}
/*
*************************************************************************************************************
- 函数名称 : void DispLcd(uchar *prdata)
- 函数说明 : 显示出错信息
- 输入参数 : 接收缓冲区
- 输出参数 : 无
*************************************************************************************************************
*/
void DispLcd(uchar *prdata){
uchar x,i=0;
uchar str1[] = "发到";
uchar str2[] = "信息";
uchar str3[] = "返回";
Display(str1, 0x80); //SEND:
Display(sjhao,0x82); //发送的手机号
Display(str2, 0x90); //MSG:
Display(Msg, 0x92); //显示发送内容
Display(str3, 0x98); //Back
x=(0x0b-0x08)*2;
Send_cdata(0xf8,0x9b,1);// 定位显示起始地址
while(prdata[i++] != ':'); //判断':'分号,从分号后面显示
while(prdata[i] != 0x00){
if((prdata[i] != 0x0d)&(prdata[i] != 0x0a)){
Send_cdata(0xfa,prdata[i],1);//输出单个字符
x++;
if (x ==0x10){
x=0;
hang++;
switch (hang){
case 0:Send_cdata(0xf8,0x80,1);
break;
case 1:Send_cdata(0xf8,0x90,1);
break;
case 2:Send_cdata(0xf8,0x88,1);
break;
case 3:Send_cdata(0xf8,0x98,1);
}
if (hang>3){
Send_cdata(0xf8,0x80,1);
hang=0;
}
}
}
else
if(prdata[i] == 0x0a)
Send_cdata(0xfa,' ',1);//输出单个字符 空格
i++;
}
}
/*
*************************************************************************************************************
- 函数名称 : void DispErr(uchar *prdata)
- 函数说明 : 显示出错信息
- 输入参数 : 接收缓冲区
- 输出参数 : 无
*************************************************************************************************************
*/
void DispErr(uchar *prdata){
uchar i=0,x=0;
Send_cdata(0xf8,0x80,1); //把光标移到0点
while(prdata[i] != 0x00){
if((prdata[i] != 0x0d)&(prdata[i] != 0x0a)){
Send_cdata(0xfa,prdata[i],1);//输出单个字符
x++;
if (x ==0x10){
x=0;
hang++;
switch (hang){
case 0:Send_cdata(0xf8,0x80,1);
break;
case 1:Send_cdata(0xf8,0x90,1);
break;
case 2:Send_cdata(0xf8,0x88,1);
break;
case 3:Send_cdata(0xf8,0x98,1);
}
if (hang>3){
Send_cdata(0xf8,0x80,1);
hang=0;
}
}
}
else
if(prdata[i] == 0x0a)
Send_cdata(0xfa,' ',1);//输出单个字符 空格
i++;
}
}
/*
*************************************************************************************************************
- 函数名称 : void CLEAR_STAT(void)
- 函数说明 : 清除线路状态寄存器和接受缓冲器
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void CLEAR_STAT(void){
uchar utemp;
utemp = SRLSR; //清除线路状态寄存器
utemp = SRTHR; //清除16C450中的接收数据
}
/*
************************************************************
****************** 主函数 *******************
************************************************************
*/
/*
*************************************************************************************************************
- 函数名称 : Main(void)
- 函数说明 : 系统的主程序入口
- 输入参数 : 无
- 输出参数 : 无
*************************************************************************************************************
*/
void main()
{ uchar i,uhcnt;
uchar rdata[30];
//----------系统初始化-------------------------------
cpu_init(); //目标初始化
Init_16c450();
Lcd_Init();
dellay(10000);
dellay(10000);
ATT(); //测试
dellay(10000);
ATT(); //关闭回显
dellay(10000);
ATE();
dellay(10000);
for(i=0;i<30;i++) //清除接收数据区
rdata[i] = 0;
CLEAR_STAT();
ATT();
RECV(rdata); //关闭回显
for(i=0;i<30;i++) //清除接收数据区
rdata[i] = 0;
CMGF1(); //设置GSM模块短信格式为:1
dellay(0xffff);
CMGS(sjhao); //发送手机号
dellay(0xffff);
CLEAR_STAT(); //清除450状态
Send_Msg(Msg); //发送短信内容
RECV(rdata); //接收返回数据
uhcnt = Check(rdata); //统计结束缓冲区,在单元中内容为00的单元之前的回车数
if(uhcnt == 0x04)
DispLcd(rdata);
else
DispErr(rdata);
while(1){
dellay(100);
asm(" nop"); //设置断点,观察LCD显示内容
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -