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

📄 hsm.c

📁 短信程序
💻 C
📖 第 1 页 / 共 5 页
字号:
/****************************************************
程序程序:SMS收发程序

功能描述:
该程序是基于RABBIT2000的SMS通信程序,用于完成无线
小数据传输。

版本:1.0
作者:周志刚
时间:2003/11/21

版本:1.010
作者:周志刚
时间:2004/02/23
修改:改成uC/OS II操作系统

版本:1.01
作者:周志刚
时间:2004/03/08
修改:修改发送程序,如果一次不成功,重试10次
      再不成功,不管它

版本:1.10
作者:周志刚
时间:2004/03/09
修改:增加测试模块内可能未读到的短消息

版本:1.10
作者:周志刚
时间:2004/03/12
修改:删除分析手机号码,因为有的有 +86,有的没有

任务:6个
  1、看门狗
  2、设置菜单,初始化模块(完成后删除)
  3、处理收到的短消息
  4、发送串口收到的数据
  5、删除短消息
  6、测试模块工作状态
*****************************************************/
#define DTU_DEBUG
//#define Init_Dtu
#nodebug

//#define PKTDRV "ppp.lib"

//#define USE_PPP_SERIAL 0x04					//定义modem的连接串口,0x04表示串口C

//#define PPP_RTSPORT   PBDR					//定义RTS脚所在端口
//#define PPP_RTSSHADOW PBDRShadow
//#define PPP_RTSPIN    7						//定义RTS脚位置
//#define PPP_CTSPORT   PBDR
//#define PPP_CTSPIN    0

#define ON	0
#define OFF 1

#define MAX_SMS  100
#define BUFSIZE	   1023					//通信端口缓冲大小,可设

//#define PDU_MODE
#define TEXT_MODE

  #define AINBUFSIZE      BUFSIZE
  #define AOUTBUFSIZE     BUFSIZE

  #define ser485open      serBopen
  #define ser485close     serBclose
  #define ser485wrFlush   serBwrFlush
  #define ser485rdFlush   serBrdFlush
  #define ser485putc      serBputc
  #define ser485getc      serBgetc
  #define ser485wrFree    serBwrFree
  #define ser485rdUsed    serBrdUsed
  #define ser485write	  serBwrite
  #define ser485read	  serBread
  #define ser485parity	  serBparity
  #define ser485puts      serBputs
  #define ser485parity	  serBparity
  #define cof_ser485puts  cof_serBputs
  #define BINBUFSIZE      BUFSIZE
  #define BOUTBUFSIZE     BUFSIZE

#define CINBUFSIZE BUFSIZE					//串口c的接收缓冲
#define COUTBUFSIZE BUFSIZE					//串口C的发送缓冲

/**************************uC/OS II**************************/
#define STACK_CNT_256      1    // number of 256 byte stacks
#define STACK_CNT_512      2    // number of 512 byte stacks
#define STACK_CNT_1K       3    // number of 1K stacks
#define STACK_CNT_2K       2    // number of 2K stacks
#define STACK_CNT_4K       0    // number of 4K stacks

#define OS_MAX_EVENTS       6    // Maximum number of events (semaphores, queues, mailboxes)
#define OS_MAX_TASKS        8    // Maximum number of tasks
#define OS_MAX_QS           0        // Maximum number of queues in system
#define OS_MAX_MEM_PART     0  // Maxium number of memory partitions
#define OS_TASK_CREATE_EN   1 // Enable normal task creation
#define OS_TASK_CREATE_EXT_EN      0  // Disable extended task creation
#define OS_TASK_DEL_EN      1 // enable task deletion
#define OS_TASK_STAT_EN     0  // disable statistics task creation
#define OS_Q_EN             0  // Enable queue usage
#define OS_MEM_EN           0  // Disable memory manager
#define OS_MBOX_EN          0 // Enable mailboxes
#define OS_SEM_EN           0  // Enable semaphores
#define OS_TICKS_PER_SEC    64  // number of ticks in one second
#define MAX_SOCKET_LOCKS     0
#define OS_SEM_POST_EN	     0
#define OS_TIME_DLY_HMSM_EN	 1
#define OS_LOWEST_PRIO           11

/***************my uC/OS II tasks*********/
void OS_HitWatchDog(void *);
void OS_Setup(void *);
void OS_Do_SMS(void *);
void OS_Send_SMS(void *);
void OS_Del_SMS(void *);
void OS_Test_Modem(void *);


#memmap xmem
#use "ucos2.lib"
#use "modem.lib"

/******************************************************/
/*----------Flash Memory Storage Map List-------------*/
/******************************************************/

#define Pass_Word		0x00		//口令位置
#define Inter_Baud              0x20		//接口波特率
//#define Wait_Delay	        0x30		//等待延迟
#define Soft_Version            0x40		//软件版本号
#define Ser_Number	        0x50		//序列号
//#define Alarm_Number            0x70            //报警号码
#define Even_Odd		0x60		//奇偶标志
#define Phone_Number            0x70            //对方手机号


#define PassWord	"888888"
#define InterBaud	"115200"
//#define WaitDelay	"10"
#define SoftVersion	"v1.0"
#define SerNumber	"100001"//序列号从100001开始
#define PhoneNumber     "13*********"
#define EvenOdd		"N"


const unsigned char menu[] = "\r\n"\
   "+***************SETUP MENU for TDX-GSM Modem************+\n\r"\
   "|             泰达鑫SMS无线数据传输终端设置菜单         |\n\r"\
   "|                 深圳泰达鑫通信技术有限公司            |\n\r"\
   "+*******************************************************+\n\r"\
   "+  功能选择  +------------------功能描述----------------+\n\r"\
   "|      1     |管理员密码设定                            |\n\r"\
   "|      2     |对方手机号码设置                          |\n\r"\
   "|      3     |接口速率(RS232/485)单位:bps               |\n\r"\
   "|      4     |状态查询                                  |\n\r"\
   "|      5     |AT指令测试                                |\n\r"\
   "+------------+------------------------------------------+\n\r"\
   "按Q/q键退出设置程序!\n\r";

const unsigned char BaudList[] = "\r\n"\
   "+****************波特率表(bps)*************+\r\n"\
   "|0--1200    1--2400    2--4800    3--9600  |\r\n"\
   "|4--19200   5--38400   6--57600   7--300   |\r\n"\
   "+******************************************+\r\n";


void Module_Rst(void);			//模块复位
void LED_CON(int value);		//指示灯控制
void InitIO(void);			//I/O口初始化
void setup(void);			//参数设置
int  msDelay(unsigned int delay);	//毫秒延迟,但不是很准,需要写ID Block
void serXsread(unsigned	char *array,unsigned char n);	//读数据
void serXprint(unsigned	char *array);			//输出数据
void Init485(void);
void InitSystem(void);
//void setup(void);
void RxEn(void);
void TxEn(void);



void SendSMS(char *buffer);//send a sms
int InitSMS(void);//setup sms
unsigned char ReceiveSMS(char *,char *);//接收新短消息
unsigned char Do_SMS(char *buf);//处理新短消息
void HexToChar(char *,unsigned char);
unsigned char CharToHex(char *buf);

int ErrorFlag;				//用于标记响应的错误类型
int shuttc35;

char input[16];
unsigned char sms_index[100][4];
int sms_num;//当前可以存放短消息入口地址的数组位置
int serC_Busy;
long time;
int Sys_Err;
/**************************************************
程序名称:主程序
[main]

作者:周志刚
时间:2003/11/21
**************************************************/

void main()
{//1
	INT8U err;
     	OSInit();
     	InitSystem();
	err = OSTaskCreate(OS_HitWatchDog, NULL, 512, 0);
     	#ifdef DTU_DEBUG
     	     if(err == OS_NO_ERR)
     	        serAputs("\r\n  OS_HitWatchDog() created successful!\r\n");
     	     else
     	        serAputs("\r\n  OS_HitWatchDog() created failed!\r\n");
     	#endif

     	err = OSTaskCreate(OS_Setup, NULL, 1024, 1);
     	#ifdef DTU_DEBUG
     	     if(err == OS_NO_ERR)
     	        serAputs("\r\n  OS_Setup() created successful!\r\n");
     	     else
     	        serAputs("\r\n  OS_Setup() created failed!\r\n");
     	#endif
        OSStart();

 } //1

 /************************************
  函数名称:OS_HitWatchDog(void *)
  函数功能:初始化看门狗
            周期的复位看门狗
  返回参数:无
  任务优先级:0
  作者:周志刚
  时间:2004/02/06 14:30
************************************/
void OS_HitWatchDog(void *pdata)
   {
        int wd;
   	pdata = pdata;
   	wd = VdGetFreeWd(161);//软件看门狗10s复位一次
   	Sys_Err = 0;
        while(1)
          {
            OSTimeDlySec(6);//delay 5 seconds
            VdHitWd(wd);//dog
            if(Sys_Err)
                while(1);
          }
   }

/************************************
  函数名称:OS_Setup(void *)
  函数功能:系统参数设置
  返回参数:无
  任务优先级:1
  作者:周志刚
  时间:2004/02/06 14:30
************************************/
void OS_Setup(void *pdata)
  {
  	INT8U err;
  	auto  int flag;
  	pdata = pdata;
  	setup();
         #ifdef DTU_DEBUG
  	  serAputs("\r\n 初始化modem.............\r\n");
  	#endif
  	Module_Rst();
  	serCopen(19200);
  	msDelay(500);

  	flag = InitSMS();
  	while(flag == 0)
  	     {
  	     	flag = InitSMS();
  	     	OSTimeDlySec(1);
  	     }
  	RxEn();
  	RxEn();
  	LED_CON(ON);
  	serCrdFlush();
  	ser485rdFlush();

  	err = OSTaskCreate(OS_Do_SMS, NULL, 2048, 2);
  	#ifdef DTU_DEBUG
     	     if(err == OS_NO_ERR)
     	        serAputs("\r\n  OS_Do_SMS() created successful!\r\n");
     	     else
     	        serAputs("\r\n  OS_Do_SMS() created failed!\r\n");
     	#endif

     	err = OSTaskCreate(OS_Send_SMS, NULL, 2048, 3);
  	#ifdef DTU_DEBUG
     	     if(err == OS_NO_ERR)
     	        serAputs("\r\n  OS_Send_SMS() created successful!\r\n");
     	     else
     	        serAputs("\r\n  OS_Send_SMS() created failed!\r\n");
     	#endif

  	while(1)
  	   {
  	   	OSTimeDlySec(10);
  	   }
  }
 /*****************************************
   函数名称:OS_Do_SMS(void *pdata)
  函数功能:处理收到的短消息
  返回参数:无
  任务优先级:2
  作者:周志刚
  时间:2004/02/06 14:30
  ****************************************/

 void OS_Do_SMS(void *pdata)
   {
   	INT8U err;
   	auto unsigned char buffer[300];
   	auto unsigned char index[4];
   	auto int flag;
   	err = OSTaskDel(1);

	   #ifdef DTU_DEBUG
     	             if(err == OS_NO_ERR)
     	                 serAputs("\r\n  OS_Setup() delete successful!\r\n");
     	             else
     	                  serAputs("\r\n  OS_Setup() delete failed!\r\n");
     	   #endif

     	  err = OSTaskCreate(OS_Del_SMS, NULL, 1024, 4);
     	  #ifdef DTU_DEBUG
     	     if(err == OS_NO_ERR)
     	        serAputs("\r\n  OS_del_SMS() created successful!\r\n");
     	     else
     	        serAputs("\r\n  OS_del_SMS() created failed!\r\n");
     	#endif

     	 err = OSTaskCreate(OS_Test_Modem, NULL, 1024, 5);
     	  #ifdef DTU_DEBUG
     	     if(err == OS_NO_ERR)
     	        serAputs("\r\n  OS_Test_Modem created successful!\r\n");
     	     else
     	        serAputs("\r\n  OS_Test_Modem created failed!\r\n");
     	#endif

     	 for(flag = 0;flag < 4; flag++)
     	    {
     	    	index[flag] = 0;
     	    }

        while(1)
          {
          	while(serCrdUsed() > 0)//something received from Modem
                  {
                    if(serC_Busy == 0)
                      {
                  	serC_Busy = 1;
                  	flag = ReceiveSMS(buffer,index);
                  	if(flag == 1)
                  	   	 {
                  	   	   Do_SMS(buffer);//处理新短消息
                  	   	   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;
                  	   	   OSTimeDlySec(5);
                  	   	  }
                        serCrdFlush();
                        time = SEC_TIMER;
                        serC_Busy = 0;
                      }
                      OSTimeDly(2);
                  }
               //serC_Busy = 0;
               OSTimeDly(5);
          }
   }
 /*****************************************
   函数名称:OS_Send_SMS(void *pdata)
  函数功能:发送短消息
  返回参数:无
  任务优先级:3
  作者:周志刚
  时间:2004/02/06 14:30
  ****************************************/
 void OS_Send_SMS(void *pdata)
   {//1
   	auto long t;
   	auto unsigned char buffer[160];
   	auto unsigned char len;


   	while(1)
   	  {//2

⌨️ 快捷键说明

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