📄 sms.c
字号:
for(i=0;i<(10-a);i++)
{
buf1[i]=buf[a+i];
}
n+= gsmBytes2String(buf1, &msg_buf[n], (10-a));//转换到ASCII码
return n;
}
//************************************************************************//
//电流电压转换到PDU
//中间添加小数点
//入口电流、电压数据
//出口msg_buf,返回累加后的字节长度
//*********************************************************************//
uint adv_a(uint temp,uint n)
{
uchar a=0,i;
uchar buf[10]={};
uchar buf1[10]={};
temp/=10; //去掉小数点后第3位
for(a=10;a>0;a--) //取出每位中的数据
{
if (a!=6)
{
buf[a-1]=temp%10+48;
a--;
buf[a-1]=0;
temp/=10;
}
else
{
buf[a-1]=0x2E; //小数点
a--;
buf[a-1]=0;
}
}
a=0;
if(buf[1]==0x30)//去掉0
{
a+=2;
}
for(i=0;i<(10-a);i++)
{
buf1[i]=buf[a+i];
}
n+= gsmBytes2String(buf1, &msg_buf[n], (10-a));//转换到ASCII码
return n;
}
//*************************************************************************//
//短信事件记禄缓冲
//可以存放最近没有发送的5条短信,系统复位后消除
//main.h设置了有效长度=5
//需要发送短信时将事件代码写入此函数
//入口: 事件代码
//出口:无
//************************************************************************//
void sms_counts(uchar n)
{ //保证只记录1次相同事件
if((sms_event[0]==n)|(sms_event[1]==n)|(sms_event[2]==n)|(sms_event[3]==n)|(sms_event[4]==n));
else
{
sms_event[sms_event_counts]=n;
time_out_seconds=0;//清除time_out 计次器
if(sms_event_counts<4)
{
sms_event_counts++;
}
else
{
sms_event_counts=0;
}
}
}
//**********************************************************************//
//************************************************************************//
//短信事件处理
//记录了相应的事件具体的处理方式,即发送短信的内容
//***********************************************************************//
void event_00(void) //事件0
{
}
void event_01(void) //事件01
{
uint n=12;
eeprom_read_block (&msg_buf[0],&E_name[0],12); //读名称
n+= a_conststutob_stu(maohao,&msg_buf[n],4); //:
switch(Reply)
{
case 0:{break;}
case 1:
{
n+= a_conststutob_stu(yh,&msg_buf[n],8); //用户
n=sun_d(m_sms,n);
n+= a_conststutob_stu(hm,&msg_buf[n],8); //号码break;
}
case 2: {break;}
case 3: {n+= a_conststutob_stu(xmm,&msg_buf[n],12);break;} //新密码
case 4: {break;} case 5: {break;}
case 6: {n+= a_conststutob_stu(xmc,&msg_buf[n],12);break;} //新名称 case 7: {break;} case 8: {break;}
case 9: {break;} case 10: {break;} case 11: {break;}
case 12: {break;} case 13: {break;} case 14: {break;} case 15: {break;} case 16: {break;}
case 17: {break;}
case 18: {break;}
case 19: {n+= a_conststutob_stu(Communication_gapT,&msg_buf[n],16);break;}//通讯间隔
case 20: {break;}
default: {break;}
}
Reply=0;
n+= a_conststutob_stu(wc,&msg_buf[n],8); //完成
n+= a_conststutob_stu(juhao,&msg_buf[n],4); //.
}
void event_02(void) //事件02
{
}
void event_03(void) //事件03
{
}
void event_04(void) //事件04
{
}
void event_05(void) //事件05
{//智能型:供电12.3v;6V电压6.25v;电流235ma;温度20C;编码t;工作20s;休止20s;接收正常;发射正常;频率正常.
uint n=12;
uchar temp=0;
eeprom_read_block (&msg_buf[0],&E_name[0],12); //读名称
n+= a_conststutob_stu(maohao,&msg_buf[n],4); //:
n+= a_conststutob_stu(gongdian,&msg_buf[n],8); //供电
n= adv_a(adv_m,n);
n+= a_conststutob_stu(vv,&msg_buf[n],4); //V
n+= a_conststutob_stu(fenhao,&msg_buf[n],4); //;
n+= a_conststutob_stu(work,&msg_buf[n],8); //工作
n+= a_conststutob_stu(Voltage,&msg_buf[n],8); //电压
n= adv_a(Six_voltage,n);
n+= a_conststutob_stu(vv,&msg_buf[n],4); //V
n+= a_conststutob_stu(fenhao,&msg_buf[n],4); //;
n+= a_conststutob_stu(ada,&msg_buf[n],8); //电流
n= sun_d(Supply_current,n);
n+= a_conststutob_stu(Ma,&msg_buf[n],8); //ma
n+= a_conststutob_stu(fenhao,&msg_buf[n],4); //;
n+=a_conststutob_stu(temper_a,&msg_buf[n],8);//温度
if(temper>0x80)//负
{
temp=~temper;
n+=a_conststutob_stu(fuhao,&msg_buf[n],4);//-
n=sun_d(temp,n); //转换温度数据
}
else
{
n=sun_d(temper,n); //转换温度数据
}
n+=a_conststutob_stu(cc,&msg_buf[n],4);//C
n+=a_conststutob_stu(fenhao,&msg_buf[n],4);//;
n+= a_conststutob_stu(codes,&msg_buf[n],8); //编码
switch(Work_code)//工作编码
{
case 'B' : n+= a_conststutob_stu(b,&msg_buf[n],4);break;//编码;
case 'C' : n+= a_conststutob_stu(c,&msg_buf[n],4);break;
case 'D' : n+= a_conststutob_stu(d,&msg_buf[n],4);break;
case 'G' : n+= a_conststutob_stu(g,&msg_buf[n],4);break;
case 'K' : n+= a_conststutob_stu(k,&msg_buf[n],4);break;
case 'M' : n+= a_conststutob_stu(m,&msg_buf[n],4);break;
case 'N' : n+= a_conststutob_stu(nn,&msg_buf[n],4);break;
case 'O' : n+= a_conststutob_stu(o,&msg_buf[n],4);break;
case 'Q' : n+= a_conststutob_stu(q,&msg_buf[n],4);break;
case 'T' : n+= a_conststutob_stu(t,&msg_buf[n],4);break;
case 'Y' : n+= a_conststutob_stu(y,&msg_buf[n],4);break;
case 'Z' : n+= a_conststutob_stu(z,&msg_buf[n],4);break;
case 'A' : n+= a_conststutob_stu(AA,&msg_buf[n],4);break;
case 'E' : n+= a_conststutob_stu(e,&msg_buf[n],4);break;
case 'F' : n+= a_conststutob_stu(f,&msg_buf[n],4);break;
case 'H' : n+= a_conststutob_stu(h,&msg_buf[n],4);break;
case 'I' : n+= a_conststutob_stu(t,&msg_buf[n],4);break;
case 'J' : n+= a_conststutob_stu(j,&msg_buf[n],4);break;
case 'L' : n+= a_conststutob_stu(l,&msg_buf[n],4);break;
case 'P' : n+= a_conststutob_stu(p,&msg_buf[n],4);break;
case 'R' : n+= a_conststutob_stu(r,&msg_buf[n],4);break;
case 'S' : n+= a_conststutob_stu(s,&msg_buf[n],4);break;
case 'U' : n+= a_conststutob_stu(u,&msg_buf[n],4);break;
case 'v' : n+= a_conststutob_stu(vv,&msg_buf[n],4);break;
case 'W' : n+= a_conststutob_stu(w,&msg_buf[n],4);break;
default:
break;
}
n+= a_conststutob_stu(fenhao,&msg_buf[n],4); //;
n+= a_conststutob_stu(work,&msg_buf[n],8); //工作
n= sun_d(Action_cycle,n); //20
n+= a_conststutob_stu(s,&msg_buf[n],4); //s
n+= a_conststutob_stu(fenhao,&msg_buf[n],4); //;
n+= a_conststutob_stu(Stopping,&msg_buf[n],8); //休止
n= sun_d(Stops_cycle,n); //20
n+= a_conststutob_stu(s,&msg_buf[n],4); //s
n+= a_conststutob_stu(fenhao,&msg_buf[n],4); //;
n+= a_conststutob_stu(rxt,&msg_buf[n],8); //接收
if(Receiver_c)
{
n+= a_conststutob_stu(okt,&msg_buf[n],8); //正常
}
else
{
n+= a_conststutob_stu(errt,&msg_buf[n],8); //故障
}
n+= a_conststutob_stu(fenhao,&msg_buf[n],4); //;
n+= a_conststutob_stu(txt,&msg_buf[n],8); //发射
if(Receiver_c)
{
n+= a_conststutob_stu(okt,&msg_buf[n],8); //正常
}
else
{
n+= a_conststutob_stu(errt,&msg_buf[n],8); //故障
}
n+= a_conststutob_stu(fenhao,&msg_buf[n],4); //;
n+= a_conststutob_stu(pinlv,&msg_buf[n],8); //频率
if(Receiver_c)
{
n+= a_conststutob_stu(okt,&msg_buf[n],8); //正常
}
else
{
n+= a_conststutob_stu(errt,&msg_buf[n],8); //故障
}
n+= a_conststutob_stu(juhao,&msg_buf[n],4); //.
}
void event_06(void) //事件06
{
}
void event_07(void) //事件07
{
}
void event_08(void) //事件08
{
uint n=12;
eeprom_read_block (&msg_buf[0],&E_name[0],12); //读名称
n+= a_conststutob_stu(maohao,&msg_buf[n],4); //:
n+=a_conststutob_stu(system_work,&msg_buf[n],28);//"系统上电工作"
n+=a_conststutob_stu(powa,&msg_buf[n],8); //"电源"
n+=a_conststutob_stu(Voltage,&msg_buf[n],8); //"电压"
n= adv_a(adv_m,n); //转换电源1电压数据
n+=a_conststutob_stu(vv,&msg_buf[n],4); //'V'
n+=a_conststutob_stu(juhao,&msg_buf[n],4); //'.'
}
void event_09(void) //事件09
{
uint n=12;
eeprom_read_block (&msg_buf[0],&E_name[0],12); //读名称
n+= a_conststutob_stu(maohao,&msg_buf[n],4); //:
n+=a_conststutob_stu(TXErr,&msg_buf[n],48);//通讯故障
}
void event_10(void) //事件10
{
uint n=12;
eeprom_read_block (&msg_buf[0],&E_name[0],12); //读名称
n+= a_conststutob_stu(maohao,&msg_buf[n],4); //:
n+= a_conststutob_stu(zlcw,&msg_buf[n],16); //指令错误
n+= a_conststutob_stu(juhao,&msg_buf[n],4); //.
}
void event_11(void) //事件11
{
uint i=0,m=0,n=12;
uchar a=0,b=0,c=0;
uchar buf[16],buf1[64];
eeprom_read_block (&msg_buf[0],&E_name[0],12); //读名称
n+= a_conststutob_stu(fenhao,&msg_buf[n],4); //;
for(m=0;m<2;m++)
{
eeprom_read_block (&buf[0],&E_phone[m],16); //读号码0-2
i =countsn(buf); // 字节计数
b=0;
for(a=0;a<i;a++)
{
c=a_conststutob_stu(uin,&buf1[b],3); //添加003
b+=3;
buf1[b++]=buf[a];
}
n+= a_stutob_stu(buf1,&msg_buf[n],b); //转换号码到PDU
n+= a_conststutob_stu(fenhao,&msg_buf[n],4); //;
}
}
void event_12(void) //事件12
{
uint i=0,m=0,n=12;
uchar a=0,b=0,c=0;
uchar buf[16],buf1[64];
eeprom_read_block (&msg_buf[0],&E_name[0],12); //读名称
n+= a_conststutob_stu(fenhao,&msg_buf[n],4); //;
for(m=3;m<4;m++)
{
eeprom_read_block (&buf[0],&E_phone[m],16); //读号码3-4
i =countsn(buf); // 字节计数
b=0;
for(a=0;a<i;a++)
{
c=a_conststutob_stu(uin,&buf1[b],3); //添加003
b+=3;
buf1[b++]=buf[a];
}
n+= a_stutob_stu(buf1,&msg_buf[n],b); //转换号码到PDU
n+= a_conststutob_stu(fenhao,&msg_buf[n],4); //;
}
}
void event_13(void) //事件13
{
}
void event_14(void) //事件14
{
uint n=12;
uchar a=0,b=0,c=0;
uchar buf[16],buf1[64];
eeprom_read_block (&msg_buf[0],&E_name[0],12); //读名称
n+= a_conststutob_stu(maohao,&msg_buf[n],4); //:
if(WDT_C)
{
WDT_C=0;
n+= a_conststutob_stu(wdt,&msg_buf[n],24); //看门狗复位
}
n+= a_conststutob_stu(sn,&msg_buf[n],8); //SN
n+= a_conststutob_stu(maohao,&msg_buf[n],4); //:
eeprom_read_block (&buf[0],&E_ID[0],7); //读ID
b=0;
for(a=0;a<7;a++)
{
c=a_conststutob_stu(uin,&buf1[b],3); //添加003
b+=3;
buf1[b++]=buf[a];
}
n+= a_stutob_stu(buf1,&msg_buf[n],b); //转换号码到PDU
n+=a_conststutob_stu(juhao,&msg_buf[n],4); //.
n+= a_conststutob_stu(xmm,&msg_buf[n],12); //新密码
n+= a_conststutob_stu(maohao,&msg_buf[n],4); //:
eeprom_read_block (&msg_buf[n],&E_mm[0],16); //读mm
n+=16;
n+= a_conststutob_stu(juhao,&msg_buf[n],4); //.
}
//----------------------------------------
void event_21(void) //事件21
{
uint n=12;
eeprom_read_block (&msg_buf[0],&E_name[0],12); //读名称
n+= a_conststutob_stu(maohao,&msg_buf[n],4); //:
n+=a_conststutob_stu(powa,&msg_buf[n],8); //"电源"
n+=a_conststutob_stu(Voltage,&msg_buf[n],8); //"电压"
n= adv_a(adv_m,n); //转换电源1电压数据
n+=a_conststutob_stu(vv,&msg_buf[n],4); //'V'
n+=a_conststutob_stu(douhao,&msg_buf[n],4); //','
n+=a_conststutob_stu(batt_vdc,&msg_buf[n],24); //蓄电池电压:
n= adv_a(batt_m,n); //转换蓄电池电压
n+=a_conststutob_stu(vv,&msg_buf[n],4); //'V'
n+=a_conststutob_stu(juhao,&msg_buf[n],4); //'.'
}
//----------------------------------------
void event_22(void) //事件32
{
uint n=12;
eeprom_read_block (&msg_buf[0],&E_name[0],12); //读名称
n+= a_conststutob_stu(maohao,&msg_buf[n],4); //:
n+=a_conststutob_stu(sys_pow_down,&msg_buf[n],88);//"系统断电,由蓄电池维持通讯工作!蓄电池电压:
n= adv_a(batt_m,n); //转换电源1电压数据
n+=a_conststutob_stu(vv,&msg_buf[n],4); //'V'
n+=a_conststutob_stu(juhao,&msg_buf[n],4); //'.'
}
/*******************************************************************/
//以下是PDU全串的编解码模块。为简化编程,有些字段用了固定值。
// PDU编码,用于编制、发送短消息
// pDst: 目标PDU串指针
//phone: 电话号码串指针(EEPROM内)
//msg: 用户需发送的短信数据(16进制汉字和完整的BCD码)
// 返回: 目标PDU串长度(PDU数据已经整理完毕,可以直接发送*PDst;)
//*****************************************************************//
void gsmEncodePdu( uchar* pDst,uchar *phone,uchar *msg)
{
uchar addr_buf[16]; //短信中心;0x23'#'是结束符号
uchar phone_buf[16]; //电话号码
uint nLength; // 内部用的串长度
uint nDstLength; // 目标PDU串长度
uchar buf[8]; // 内部用的缓冲区
uchar a;
eeprom_busy_wait();
eeprom_read_block (&phone_buf[0],&phone[0], 16); //读电话号码n
eeprom_busy_wait();
eeprom_read_block (&addr_buf[0],&E_addr[0], 16); //从码片读短信中心号码
// SMSC地址信息段
nLength = countsn(addr_buf); // SMSC地址字符串的长度
if(nLength>16)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -