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