📄 tc35i.c
字号:
*功 能: 串口发送数组命令到TC35,"AT+CMGR=",
*形 参: uchar index 信息索引值
*返 回 值: 信息数据内容首地址,从UDL开始
*备 注: 同时提取时间、信息长度等信息
*****************************************************************/
char *ReadMsg(uchar index)
{ char *p,i=Readwaits;
uchar a,b;
ClrBuf(RsBuf,8);
RsPoint=0;
ES=1;
SendString("AT+CMGR="); //向tc35i发送读信息指令"AT+CMGR="//
if(index)NumIn(index); //如果index不为0输入index,//
else SendString(Index_Tc35); //否则输入Index_Tc35//
SendASC('\r'); //向tc35i发送回车指令//
delayms_1000ms();
while(i--){
delayms_1000ms();
p=mystrstr(RsBuf,Ask_Tc35); //{0x0a,0x30,0x38,0x00}
if(p!=NULL){
//提取时间信息
hh=((*(p+hh_OffSet+1)-48)*10+(*(p+hh_OffSet))-48);
mi=((*(p+mi_OffSet+1)-48)*10+(*(p+mi_OffSet))-48);
ss=((*(p+ss_OffSet+1)-48)*10+(*(p+ss_OffSet))-48)+3;
zhushi lcd_disp_str("time is ",1);
zhushi lcd_pos(0x40);
zhushi lcd_wdat(*(p+hh_OffSet+1));lcd_wdat(*(p+hh_OffSet));lcd_wdat(0x3a);
zhushi lcd_wdat(*(p+mi_OffSet+1));lcd_wdat(*(p+mi_OffSet));lcd_wdat(0x3a);
zhushi lcd_wdat(*(p+ss_OffSet+1));lcd_wdat(*(p+ss_OffSet));
zhushi delayms_1000ms();delayms_1000ms();delayms_1000ms();
//ms10=((*(p+ms10_OffSet+1)&0x0f)*10+(*(p+ms10_OffSet))&0x0f);
//提取数据长度和数据内容
p+=UDL_OffSet;
P_UDL=p; //UD在RsBuf的地址
if(*p&0xc0)a=(*p+0x09)<<4;
else a=*p<<4;
if(*(p+1)&0xc0)b=(*(p+1)+0x09);
else b=*(p+1);
UDL=a|(b&0x0f);
//读取信息成功,测试数据长度UDL的值
zhushi lcd_disp_str("Read new message",1);
zhushi lcd_disp_str(" is success",2);
zhushi delayms_1000ms();
//zhushi lcd_disp_str(" a'value is ",1);
//zhushi lcd_pos(0x40);lcd_wdat(a/100+48);lcd_wdat(a/10%10+48);lcd_wdat(a%10+48);lcd_wdat(124);
//zhushi delayms_1000ms();delayms_1000ms();delayms_1000ms();
//zhushi lcd_disp_str(" b'value is ",1);
//zhushi lcd_pos(0x40);lcd_wdat(b/100+48);lcd_wdat(b/10%10+48);lcd_wdat(b%10+48);lcd_wdat(124);
//zhushi delayms_1000ms();delayms_1000ms();delayms_1000ms();
zhushi lcd_disp_str("UDL'value is ",1);
zhushi lcd_disp_str(" ",2);
zhushi lcd_pos(0x40);
zhushi lcd_wdat(UDL/100+48);lcd_wdat(UDL/10%10+48);
zhushi lcd_wdat(UDL%10+48);
zhushi delayms_1000ms();
//读取成功,删除信息
i=EraseMsg(0);
if(i==0){
zhushi lcd_disp_str("EraseMsg Failt",1);
delayms_1000ms();
}
zhushi lcd_disp_str("Erase Message OK",1);
return p;
}
}
zhushi lcd_disp_str("Read new message",1);
zhushi lcd_disp_str(" is failure",2);
zhushi delayms_1000ms();
return NULL;
}
/***********************转发短信息********************************
*功 能: PDU模式转发短信息
*形 参: char *dialnum) 发送号码首地址
*返 回 值: 信息数据内容首地址,从UDL开始
*备 注: 1 转发成功 0 转发失败
*****************************************************************/
char TransmitPDU(char *dialnum)//发送号码
{ uchar i=Sendwaits;
uchar j=Sendwaits;
char *p;
dialnum=dialnum;
ClrBuf(RsBuf,8);
RsPoint=0;
ES=1;
//把接收到的数据由接收格式转化为发送模式发送出去//
SendString("AT+CMGS="); //信息发送指令 AT+CMGS=//
NumIn(UDL+15); //信息信息长度//
SendASC('\r'); //发送回车指令//
delayms_1000ms();
while(i--)
{
delayms_100ms();
p=mystrstr(RsBuf,">");//">"
if(p!=NULL){
///////Get">"////////////////////////////
//发送信息头
//例如: "0031000D91683118614942F10008A7"
SendString("0031000D9168");
SendToTc35(dialnum,12);
SendString("0008A7");
//发送信息内容
SendToTc35(P_UDL,UDL*2+2);
SendString("\x1a\r");//'\x1a'结束符 '\r'回车符
//delayms_100ms();
while(j--){
delayms_100ms();
p=mystrstr(RsBuf,"OK");
if(NULL!=p){
//成功转发
zhushi lcd_disp_str("Transmit already",1);
//zhushi delayms_1000ms();
//zhushi lcd_disp_str(" ",1);
//RsPoint=0;
//ClrBuf(RsBuf,8);
return 1;
}
zhushi lcd_disp_str("wait Transmit! ",1);
zhushi delayms_1000ms();
zhushi lcd_disp_str(" ",1);
}
}
}
return 0;
}
/***********************接收到新信息******************************
*功 能: 接收到新信息->读取信息->删除信息->转发信息
*形 参:
*返 回 值: char 1 接收成功 0 接收失败
*备 注:
*****************************************************************/
char ReciveNewMsg(){
char *p,i=0;
//获取索引号Index_Tc35[]={0,0,0,0};
GetNewIndex();
zhushi lcd_disp_str("Index_Tc35 is ",1);
zhushi lcd_disp_str(" ",2);
zhushi lcd_disp_str(Index_Tc35,2);
zhushi delayms_1000ms();
//当ReadMsg(uchar)参数为0时读取索引号为Index_Tc35[]的信息
//当ReadMsg(uchar)参数不为0时读取索引号为该值的信息
//成功返回1,否则返回0
p=ReadMsg(0);
if(p==NULL){
zhushi lcd_disp_str("ReadMsg ",1);
zhushi lcd_disp_str(" Failt",2);delayms_1000ms();
zhushi lcd_disp_str(" ",1);
zhushi lcd_disp_str(" ",2);
return 0;
}
zhushi lcd_disp_str("ReadMsg ",1);
zhushi lcd_disp_str(" Success",2);delayms_1000ms();
zhushi lcd_disp_str(" ",1);
zhushi lcd_disp_str(" ",2);
//TransmitPDU(*(DialNum+n)),给第n个用户发送信息
//成功返回1,否则返回0
i=TransmitPDU(*(DialNum+WangYafei));
if(i==0){
zhushi lcd_disp_str("TransmitPDU ",1);
zhushi lcd_disp_str(" Failt",2);delayms_1000ms();
zhushi lcd_disp_str(" ",1);
zhushi lcd_disp_str(" ",2);
return 0;
}
zhushi lcd_disp_str("TransmitPDU ",1);
zhushi lcd_disp_str(" Success",2);delayms_1000ms();
zhushi lcd_disp_str(" ",1);
zhushi lcd_disp_str(" ",2);
return 1;
}
/***********************接收到新信息报告**************************
*功 能: 接收到新信息->响铃提示->删除信息
*形 参:
*返 回 值: char 1 成功 0 失败
*备 注:
*****************************************************************/
char ReciveNewStatusReport(){
char i=0;
//获取索引号Index_Tc35[]=0,0,0,0;
GetNewIndex();
//当EraseMsg(uchar)参数为0时删除索引号为Index_Tc35[]的信息
//当EraseMsg(uchar)参数不为0时删除索引号为该值的信息
//成功返回1,否则返回0
i=EraseMsg(0);
if(i==0){
zhushi lcd_disp_str("EraseMsg Failt",1);
zhushi delayms_1000ms();
zhushi lcd_disp_str(" ",1);
return 0;
}
zhushi lcd_disp_str("Erase Report OK ",1);
zhushi lcd_disp_str(" ",2);delayms_1000ms();
return 1;
}
//响铃f=5kHz
void Bell(void){
uint i;
for(i=0;i<1000;i++){P3_7=!P3_7;delayms_48us();delayms_48us();}
for(i=0;i<1000;i++){P3_7=!P3_7;delayms_48us();}
}
//字符串查找
/***********************字符串查找********************************
*功 能: 查找字符串
*形 参: char *s, char *t ;在s中查找t
*返 回 值: s_temp(t在s中的位置)成功 0 失败
*备 注:
*****************************************************************/
char *mystrstr(char *s, char *t){
char *s_temp; /*the s_temp point to the s*/
char *m_temp; /*the mv_tmp used to move in the loop*/
char *t_temp; /*point to the pattern string*/
if (NULL == s || NULL == t) return NULL;
/*s_temp point to the s string*/
for (s_temp = s; *s_temp != '\0'; s_temp++){
/*the move_tmp used for pattern loop*/
m_temp = s_temp;
/*the pattern string loop from head every time*/
for (t_temp = t; *t_temp == *m_temp; t_temp++, m_temp++);
/*if at the tail of the pattern string return s_tmp*/
if (*t_temp == '\0') return s_temp;
}
return NULL;
}
// 通讯中断接收程序
void Rs485_Do(void) interrupt 4 using 1
{
if(RI&&RsPoint<RsBuf_N)
{
RI=0;
RsBuf[RsPoint++]=SBUF;
RsBuf[RsPoint]=0x00;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -