📄 recievecomm.cpp
字号:
}
RecieveData22[22] = int(Accum/256) & 255; RecieveData22[23] = Accum & 255;
if ((RecieveData22[20] == RecieveData22[22]) & (RecieveData22[21] == RecieveData22[23])) { //二十二字节的CRC校验正确.
if ((RecieveData22[1] == 0x01) && (RecieveData22[5] == 0x02)) { //中继站转发遥测站的数据.
//AfxMessageBox(_T("二十二字节的CRC校验正确"));///显示当前记录条数
CRecordStation record; CRecordData recordData; CRecordSend recordSend;
bool bResult = g_DB.SeekStationDB(CEDB_SEEK_BEGINNING, 0);
bResult = g_DB.ReadStationRecord(record);
while(bResult){//依次查询Station.cdb中的各条记录。
//AfxMessageBox(_T("依次查询Station.cdb中的各条记录"));///显示当前记录条数
int Station_Num;
sprintf(str, "%s ", record.m_strAddress);//以字符串的方式读取字符串.
sscanf(str, "%d", &Station_Num);//将字符串送给整数变量.
int RainStation,WaterStation,KaiduStation;char str[20];
sprintf(str, "%s ", record.m_strRainStation);//以字符串的方式读取字符串.
sscanf(str, "%d", &RainStation);//将字符串送给整数变量.
sprintf(str, "%s ", record.m_strWaterStation);//以字符串的方式读取字符串.
sscanf(str, "%d", &WaterStation);//将字符串送给整数变量.
sprintf(str, "%s ", record.m_strKaiduStation);//以字符串的方式读取字符串.
sscanf(str, "%d", &KaiduStation);//将字符串送给整数变量.
if (Station_Num == RecieveData22[3]){//在站名表中找到了与自报数据串相同的站号,则进行数据存盘处理.
if ((RecieveData22[6] == 0x53) && (RainStation == 1)) { //存贮雨量特征字.
//AfxMessageBox(_T("存贮雨量特征字"));///显示当前记录条数
recordData.m_strAddress = record.m_strAddress; //站号.
WideCharToMultiByte(CP_ACP,0,record.m_strName,-1,str,20,NULL,NULL);//实现UNICODE字符到ANSI字符的转换.
recordData.m_strName = str; //站名.必须用宽字符传送字符串.
sprintf(str, "%d-%d-%d %d:%d:%d",RecieveData22[15]+1900,RecieveData22[16],RecieveData22[17],RecieveData22[18],RecieveData22[19],0);//timeNow.GetSecond() 以字符串的方式读取字符串.
recordData.m_DateTime = str; //存贮来数时间.
record.m_DateTime = str; //存贮来数时间.
float Jindu1;
WideCharToMultiByte(CP_ACP,0,record.m_strRainTotal,-1,str,10,NULL,NULL);//实现UNICODE字符到ANSI字符的转换.
sscanf(str, "%d", &OldRain1);//将字符串送给整数变量.
WideCharToMultiByte(CP_ACP,0,record.m_strRainFenbian,-1,str,10,NULL,NULL);//实现UNICODE字符到ANSI字符的转换.
sscanf(str, "%f", &Jindu1);//将字符串送给整数变量.
if (RecieveData22[11] == 0x00) recordData.m_strType = _T("雨量");//
else recordData.m_strType = _T("测试雨量");
int NewRain1,NewRain2; NewRain1 = RecieveData22[13]*256+RecieveData22[14];
NewRain2 = NewRain1 - OldRain1; if (NewRain2 <= 0) NewRain2 = 0;
//sprintf(str, "%#.1f(%d)", NewRain2*Jindu1, NewRain1);
sprintf(str, "%#.1f", NewRain2*Jindu1);
recordData.m_strData = str; //存贮数据.
sprintf(str, "%d", NewRain1);
record.m_strRainTotal = str;
CEPROPVAL *prgPropVal = record.NewPropVal();
bResult = g_DB.UpdateStationRecord(record);//永久存贮数据.
bResult = g_DB.AddDataRecord(recordData);//永久存贮数据.
recordSend.m_strAddress = recordData.m_strAddress;
recordSend.m_strName = recordData.m_strName;
recordSend.m_DateTime = recordData.m_DateTime;
recordSend.m_strType = recordData.m_strType;
recordSend.m_strData = recordData.m_strData;
bResult = g_DB.AddSendRecord(recordSend);//永久存贮数据.
}//存贮雨量特征字.
if ((RecieveData22[6] == 0x56) && (RecieveData22[12] == 0x11) && (WaterStation == 1)){ //存贮水位特征字.
recordData.m_strAddress = record.m_strAddress; //站号.
WideCharToMultiByte(CP_ACP,0,record.m_strName,-1,str,20,NULL,NULL);//实现UNICODE字符到ANSI字符的转换.
recordData.m_strName = str; //站名.必须用宽字符传送字符串.
sprintf(str, "%d-%d-%d %d:%d:%d",RecieveData22[15]+1900,RecieveData22[16],RecieveData22[17],RecieveData22[18],RecieveData22[19],0);//timeNow.GetSecond() 以字符串的方式读取字符串.
recordData.m_DateTime = str; //存贮来数时间.
record.m_DateTime = str; //存贮来数时间.
float WaterHeight;
WideCharToMultiByte(CP_ACP,0,record.m_strWaterHeight,-1,str,10,NULL,NULL);//实现UNICODE字符到ANSI字符的转换.
sscanf(str, "%f", &WaterHeight);//将字符串送给整数变量.
if (RecieveData22[11] == 0x00) recordData.m_strType = _T("水位");
else recordData.m_strType = _T("测试水位");
sprintf(str, "%5.2lf", WaterHeight+(RecieveData22[13]*256+RecieveData22[14])*0.01f);
recordData.m_strData = str; //存贮数据.
CEPROPVAL *prgPropVal = record.NewPropVal();
bResult = g_DB.UpdateStationRecord(record);//永久存贮数据.
bResult = g_DB.AddDataRecord(recordData);//永久存贮数据.
recordSend.m_strAddress = recordData.m_strAddress;
recordSend.m_strName = recordData.m_strName;
recordSend.m_DateTime = recordData.m_DateTime;
recordSend.m_strType = recordData.m_strType;
recordSend.m_strData = recordData.m_strData;
bResult = g_DB.AddSendRecord(recordSend);//永久存贮数据.
} //存贮水位特征字.
if ((RecieveData22[6] == 0x56) && (RecieveData22[12] == 0x12) && (KaiduStation == 1)){ //存贮闸位特征字.
recordData.m_strAddress = record.m_strAddress; //站号.
WideCharToMultiByte(CP_ACP,0,record.m_strName,-1,str,20,NULL,NULL);//实现UNICODE字符到ANSI字符的转换.
recordData.m_strName = str; //站名.必须用宽字符传送字符串.
sprintf(str, "%d-%d-%d %d:%d:%d",RecieveData22[15]+1900,RecieveData22[16],RecieveData22[17],RecieveData22[18],RecieveData22[19],0);//timeNow.GetSecond() 以字符串的方式读取字符串.
recordData.m_DateTime = str; //存贮来数时间.
record.m_DateTime = str; //存贮来数时间.
float WaterHeight = -0.78f;//调准闸门开度的初始值.
//WideCharToMultiByte(CP_ACP,0,record.m_strWaterHeight,-1,str,10,NULL,NULL);//实现UNICODE字符到ANSI字符的转换.
//sscanf(str, "%f", &WaterHeight);//将字符串送给整数变量.
if (RecieveData22[11] == 0x00) recordData.m_strType = _T("闸位");
else recordData.m_strType = _T("测试闸位");
sprintf(str, "%5.2lf", WaterHeight+(RecieveData22[13]*256+RecieveData22[14])*0.01f);
recordData.m_strData = str; //存贮数据.
CEPROPVAL *prgPropVal = record.NewPropVal();
bResult = g_DB.UpdateStationRecord(record);//永久存贮数据.
bResult = g_DB.AddDataRecord(recordData);//永久存贮数据.
recordSend.m_strAddress = recordData.m_strAddress;
recordSend.m_strName = recordData.m_strName;
recordSend.m_DateTime = recordData.m_DateTime;
recordSend.m_strType = recordData.m_strType;
recordSend.m_strData = recordData.m_strData;
bResult = g_DB.AddSendRecord(recordSend);//永久存贮数据.
}//存贮闸位特征字.
//发送应答.
RecieveData22[1] = 0x02; RecieveData22[5] = 0x01;
COleDateTime timeNow = COleDateTime::GetCurrentTime();//获取计算机时钟.
RecieveData22[10] = 12;
RecieveData22[13] = timeNow.GetYear() - 1900;
RecieveData22[14] = timeNow.GetMonth();
RecieveData22[15] = timeNow.GetDay();
RecieveData22[16] = timeNow.GetHour();
RecieveData22[17] = timeNow.GetMinute();
RecieveData22[18] = timeNow.GetSecond();
sprintf(str, "%s ", record.m_strSetup1);//以字符串的方式读取字符串.
sscanf(str, "%d", &KaiduStation);//将字符串送给整数变量.
RecieveData22[19] = KaiduStation;//雨量阀值.
sprintf(str, "%s ", record.m_strSetup2);//以字符串的方式读取字符串.
sscanf(str, "%d", &KaiduStation);//将字符串送给整数变量.
RecieveData22[20] = KaiduStation;//水位阀值.
sprintf(str, "%s ", record.m_strSetup3);//以字符串的方式读取字符串.
sscanf(str, "%d", &KaiduStation);//将字符串送给整数变量.
RecieveData22[21] = KaiduStation;//水位采集间隔.
sprintf(str, "%s ", record.m_strSetup4);//以字符串的方式读取字符串.
sscanf(str, "%d", &KaiduStation);//将字符串送给整数变量.
RecieveData22[22] = KaiduStation;//数据自报间隔.
int Accum = 65535;int TT; //计算CRC校验值accum.
for (i1=0; i1 < 23; i1++){
Accum ^= RecieveData22[i1];
for (int j=1; j <= 8; j++){
TT = Accum & 1; Accum = int(Accum/2) & 32767;
if (TT == 1) Accum ^= 40961;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -