📄 单字节短信采集 main.c
字号:
EnergyData[0] = BUF_METER[TotalE_Addr] - 0x33;
EnergyData[1] = BUF_METER[TotalE_Addr+1] - 0x33;
EnergyData[2] = BUF_METER[TotalE_Addr+2] - 0x33;
EnergyData[3] = BUF_METER[TotalE_Addr+3] - 0x33;
ConvertToUCS2();
//填入总电量UCS2数据............
for(tt=0;tt<36;tt++)
{
SMS_Return[EnergyDataAddr+TotalE_Length+tt] = EnergyDataUCS2[tt];
}
//尖:---------------------------------------------------
SEPosition = EnergyDataAddr + TotalE_Length + 36;//=0x54
for(tt=0;tt<SharpE_Length;tt++)
{
SMS_Return[SEPosition+tt] = SharpE[tt];
}
EnergyData[0] = BUF_METER[SharpE_Addr] - 0x33;
EnergyData[1] = BUF_METER[SharpE_Addr+1] - 0x33;
EnergyData[2] = BUF_METER[SharpE_Addr+2] - 0x33;
EnergyData[3] = BUF_METER[SharpE_Addr+3] - 0x33;
ConvertToUCS2();
//填入尖电量UCS2数据............
for(tt=0;tt<36;tt++)
{
SMS_Return[SEPosition+SharpE_Length+tt] = EnergyDataUCS2[tt];
}
//峰:---------------------------------------------------
PEPosition=SEPosition + SharpE_Length + 36;//=0x54
for(tt=0;tt<PeakE_Length;tt++)
{
SMS_Return[PEPosition+tt] = PeakE[tt];
}
EnergyData[0] = BUF_METER[PeakE_Addr] - 0x33;
EnergyData[1] = BUF_METER[PeakE_Addr+1] - 0x33;
EnergyData[2] = BUF_METER[PeakE_Addr+2] - 0x33;
EnergyData[3] = BUF_METER[PeakE_Addr+3] - 0x33;
ConvertToUCS2();
//填入峰电量UCS2数据............
for(tt=0;tt<36;tt++)
{
SMS_Return[PEPosition+PeakE_Length+tt] = EnergyDataUCS2[tt];
}
//平:---------------------------------------------------
DEPosition=PEPosition + PeakE_Length + 36;//=0x54
for(tt=0;tt<DayE_Length;tt++)
{
SMS_Return[DEPosition+tt] = DayE[tt];
}
EnergyData[0] = BUF_METER[DayE_Addr] - 0x33;
EnergyData[1] = BUF_METER[DayE_Addr+1] - 0x33;
EnergyData[2] = BUF_METER[DayE_Addr+2] - 0x33;
EnergyData[3] = BUF_METER[DayE_Addr+3] - 0x33;
ConvertToUCS2();
//填入峰电量UCS2数据............
for(tt=0;tt<36;tt++)
{
SMS_Return[DEPosition+DayE_Length+tt] = EnergyDataUCS2[tt];
}
/*
//谷:---------------------------------------------------
LEPosition=DEPosition + DayE_Length + 36;//=0x54
for(tt=0;tt<LowE_Length;tt++)
{
SMS_Return[LEPosition+tt] = LowE[tt];
}
EnergyData[0] = BUF_METER[LowE_Addr] - 0x33;
EnergyData[1] = BUF_METER[LowE_Addr+1] - 0x33;
EnergyData[2] = BUF_METER[LowE_Addr+2] - 0x33;
EnergyData[3] = BUF_METER[LowE_Addr+3] - 0x33;
ConvertToUCS2();
//填入峰电量UCS2数据............
for(tt=0;tt<36;tt++)
{
SMS_Return[LEPosition+LowE_Length+tt] = EnergyDataUCS2[tt];
}
*/
//------------------------------------------------------------------------------
//最大0x8C,有功总: 就4个字符,但乘2变成8作为UDL,而实际占用的字节是8再乘2 =16字节
//如此算来,4个字节的电量,再加小数点共9个字符,UDL的长度应为18,而实际占用36个字节.
//这样,用功总:123456.78 的UDLLength=8+18=26
UDLLength = 26+22+22+22; //总尖峰平92(5CH),最大8C
temp3 = UDLLength;
dLength = temp3 + 15;
temp1 = temp3>>4; // 除以16转换成16进制的两个数字
tt = temp1<<4;
temp2 = temp3 - tt; //如果temp2=A~F?
B2ASC();
SMS_Return[UDLAddr] = temp1 + 0x30;
SMS_Return[UDLAddr + 1] = temp2;
//结束符
AllLength = DEPosition + DayE_Length + 36; //D8
SMS_Return[AllLength] = _CTRLZ;
//CMGS send
///////////////////////////////
for(k=0;k<32;k++)
{
RecvFromMS[k] = 0;
}
///////////////////////////////
LoadCMD_CMGS();
WaitReturn = 0;
if(dLength >= 100)
{
tempArr[0] = dLength / 100; //求百位
temp2 = dLength-(dLength / 100) * 100;
tempArr[1] = temp2 / 10; //求十位
tempArr[2] = temp2-(temp2 / 10) * 10; //求个位
TranToMS[AT_CMGS_SIZE] = tempArr[0]+0x30; //转换成字符
TranToMS[AT_CMGS_SIZE + 1] = tempArr[1]+0x30; //转换成字符
TranToMS[AT_CMGS_SIZE + 2] = tempArr[2]+0x30; //转换成字符
TranToMS[AT_CMGS_SIZE + 3] = _CR;
SendToModule (AT_CMGS_SIZE + 4);
}
else if(dLength >= 10)
{
tempArr[0] = dLength/10; //求十位
tempArr[1] = dLength-(dLength/10)*10; //求个位
TranToMS[AT_CMGS_SIZE] = tempArr[0]+0x30; //转换成字符
TranToMS[AT_CMGS_SIZE + 1] = tempArr[1]+0x30; //转换成字符
TranToMS[AT_CMGS_SIZE + 2] = _CR;
SendToModule (AT_CMGS_SIZE + 3);
}
else //dLength<10
{
TranToMS[AT_CMGS_SIZE] = dLength + 0x30; //转换成字符
TranToMS[AT_CMGS_SIZE + 1] = _CR;
SendToModule (AT_CMGS_SIZE + 2);
}
delay200ms ();
//取出准备好的电量数据
for(k = 0;k < (AllLength+1);k++)
{
TranToMS[k] = SMS_Return[k];
}
//data send to main station
WaitReturn = 3;
SendToModule (AllLength + 1); //+1: 加上了_CTRLZ
for(k = 100;k>0;k--) //延时5秒
{
if(FrameFlag.Bit.EchoModule == 1)
break;
delay50ms ();
}
cRet = strncmppgm2ram(RecvFromMS,PlusCMGS,L_PlusCMGS);
if(cRet == 0)
{//短信发送成功
ClearCommREG();
ErrorMSG();
}
TempFlag.Bit.SMS_GetData = 0;
FrameFlag.Bit.REV_Meter = 0;
}//END of if(TempFlag.Bit.SMS_GetData == 1)
if(TempFlag.Bit.GPRS_CMD ==1)
{//GPRS采数
TempFlag.Bit.GPRS_CMD = 0;
LoadCMD_CIPSEND();
WaitReturn = 0;
dLength = BUF_METER[9]+12;
if(dLength>=100)
{
tempArr[0] = dLength / 100; //求百位
temp2 = dLength-(dLength / 100) * 100;
tempArr[1] = temp2 / 10; //求十位
tempArr[2] = temp2-(temp2 / 10) * 10; //求个位
TranToMS[CIPSEND_SIZE] = _EQUAL;
TranToMS[CIPSEND_SIZE + 1] = tempArr[0]+0x30; //转换成字符
TranToMS[CIPSEND_SIZE + 2] = tempArr[1]+0x30; //转换成字符
TranToMS[CIPSEND_SIZE + 3] = tempArr[2]+0x30; //转换成字符
TranToMS[CIPSEND_SIZE + 4] = _CR;
SendToModule (CIPSEND_SIZE + 5);
}
else if(dLength >= 10)
{
tempArr[0] = dLength/10; //求十位
tempArr[1] = dLength-(dLength/10)*10; //求个位
TranToMS[CIPSEND_SIZE] = _EQUAL;
TranToMS[CIPSEND_SIZE + 1] = tempArr[0]+0x30; //转换成字符
TranToMS[CIPSEND_SIZE + 2] = tempArr[1]+0x30; //转换成字符
TranToMS[CIPSEND_SIZE + 3] = _CR;
SendToModule (CIPSEND_SIZE + 4);
}
else //dLength<10
{
TranToMS[CIPSEND_SIZE] = _EQUAL;
TranToMS[CIPSEND_SIZE + 1] = dLength + 0x30; //转换成字符
TranToMS[CIPSEND_SIZE + 2] = _CR;
SendToModule (CIPSEND_SIZE + 3);
}
delay10ms ();
for(k=0;k<dLength;k++)
{
TranToMS[k] = BUF_METER[k];
}
WaitReturn = 0;
SendToModule (dLength); //把从电表那收到的回送上传给主站
for(k = 40;k>0;k--) //延时2秒
{
if(FrameFlag.Bit.EchoModule == 1)
break;
delay50ms ();
}
while(FrameFlag.Bit.EchoModule == 0) //等待返回SEND OK
{
Nop();
RWDTemp = FiveSeconds; //等待FiveSeconds秒
if(RevWaitDelay>RWDTemp)
{
//下电、上电、延时、初始化,重发cipstart
SendToModule (dLength); //重发
RevWaitDelay = 0;
}//END if(RevWaitDelay>FiveSeconds)
}//END while(FrameFlag.Bit.EchoModule == 0)
Nop();
FrameFlag.Bit.REV_Meter = 0; //清除“电表回送一帧”标志
cRet = strncmppgm2ram(RecvFromMS,SEND_OK,L_SEND_OK);
if(cRet == 0)
{
MinCounter = 0;
}
else
{
Proc_err();
}
}
}//END if(FrameFlag.Bit.REV_Meter == 1)
}//END while (1)
}//END of main()
// ******* 子函数 ***************
void B2ASC(void)
{
if(temp2>=0 && temp2<=9) //如果字符是十进制数字,返回非0
{
temp2 += 0x30;
}
else
{
temp2 += 55;
}
}
void Load645Header(void)
{
BUF_METER[0] = 0xFF;
BUF_METER[1] = 0xFE;
BUF_METER[2] = 0x68;
/*
BUF_METER[3] = 0x99;
BUF_METER[4] = 0x99;
BUF_METER[5] = 0x99;
BUF_METER[6] = 0x99;
BUF_METER[7] = 0x99;
BUF_METER[8] = 0x99;
*/
BUF_METER[3] = 0x00;
BUF_METER[4] = 0x00;
BUF_METER[5] = 0x00;
BUF_METER[6] = 0x00;
BUF_METER[7] = 0x00;
BUF_METER[8] = 0x00;
BUF_METER[9] = 0x68;
BUF_METER[10] = 0x01;
BUF_METER[11] = 0x02;
}
void ASC2B(void)
{
if(isdigit(temp2)) //如果字符是十进制数字,返回非0
{
temp2 -=0x30;
}
else if(isalpha(temp2))
{
switch (temp2)
{
case 'A':
case 'a':
temp2 = 0x0A;
break;
case 'B':
case 'b':
temp2 = 0x0B;
break;
case 'C':
case 'c':
temp2 = 0x0C;
break;
case 'D':
case 'd':
temp2 = 0x0D;
break;
case 'E':
case 'e':
temp2 = 0x0E;
break;
case 'F':
case 'f':
temp2= 0x0F;
break;
default:
return;
}
}
}
void Proc_SMS(void)
{
unsigned char ii,DotCounter;
SMS_Start = 0x10;
Index0 = RecvFromMS[15]; //取得这个短信的INDEX
Index1 = RecvFromMS[16]; //INDEX不能大于99
LoadCMD_CMGR();
WaitReturn = 4;
SendToModule (CMGR_CMGD_SIZE);
delay50ms ();
delay50ms ();
TempFlag.Bit.f0 = 0;
while(TempFlag.Bit.f0 == 0)
{
Nop();
if(FrameFlag.Bit.EchoModule == 1)
{
ClearCommREG();
TempFlag.Bit.f0 = 1;
}
else
{
RWDTemp = TenSeconds; ////
if(RevWaitDelay > RWDTemp) //等待x秒
{
WaitReturn = 4;
SendToModule (CMGR_CMGD_SIZE);
delay50ms ();
}
}
}//END while(1)
//加上超时判断,除法改为移位
//取出 Address_Length
temp3 = CMGR_Echo+MGHeader-2;
if(RecvFromMS[temp3]>='A' && RecvFromMS[temp3]<'G')
temp1 = RecvFromMS[temp3]-0x41+0x0A;
else if(RecvFromMS[temp3]>='0' && RecvFromMS[temp3]<='9')
temp1 = RecvFromMS[temp3]-0x30;
else
{
ErrorMSG(); //删除该短信
return;
}
temp3 += 1;
if(RecvFromMS[temp3]>='A' && RecvFromMS[temp3]<'G')
temp2 = RecvFromMS[temp3]-0x41+0x0A;
else if(RecvFromMS[temp3]>='0' && RecvFromMS[temp3]<='9')
temp2 = RecvFromMS[temp3]-0x30;
else
{
ErrorMSG(); //删除该短信
return;
}
Address_Length = temp1 << 4; // *16+temp2
Address_Length = Address_Length + temp2;
temp3 = Address_Length & 0x01;
if(temp3 == 1) //奇数,0DH,要加填充位
Address_Length++;
//取出 TP_UDL
IndexOfTP_UDL = CMGR_Echo + MGHeader + 2 + Address_Length + 18;//18=(1+1+7)*2
// temp3 = CMGR_Echo+MGHeader-2;
if(RecvFromMS[IndexOfTP_UDL]>='A' && RecvFromMS[IndexOfTP_UDL]<'G')
temp1 = RecvFromMS[IndexOfTP_UDL]-0x41+0x0A;
else if(RecvFromMS[IndexOfTP_UDL]>='0' && RecvFromMS[IndexOfTP_UDL]<='9')
temp1 = RecvFromMS[IndexOfTP_UDL]-0x30;
else
{
ErrorMSG(); //删除该短信
return;
}
if(RecvFromMS[IndexOfTP_UDL + 1]>='A' && RecvFromMS[IndexOfTP_UDL + 1]<'G')
temp2 = RecvFromMS[IndexOfTP_UDL + 1]-0x41+0x0A;
else if(RecvFromMS[IndexOfTP_UDL + 1]>='0' && RecvFromMS[IndexOfTP_UDL + 1]<='9')
temp2 = RecvFromMS[IndexOfTP_UDL + 1]-0x30;
else
{
ErrorMSG(); //删除该短信
return;
}
TP_UDL = temp1 << 4; // (*16+temp2)/2;
TP_UDL = TP_UDL + temp2;
TP_UDL = TP_UDL >> 1;
////15个字节长的IP地址+port=2020(9个字节长)
DataAddr = IndexOfTP_UDL + 2;
/*收到 DL(电量),UDL=04,意指0044 004C,但实际发送过来是8个字节:
30 30 34 34 30 30 34 43
TP_UDL除以2后=2
RecvFromMS[72]、[73]是UDL:30 34
*/
if(TP_UDL == 0 || TP_UDL == 1)
{//短信采集数据:当前电量:DL
if(TP_UDL == 1)
{
temp1 = RecvFromMS[DataAddr+2]; //+2:跳过30 30
temp2 = RecvFromMS[DataAddr+3];
}
else if(TP_UDL == 0)
{
temp1 = RecvFromMS[DataAddr]; //GSM模式没30
temp2 = RecvFromMS[DataAddr+1];
}
if(temp1 < '0' || temp1 > '9') //发过来的是字母:41H~5AH,所以高位是数字
{
ErrorMSG(); //删除该短信
return;
}
ASC2B();
temp3 = (temp1-0x30)<<4 ;
SMS_CMD[0] = temp3 + temp2; //D
//命令解析
// ---------------------------------------------------
if(SMS_CMD[0] == 'R' && SMS_CMD[1] == 'r') //module复位命令
{
ResetModule();
for(k = 70;k>0;k--) //延时14秒
{
delay200ms ();
}
ClearCommREG();
////重新初始化,因Reset 之后,CGATT、CIPHEAD等设置被改变
Module_Init();
//清零标志字节
Flags.fCOMM = 0;
FrameFlag.FrameBYTE = 0;
ModuleSta.ModuleBYTE = 0;
TimeFlag.fTime = 0;
TempFlag.tTemp = 0;
}
else if(SMS_CMD[0] == 'D' || SMS_CMD[0] == 'd') //D:当前电量采集
{
Load645Header();
BUF_METER[12] = 0x1F + 0x33; //DI0
BUF_METER[13] = 0x90 + 0x33; //DI1
CHECKSUM();
TempFlag.Bit.SMS_GetData = 1;
SendCMDtoMeter(16);
}//END of "D"
else if(SMS_CMD[0] == 'F' || SMS_CMD[0] == 'f') //F:反向累计电量
{
}
else if(SMS_CMD[0] == 'S' || SMS_CMD[0] == 's') //S:上月电量
{
}
else if(SMS_CMD[0] == 'T' || SMS_CMD[0] == 't') //T:时间
{
}
}
//非短信采集
else if(TP_UDL >13)
{//将DCS编码的IP地址解析出来
LengthBUF2 = TP_UDL+3; //左引号,右引号,逗号
LengthIP = 0; //IP地址长度初始化为0
DotCounter = 0;
for(k=0;k<TP_UDL;k++)
{
temp1 = RecvFromMS[DataAddr+k*4+2];
temp2 = RecvFromMS[DataAddr+k*4+3];
if(temp1 == '2' && temp2 == 'E')
{
temp3 = '.' ;
DotCounter++;
}
else if(temp1 >= '0' && temp1 <= '9' && temp2 >= '0' && temp2 <= '9')
temp3 = (temp1-0x30)*16 + (temp2-0x30);
else if(DotCounter == 3)
{break;}
else
{
ErrorMSG();
return;
}
Ip_start_buf2[k] = temp3;
LengthIP++;
if(LengthIP == 15)
break;
}//END for
Ip_start_buf2[k] = 0x00; //存入
//写入eeprom存储
W_eeprom(Ip_start_buf2,IPAddress,LengthIP+1);
///////////////////////////////////////////////////////////
IPAddressSeted = 0x33CC;
//读出看看。。。
///////////////////////////////////////////////////////////
ErrorMSG(); //删除该短信
LoadCMD_CIPSTATUS();
WaitReturn = 0;
SendToModule (CIPSTATUS_SIZE);
for(ii=60;ii>0;ii--) //延时3秒
{
if(FrameFlag.Bit.EchoModule == 1)
break;
delay50ms ();
}
if(strncmppgm2ram(RecvFromMS,CONNECT_OK,L_CONNECT_OK) == 0)
{
LoadCMD_CIPCLOSE();
WaitReturn = 0;
SendToModule (CIPCLOSE_SIZE);
for(ii=60;ii>0;ii--) //延时3秒
{
if(FrameFlag.Bit.EchoModule == 1)
break;
delay50ms ();
}
ClearCommREG();
/*
WaitReturn = 0;
LoadCMD_CIPSHUT();
SendToModule (CIPSHUT_SIZE);
for(ii=60;ii>0;ii--) //延时3秒
{
if(FrameFlag.Bit.EchoModule == 1)
break;
delay50ms ();
}
ClearCommREG();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -