📄 infonet.cpp
字号:
}
}
// 处理参数文件的起始帧
void CMessageNet::BeginWriteFile(unsigned char *ReceiveData,int FileIndex)
{
FileCheckSum=0; //文件校验和赋初值
int nMaxLength=0;
switch(FileIndex){
case TFRMB_NEW_INDEX:
nMaxLength=8;
strRMB.Empty();
break;
case COLLECOD_INDEX:
nMaxLength=12;
strCollectList.Empty();
break;
case BLACKCOL_INDEX:
nMaxLength=5;
strBlackList.Empty();
break;
case BLACKCAR_INDEX:
nMaxLength=10;
strBlackCarList.Empty();
break;
case MONTHCAR_INDEX:
nMaxLength=16;
strMonthCarList.Empty();
break;
case FREECAR_INDEX:
nMaxLength=16;
strFreeCarList.Empty();
break;
case DELAYS_INDEX:
nMaxLength=2;
strDelayList.Empty();
break;
}
SaveData(ReceiveData+8,nMaxLength,FileIndex);
bReceiveFlag[FileIndex]=TRUE;
}
// 处理参数文件的中间帧
void CMessageNet::ContinueWriteFile(unsigned char *ReceiveData,int FileIndex)
{
int nMaxLength=0;
switch(FileIndex){
case TFRMB_NEW_INDEX:
nMaxLength=8;
break;
case COLLECOD_INDEX:
nMaxLength=12;
break;
case BLACKCOL_INDEX:
nMaxLength=5;
break;
case BLACKCAR_INDEX:
nMaxLength=10;
break;
case MONTHCAR_INDEX:
nMaxLength=16;
break;
case FREECAR_INDEX:
nMaxLength=16;
break;
case DELAYS_INDEX:
nMaxLength=2;
break;
}
SaveData(ReceiveData+8,nMaxLength,FileIndex);
}
// 处理参数文件的结束帧,若校验和正确,向上位机发确认信号并更新相应
// 的文件;否则,发接收文件错误信号并删除收到的错误数据
void CMessageNet::EndWriteFile(unsigned char *ReceiveData,int FileIndex)
{
char CheckSumStr[3],tmpStr[10],chStatus;
memset(tmpStr,0,10);
memmove(tmpStr,ReceiveData,8);
memset(CheckSumStr,0,3);
itoa(FileCheckSum,CheckSumStr,10); //本程序计算出的校验和
if(strlen(CheckSumStr)==1){
CheckSumStr[1]=CheckSumStr[0];
CheckSumStr[0]='0';
}
if((CheckSumStr[0]!=ReceiveData[8])||(CheckSumStr[1]!=ReceiveData[9])){
switch(FileIndex){
case TFRMB_NEW_INDEX:
strRMB.Empty();
break;
case COLLECOD_INDEX:
strCollectList.Empty();
break;
case BLACKCOL_INDEX:
strBlackList.Empty();
break;
case BLACKCAR_INDEX:
strBlackCarList.Empty();
break;
case MONTHCAR_INDEX:
strMonthCarList.Empty();
break;
case FREECAR_INDEX:
strFreeCarList.Empty();
break;
case DELAYS_INDEX:
strDelayList.Empty();
break;
}
chStatus='0'; //接收错误
} else {
chStatus='1'; //接收正确
if(FileIndex!=INVALID_INDEX){
UpdateFile(FileIndex);
} else {
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_REPEAT_SEND,0,(LPARAM)&FatchMesg);
}
}
// 若接收文件标志bReceiveFlag为真,生成AK消息;否则,本帧可能是由于
// 通信错误而收费站重新下发的E帧
if(!bReceiveFlag[FileIndex]) return;
if(FileIndex==TFRMB_NEW_INDEX)
FileIndex=TFRMB_INDEX;
CRecord m_clsRecord;
m_clsRecord.AkIndex(FileIndex);
m_clsRecord.AkStatus(chStatus);
m_clsRecord.RecordAK();
}
// 记录收到的数据帧
void CMessageNet::SaveData(unsigned char *ReceiveData, int MaxLen, int FileIndex)
{
int i;
char j,WriteBuff[20];
CString MemoryStr;
MemoryStr.Empty();
while(*ReceiveData!=0xfe){ //循环处理数据直到帧结束
i=0;
memset(WriteBuff,0,20);
while((*ReceiveData!=0x1e)&&(*ReceiveData!=0xfe)&&(i<MaxLen)){
WriteBuff[i]=*ReceiveData;
j=FileCheckSum;
FileCheckSum=(j+(*ReceiveData))%100;
i++;
ReceiveData=ReceiveData+1;;
}
if(*ReceiveData!=0xfe){ //处理间隔符(0x1e)
MemoryStr=MemoryStr+(char *)WriteBuff;
ReceiveData=ReceiveData+1;
}
}
switch(FileIndex){
case BLACKCOL_INDEX:
strBlackList+=MemoryStr;
break;
case FREECAR_INDEX:
strFreeCarList+=MemoryStr;
break;
case MONTHCAR_INDEX:
strMonthCarList+=MemoryStr;
break;
case BLACKCAR_INDEX:
strBlackCarList+=MemoryStr;
break;
case COLLECOD_INDEX:
strCollectList+=MemoryStr;
break;
case DELAYS_INDEX:
strDelayList+=MemoryStr;
break;
case TFRMB_NEW_INDEX:
strRMB+=MemoryStr;
break;
}
}
// 将接收到的文件写入硬盘。注意:接收到的价格文件应写为新价格文件,
// 因为可能该价格的生效日期尚未到达
void CMessageNet::UpdateFile(int FileIndex)
{
FILE *fp1;
char tmpStr[44];
int Position=0,DataLength;
int ReadLength;
CString MemoryStr;
try{
switch(FileIndex){
case TFRMB_NEW_INDEX:
if(strRMB.IsEmpty()){
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_UPDATE_OK,UPDATE_FILE,FileIndex);
return;
}
if((fp1=fopen(TFRMB_NEW,"w"))==NULL){
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"更新新价格文件失败\n");
return;
}
MemoryStr=strRMB;
memset(tmpStr,0,44);
if(MemoryStr.GetLength()<8) return;
memmove(tmpStr,MemoryStr.GetBuffer(8),8);//生效日期
fputs(tmpStr,fp1);
fputc('\n',fp1);
Position=8;
memset(tmpStr,0,44);
if(MemoryStr.GetLength()<Position+4) return;
memmove(tmpStr,MemoryStr.GetBuffer(Position+4)+Position,4);
fputs(tmpStr,fp1); //生效时间
fputc('\n',fp1);
Position=Position+4;
DataLength=MemoryStr.GetLength();
ReadLength=4; //每次读4个字符
while(1){
if(Position>=DataLength) break;
memset(tmpStr,0,44);
if(MemoryStr.GetLength()<Position+ReadLength) break;
memmove(tmpStr,MemoryStr.GetBuffer(Position+ReadLength)+Position,ReadLength);
fputs(tmpStr,fp1);
fputc('\n',fp1);
Position+=ReadLength;
}
fclose(fp1);
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_UPDATE_OK,UPDATE_FILE,FileIndex);
return;
case COLLECOD_INDEX:
if(strCollectList.IsEmpty()){
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_UPDATE_OK,UPDATE_FILE,FileIndex);
return;
}
if((fp1=fopen(COLLECOD_FILE,"w"))==NULL){
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"更新操作员文件失败\n");
return;
}
MemoryStr=strCollectList;
if(MemoryStr.GetLength()<12) return;
DataLength=MemoryStr.GetLength();
ReadLength=12; //每次读12个字符
while(1){
if(Position>=DataLength) break;
memset(tmpStr,0,44);
if(MemoryStr.GetLength()<Position+ReadLength) break;
memmove(tmpStr,MemoryStr.GetBuffer(Position+ReadLength)+Position,ReadLength);
fputs(tmpStr,fp1);
fputc('\n',fp1);
Position+=ReadLength;
}
fclose(fp1);
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_UPDATE_OK,UPDATE_FILE,FileIndex);
return;
case BLACKCOL_INDEX:
if(strBlackList.IsEmpty()){
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_UPDATE_OK,UPDATE_FILE,FileIndex);
return;
}
if((fp1=fopen(BLACKCOL_FILE,"w"))==NULL){
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"更新操作员黑名单文件失败\n");
return;
}
MemoryStr=strBlackList;
if(MemoryStr.GetLength()<5) return;
DataLength=MemoryStr.GetLength();
ReadLength=5; //每次读5个字符
while(1){
if(Position>=DataLength) break;
memset(tmpStr,0,44);
if(MemoryStr.GetLength()<Position+ReadLength) break;
memmove(tmpStr,MemoryStr.GetBuffer(Position+ReadLength)+Position,ReadLength);
fputs(tmpStr,fp1);
fputc('\n',fp1);
Position+=ReadLength;
}
fclose(fp1);
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_UPDATE_OK,UPDATE_FILE,FileIndex);
return;
case DELAYS_INDEX:
if(strDelayList.IsEmpty()){
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_UPDATE_OK,UPDATE_FILE,FileIndex);
return;
}
if((fp1=fopen(DELAYS_FILE,"w"))==NULL){
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"更新延时表文件失败\n");
return;
}
MemoryStr=strDelayList;
if(MemoryStr.GetLength()<6) return;
DataLength=MemoryStr.GetLength();
ReadLength=2; //每次读2个字符
while(1){
if(Position>=DataLength) break;
memset(tmpStr,0,44);
if(MemoryStr.GetLength()<Position+ReadLength) break;
memmove(tmpStr,MemoryStr.GetBuffer(Position+ReadLength)+Position,ReadLength);
fputs(tmpStr,fp1);
fputc('\n',fp1);
Position+=ReadLength;
}
fclose(fp1);
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_UPDATE_OK,UPDATE_FILE,FileIndex);
return;
case BLACKCAR_INDEX:
if(strBlackCarList.IsEmpty()){
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_UPDATE_OK,UPDATE_FILE,FileIndex);
return;
}
if((fp1=fopen(BLACKCAR_FILE,"w"))==NULL){
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"更新黑名单车文件失败\n");
return;
}
MemoryStr=strBlackCarList;
if(MemoryStr.GetLength()<10) return;
DataLength=MemoryStr.GetLength();
ReadLength=10; //每次读10个字符
while(1){
if(Position>=DataLength) break;
memset(tmpStr,0,44);
if(MemoryStr.GetLength()<Position+ReadLength) break;
memmove(tmpStr,MemoryStr.GetBuffer(Position+ReadLength)+Position,ReadLength);
fputs(tmpStr,fp1);
fputc('\n',fp1);
Position+=ReadLength;
}
fclose(fp1);
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_UPDATE_OK,UPDATE_FILE,FileIndex);
return;
case MONTHCAR_INDEX:
if(strMonthCarList.IsEmpty()){
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_UPDATE_OK,UPDATE_FILE,FileIndex);
return;
}
if((fp1=fopen(MONTHCAR_FILE,"w"))==NULL){
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"更新月票车文件失败\n");
return;
}
MemoryStr=strMonthCarList;
if(MemoryStr.GetLength()<16) return;
DataLength=MemoryStr.GetLength();
ReadLength=16; //每次读16个字符
while(1){
if(Position>=DataLength) break;
memset(tmpStr,0,44);
if(MemoryStr.GetLength()<Position+ReadLength) break;
memmove(tmpStr,MemoryStr.GetBuffer(Position+ReadLength)+Position,ReadLength);
fputs(tmpStr,fp1);
fputc('\n',fp1);
Position+=ReadLength;
}
fclose(fp1);
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_UPDATE_OK,UPDATE_FILE,FileIndex);
return;
case FREECAR_INDEX:
if(strFreeCarList.IsEmpty()){
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_UPDATE_OK,UPDATE_FILE,FileIndex);
return;
}
if((fp1=fopen(FREECAR_FILE,"w"))==NULL){
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"更新免征车文件失败\n");
return;
}
MemoryStr=strFreeCarList;
if(MemoryStr.GetLength()<16) return;
DataLength=MemoryStr.GetLength();
ReadLength=16; //每次读16个字符
while(1){
if(Position>=DataLength) break;
memset(tmpStr,0,44);
if(MemoryStr.GetLength()<Position+ReadLength) break;
memmove(tmpStr,MemoryStr.GetBuffer(Position+ReadLength)+Position,ReadLength);
fputs(tmpStr,fp1);
fputc('\n',fp1);
Position+=ReadLength;
}
fclose(fp1);
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_UPDATE_OK,UPDATE_FILE,FileIndex);
return;
default:
return;
}
}
catch(...){
SendMessage(theApp.m_pMainWnd->m_hWnd,WM_ABNORMAL,0,(LPARAM)"CMessageNet::UpdateFile()出现异常\n");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -