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

📄 hsm.c

📁 短信程序
💻 C
📖 第 1 页 / 共 5 页
字号:
   	       while(ser485rdUsed() > 0)//receive something from 485
                {//3
                  len = 0;
                  if(serC_Busy == 0)
                    {//4
                        serC_Busy = 1;
                        t = MS_TIMER;
                       while(MS_TIMER - t < 100)
     	              	{
     	              	   if(ser485rdUsed() > 0)
     	              	      {
     	              	          buffer[len++] = ser485getc();
     	              	          t = MS_TIMER;
     	              	      }
     	              	   if(len >= 70)//received 69 bytes
     	              	      break;
     	               }
  	               buffer[len] = 0;
  	               HexToChar(buffer,len);
  	               SendSMS(buffer);//send a sms
  	               //ser485rdFlush(); //后来加上
  	               time = SEC_TIMER;
  	               serC_Busy = 0;
  	               OSTimeDly(1);
  	          } //4
  	          OSTimeDly(2);
  	        }//3
  	        //serC_Busy = 0;
  	        OSTimeDly(5);
  	  }  //2
   }//1

 /*****************************************
   函数名称:OS_Del_SMS(void *pdata)
  函数功能:删除短消息
  返回参数:无
  任务优先级:4
  作者:周志刚
  时间:2004/02/06 14:30
  ****************************************/
 void OS_Del_SMS(void *pdata)
   {
   	auto unsigned char index[3];
   	auto int i,status;
   	auto long t;
   	while(1)
   	  {
   	  	if(serC_Busy == 0)//serc is free
   	  	   {
   	  	   	if(sms_num > 0)//have sms not del
   	  	   	   {
   	  	   	   	#ifdef DTU_DEBUG
   	  	   	            serAputs("\r\n Start delete sms!\r\n");
   	  	   	        #endif
   	  	   	        serC_Busy = 1;
   	  	   	   	i = sms_num  - 1;
   	  	   	   	index[0] = sms_index[i][0];
   	  	   	   	index[1] = sms_index[i][1];
   	  	   	   	index[2] = 0;
   	  	   	   	#ifdef DTU_DEBUG
	                          serAputs(index);
	                        #endif
   	  	   	   	for(i = 0; i < 3;i++)
   	  	   	   	  {
   	  	   	   	      ModemSend("at+cmgd=");
   	  	   	   	      ModemSend(index);
   	  	   	   	      ModemSend("\r");
   	  	   	   	      status = ModemExpect("OK", 4000);
   	  	   	   	      if(status)
   	  	   	   	        break;
   	  	   	   	  }
   	  	   	   	if(status)
   	  	   	   	  {
	    	                         sms_num--;
   	  	   	   	         #ifdef DTU_DEBUG
   	  	   	   	           serAputs("\r\n第 ");
	                                   serAputs(index);
	                                   serAputs(" 条已经成功删除\r\n");
	                                 #endif
	                                 time = SEC_TIMER;
	                           }
	                           serC_Busy = 0;
	                           OSTimeDly(100);
   	  	   	   }
   	  	   }
   	  	OSTimeDly(100);
   	  }
   }

  /*****************************************
  函数名称:OS_Test_Modem(void *pdata)
  函数功能:检测模块工作状态
  返回参数:无
  任务优先级:5
  作者:周志刚
  时间:2004/02/06 14:30
  ****************************************/

 void OS_Test_Modem(void *x)
   {
   	auto int i;
   	auto int status;

   	auto unsigned char buffer[300];
   	auto unsigned char index[6];
   	auto int flag;
   	auto int count,len;
   	auto long t;
        auto int count2;//最近5条查询
        auto unsigned char check_enable;

        check_enable = 1;

   	count = MAX_SMS - 1;
        count2 = 1;

   	while(1)
   	  {
   	  	//check unread or undeleted sms
                         if((serC_Busy == 0)&&(check_enable == 1))
                            {//3
                            	serC_Busy = 1;
                            	      if(count <= 0)
                            	            {
                            	              count = MAX_SMS - 1;
                            	              check_enable = 0;
                            	             }
                                      if(count2 > 5)
                                            count2 = 1;
                            	      while(1)
                            	         {//4
                            	         	serCrdFlush();
                            	         	itoa(count,index);
                            	         	serCputs("at+cmgr=");
                            	         	serCputs(index);
                            	         	serCputs("\r");

                            	         	while(serCwrFree() != BUFSIZE);
                            	         	 serCrdFlush();

                            	         	//serAputs("\r\n special at+cmgr=");
                            	         	//serAputs(index);



                            	         	 t = SEC_TIMER;
    	      	                                 while(serCrdUsed() < 1)//wait for sms data from modem
    	      	                                    {
    	      	   	                                 if((SEC_TIMER - t) > 3)//time out
    	      	   	                                     break;
    	      	                                    }

    	      	                                 if((SEC_TIMER - t) > 3)//error
    	      	   	                                     break;
    	      	   	                            OSTimeDly(60);
    	      	   	                          //serAputs("\r\n receive somthing");
    	      	   	                               len = 0;
                                                       t = MS_TIMER;
                                                       while(1)
                                                          {
                                                          	if(serCrdUsed() > 0)
                                                          	   {
                                                          	     buffer[len++] = serCgetc();
                                                          	     t = MS_TIMER;
                                                          	   }
                                                          	if(((MS_TIMER - t) > 200)||(len > 290))
                                                          	    break;
                                                           }
                                                         buffer[len] = 0;

    	                                                 if(buffer[len - 3] == 'K')//除去数据中的 “OK”,
    	                                                    buffer[len - 8] = 0;

    	                                                 if(len > 50)
    	                                                    {
    	                                                    	serAputs("\r\nfind undelete sms");
    	                                                    	serAputs("\r\n special at+cmgr=");
                            	         	                serAputs(index);
    	                                                    	Do_SMS(buffer);//处理新短消息
    	                                                    	for(len = 0;len < sms_num;len++)//检查是否在删除堆栈里面
    	                                                    	   {
    	                                                    	   	if((sms_index[len][0] == index[0])&&
    	                                                    	   	    (sms_index[len][1] == index[1]))
    	                                                    	   	   break;
    	                                                    	   }
    	                                                    	if(len == sms_num)//是新未删除的短消息,加入删除堆栈
    	                                                    	  {
                  	   	                                     sms_index[sms_num][0] = index[0];
                  	   	                                     sms_index[sms_num][1] = index[1];
                  	   	                                     sms_index[sms_num][2] = 0;
                  	   	                                     sms_num++;
                  	   	                                     if(sms_num == 100)
                  	   	                                          sms_num = 0;
                  	   	                                     serAputs("\r\n new undelete sms");
                  	   	                                  }
    	                                                    }
    	                                                 count--;

    	                                        serCrdFlush();
    	                                        itoa(count2,index);
                            	         	serCputs("at+cmgr=");
                            	         	serCputs(index);
                            	         	serCputs("\r");

                            	         	//serAputs("\r\n special at+cmgr=");
                            	         	//serAputs(index);

                            	         	while(serCwrFree() != BUFSIZE);
                            	         	 serCrdFlush();

                                               // OSTimeDly(2);
                            	         	//serCrdFlush();

                            	         	 t = SEC_TIMER;
    	      	                                 while(serCrdUsed() < 1)//wait for sms data from modem
    	      	                                    {
    	      	   	                                 if((SEC_TIMER - t) > 3)//time out
    	      	   	                                     break;
    	      	                                    }

    	      	                                 if((SEC_TIMER - t) > 3)//error
    	      	   	                                     break;
    	      	   	                          //serAputs("\r\n receive somthing");
    	      	   	                           OSTimeDly(60);
    	      	   	                               len = 0;
                                                       t = MS_TIMER;
                                                       while(1)
                                                          {
                                                          	if(serCrdUsed() > 0)
                                                          	   {
                                                          	     buffer[len++] = serCgetc();
                                                          	     t = MS_TIMER;
                                                          	   }
                                                          	if(((MS_TIMER - t) > 200)||(len > 290))
                                                          	    break;
                                                           }
                                                         buffer[len] = 0;

    	                                                 if(buffer[len - 3] == 'K')//除去数据中的 “OK”,
    	                                                    buffer[len - 8] = 0;

    	                                                 if(len > 50)
    	                                                    {
    	                                                    //	serAputs("\r\nreceive sms");
    	                                                        serAputs("\r\nfind undelete sms");
    	                                                        serAputs("\r\n special at+cmgr=");
                            	         	                serAputs(index);
    	                                                    	Do_SMS(buffer);//处理新短消息
                  	   	                                for(len = 0;len < sms_num;len++)//检查是否在删除堆栈里面
    	                                                    	   {
    	                                                    	   	if((sms_index[len][0] == index[0])&&
    	                                                    	   	    (sms_index[len][1] == index[1]))
    	                                                    	   	   break;
    	                                                    	   }
    	                                                    	if(len == sms_num)//是新未删除的短消息,加入删除堆栈
    	                                                    	  {
                  	   	                                     sms_index[sms_num][0] = index[0];
                  	   	                                     sms_index[sms_num][1] = index[1];
                  	   	                                     sms_index[sms_num][2] = 0;
                  	   	                                     sms_num++;
                  	   	                                     if(sms_num == 100)
                  	   	                                          sms_num = 0;
                  	   	                                     serAputs("\r\nnew undelete sms");
                  	   	                                  }
    	                                                    }
    	                                                 count2++;
    	                                                 break;
                            	         }//4
                            	serC_Busy = 0;
                            }//3
   	  	else
   	  	   {
   	  	      OSTimeDlySec(120);//delay 120 seconds
   	  	      check_enable = 1;
   	  	   }

   	  	if(SEC_TIMER - time  > 1800)
   	  	  {
   	  	  	if(serC_Busy == 0)
   	  	  	   {
   	  	  	   	serC_Busy = 1;
   	  	  	   	for(i = 0;i < 10;i++)
   	  	  	   	  {
   	  	  	   	    ModemSend("at\r");
   	  	  	   	    status = ModemExpect("OK", 4000);
   	  	  	   	    if(status)
   	  	  	   	       break;
   	  	  	   	   }
   	  	  	   	 if(i >= 10)
   	  	  	   	    {
   	  	  	   	    	Sys_Err = 1;
   	  	  	   	    	#ifdef DTU_DEBUG
	                                   serAputs("\r\nsystem error\r\n");
	                                #endif
   	  	  	   	    }
   	  	  	   	 else
   	  	  	   	    {
   	  	  	   	    	time = SEC_TIMER;
   	  	  	   	    	#ifdef DTU_DEBUG
	                                   serAputs("\r\nsystem ok\r\n");
	                                #endif
   	  	  	   	    }
   	  	  	   	 serC_Busy = 0;
   	  	  	   	 //Sys_Err = 1;
   	  	  	   }
   	  	  	   OSTimeDly(100);
   	  	     }
   	  	  OSTimeDly(20);
   	  }
   }

/*******************************************
程序名称:Module_Rst()
功能:复位西门子MC35
返回值:无
********************************************/
void Module_Rst(void)
{
	BitWrPortI(PDDR, &PDDRShadow, 0, 1);		//低电平有效
	msDelay(1000);
	BitWrPortI(PDDR, &PDDRShadow, 1, 1);
}

//////////////////////////////////////////////////////////
//  Functions to Enable/Disable the RS485 Transmitter
//////////////////////////////////////////////////////////
// Enable 485 transmissions
void TxEn()
{
	// set port D bit 2 high
	BitWrPortI(PDDR, &PDDRShadow, 1, 2);
}

// Disable 485 transmissions, put in receive mode
 void RxEn()
{
	// set port D bit 2 low
	BitWrPortI(PDDR, &PDDRShadow, 0, 2);
}

void Init485(void)
{
	long baud;

	serAopen(115200);
	readUserBlock(input,Inter_Baud,sizeof(input));		//read Baudrate Value.
	baud = atol(input);						//ANSI String to Long Conversion.
	ser485open(baud);		//set baud rate first
	readUserBlock(input,Even_Odd,sizeof(input));		//判断奇偶标志位
	switch(input[0])
	{
		case 'e':
		ser485parity(PARAM_EPARITY);
		serAputs("\r\n偶校验");
		break;

		case 'E':
		ser485parity(PARAM_EPARITY);
		serAputs("\r\n偶校验");
		break;

		case 'o':
		ser485parity(PARAM_OPARITY);
		serAputs("\r\n奇校验");
		break;

		case 'O':
		ser485parity(PARAM_OPARITY);
		serAputs("\r\n奇校验");
		break;

		case 'n':
		serAputs("\r\n无奇偶校验");
		break;

		case 'N':
		serAputs("\r\n无奇偶校验");
		break;

		default:
		serAputs("\r\n无奇偶校验");
		break;
	}
	msDelay(100);
	ser485wrFlush();
	ser485rdFlush();
	RxEn();					//处于接收状态									//485端口处于接受状态
}


/**************************************************
程序名称:系统初始化处理程序
[InitSystem()]
功能:完成I/O处理,485初始化,设置,CMIP,CMPortNum初始化
入口参数:
返回值

作者:杨志超

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -