⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tc35i.c

📁 使用STC89c58RD+系列单片机控制手机收发短信息的原理、硬件电路、PDU数据格式和短信息发送/接收程序
💻 C
📖 第 1 页 / 共 2 页
字号:
*功    能: 串口发送数组命令到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 + -