📄 recievecomm.cpp
字号:
Accum &= 65535;
}
}
RecieveData22[23] = int(Accum/256) & 255;RecieveData22[24] = Accum & 255;
DWORD dwBytesWritten;
EscapeCommFunction(m_hIDComDev,SETRTS);//开发射机.
Sleep(50); //发送前延时五十毫秒.
for (i1=0; i1 <= 24; i1++) {
WriteFile(m_hIDComDev, (LPSTR)&RecieveData22[i1], 1, &dwBytesWritten, NULL); //一个字符一个字符地发送出去.
RecieveData22[i1] = i1;
}
Sleep(250); //发送后延时二百五十毫秒.
EscapeCommFunction(m_hIDComDev,CLRRTS);//关发射机.
}//结束:在站名表中找到了与自报数据串相同的站号,则进行数据存盘处理.
bResult = g_DB.SeekStationDB(CEDB_SEEK_CURRENT, 1);
if(bResult) bResult = g_DB.ReadStationRecord(record);
}//结束:依次查询Station.cdb中的各条记录。
}//中继站转发遥测站的数据.
}//二十二字节的CRC校验正确.
for (i1=0; i1 <= 23; i1++) RecieveData24[i1] = RecieveData24[i1+1];////每次只取一个数,放入循环缓冲区中.
RecieveData24[23] = buff[i]; //每次只取一个数,放入循环缓冲区中.
Accum = 65535; //计算CRC校验值accum.
for (i1=0; i1 < 22; i1++){
Accum ^= RecieveData24[i1];
for (int j=1; j <= 8; j++){
TT = Accum & 1; Accum = int(Accum/2) & 32767;
if (TT == 1) Accum ^= 40961;
Accum &= 65535;
}
}
RecieveData24[24] = int(Accum/256) & 255; RecieveData24[25] = Accum & 255;
if ((RecieveData24[22] == RecieveData24[24]) && (RecieveData24[23] == RecieveData24[25])) {//二十四字节的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中的各条记录。
int Station_Num;
sprintf(str, "%s ", record.m_strAddress);//以字符串的方式读取字符串.
sscanf(str, "%d", &Station_Num);//将字符串送给整数变量.
if (Station_Num == RecieveData24[3]){//在站名表中找到了与自报数据串相同的站号,则进行数据存盘处理.
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",RecieveData24[17]+1900,RecieveData24[18],RecieveData24[19],RecieveData24[20],RecieveData24[21],0);//timeNow.GetSecond() 以字符串的方式读取字符串.
recordData.m_DateTime = str; //存贮来数时间.
record.m_DateTime = str; //存贮来数时间.
if (RecieveData24[11] == 0x00) recordData.m_strType = _T("电压");
else recordData.m_strType = _T("测试电压");
union{float data;int dataI;char buffer[4];}convert;
convert.buffer[3] = (char)RecieveData24[13]; convert.buffer[2] = (char)RecieveData24[14]; convert.buffer[1] = (char)RecieveData24[15]; convert.buffer[0] = (char)RecieveData24[16];
char strData[10]; sprintf(strData, "%5.2lf", convert.data);
CEPROPVAL *prgPropVal = record.NewPropVal();
bResult = g_DB.UpdateStationRecord(record);//永久存贮数据.
recordData.m_strData = strData; //存贮数据.
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);//永久存贮数据.
}//结束:在站名表中找到了与自报数据串相同的站号,则进行数据存盘处理.
bResult = g_DB.SeekStationDB(CEDB_SEEK_CURRENT, 1);
if(bResult) bResult = g_DB.ReadStationRecord(record);
}//结束:依次查询Station.cdb中的各条记录。
if (RecieveData24[3] == 0x02){//如果是中继站发来的电压.
recordData.m_strAddress = "2"; //站号.
recordData.m_strName = "中继站";
sprintf(str, "%d-%d-%d %d:%d:%d",RecieveData24[17]+1900,RecieveData24[18],RecieveData24[19],RecieveData24[20],RecieveData24[21],0);//timeNow.GetSecond() 以字符串的方式读取字符串.
recordData.m_DateTime = str; //存贮来数时间.
if (RecieveData24[11] == 0x00) recordData.m_strType = _T("电压"); //存贮电压特征字.
else recordData.m_strType = _T("测试电压"); //存贮电压特征字.
union{float data;int dataI;char buffer[4];}convert;
convert.buffer[3] = (char)RecieveData24[13]; convert.buffer[2] = (char)RecieveData24[14]; convert.buffer[1] = (char)RecieveData24[15]; convert.buffer[0] = (char)RecieveData24[16];
sprintf(str, "%5.2lf", convert.data);
recordData.m_strData = str; //存贮数据.
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);//永久存贮数据.
}//结束:在站名表中找到了与自报数据串相同的站号,则进行数据存盘处理.
//发送应答.
RecieveData24[1] = 0x02; RecieveData24[4] = 0x01; RecieveData24[5] = 0x01;
COleDateTime timeNow = COleDateTime::GetCurrentTime();//获取计算机时钟.
RecieveData24[10] = 12;
RecieveData24[13] = timeNow.GetYear() - 1900;
RecieveData24[14] = timeNow.GetMonth();
RecieveData24[15] = timeNow.GetDay();
RecieveData24[16] = timeNow.GetHour();
RecieveData24[17] = timeNow.GetMinute();
RecieveData24[18] = timeNow.GetSecond();
RecieveData24[19] = 0;//雨量阀值.
RecieveData24[20] = 0;//水位阀值.
RecieveData24[21] = 0;//水位采集间隔.
RecieveData24[22] = 0;//数据自报间隔.
int Accum = 65535;int TT; //计算CRC校验值accum.
for (i1=0; i1 < 23; i1++){
Accum ^= RecieveData24[i1];
for (int j=1; j <= 8; j++){
TT = Accum & 1; Accum = int(Accum/2) & 32767;
if (TT == 1) Accum ^= 40961;
Accum &= 65535;
}
}
RecieveData24[23] = int(Accum/256) & 255;RecieveData24[24] = Accum & 255;
DWORD dwBytesWritten;
EscapeCommFunction(m_hIDComDev,SETRTS);//开发射机.
Sleep(50); //发送前延时五十毫秒.
for (i1=0; i1 <= 24; i1++) {
WriteFile(m_hIDComDev, (LPSTR)&RecieveData24[i1], 1, &dwBytesWritten, NULL); //一个字符一个字符地发送出去.
RecieveData24[i1] = i1;
}
Sleep(250); //发送后延时二百五十毫秒.
EscapeCommFunction(m_hIDComDev,CLRRTS);//关发射机.
}//二十四字节的CRC校验正确.
}//一个字节一个字节地分析数据.
delete buff; //释放变量buff的内存空间.
delete str; //释放变量str的内存空间.
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -