📄 hsm.c
字号:
/****************************************************
程序程序: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 + -