📄 mcomm.cpp
字号:
int i,j;
i = RcvPoint[route];
if ((i%2)!=0) return false;
RcvMergePoint[route] = i/2;
for (j =0;j<i;j+=2)
{
RcvMergebuff[route][j/2] = ((Rcvbuff[route][j]-'0')<<4)+(Rcvbuff[route][j+1]-'0');
}
return true;
}
int mComm::JudgeOkError(int route)
{
int i = 0,cnt = 0;
// if (!MergeBuff(route)) return 0;
if (RcvPoint[route]>=2)
{
while ((i<(RcvPoint[route]-1)) && ((Rcvbuff[route][i]!='O') || (Rcvbuff[route][i+1]!='K')))
i++;
if (i<RcvPoint[route]-1) return 1;
}
if (RcvPoint[route]>=3)
{
while (i<(RcvPoint[route]-2))
if (Rcvbuff[route][i]!='E') i++;
else if ((Rcvbuff[route][i+1]=='R')&&(Rcvbuff[route][i+2]=='R')) return -1;
else i++;
}
return 0;
}
int mComm::JudgeDataPackage(int route)
{
int i = 0,cnt = 0;
char id[5];
while ((i<RcvPoint[route]-1) && ((Rcvbuff[route][i]!=0x3a)||(Rcvbuff[route][i+1]!=0x3a)))
i++;
if (i != 0)
{
cnt = 0;
while (i<RcvPoint[route])
{
Rcvbuff[route][cnt] = Rcvbuff[route][i];
i++;
cnt++;
}
Rcvbuff[route][cnt] = 0;
RcvPoint[route] = cnt;
}
if (!MergeBuff(route)) return 0;
if (RcvMergePoint[route] >= 9)
if(RcvMergePoint[route]>=RcvMergebuff[route][5]+9)
{
id[0] = ((RcvMergebuff[route][1]>>4)&0x0f) + '0';
id[1] = ((RcvMergebuff[route][1])&0x0f) + '0';
id[2] = ((RcvMergebuff[route][2]>>4)&0x0f) + '0';
id[3] = ((RcvMergebuff[route][2])&0x0f) + '0';
id[4] = 0;
if (strcmp(id,theCommApp->GetSocketTel(route))!=0)
return -1;
switch(RcvMergebuff[route][3])
{
case 1:
case 2:
case 3:
case 4:
case 5:
i = 24;
break;
case 6:
i = 8;
break;
case 7:
i = 2;
break;
case 0x0d:
i = 6;
break;
case 0x0e:
i = 31;
break;
case 0x2f:
i = 54;
break;
default:
i = 500;
break;
}
if (i!=RcvMergebuff[route][5]) return -1;
if(!Crc_Check(route)) return -1;
return 1;
}
return 0;
}
bool mComm::Crc_Check(int route)
{
MYBIT *nbit,*mbit;
int i,j,k;
unsigned char l,m,n;
bool nbool,mbool;
m=n=0;
i = RcvMergebuff[route][5]+6;
for(j = 0;j<i;j++)
{
l = RcvMergebuff[route][j];
m = m ^ l;
for (k=0;k<8;k++)
{
nbit = (MYBIT *)&n;
mbit = (MYBIT *)&m;
if (nbit->b7) nbool=true;
else nbool=false;
if (mbit->b7) mbool=true;
else mbool=false;
n = n << 1;
m = m << 1;
if (nbool) m|=1;
if (mbool)
{
m ^= 0xa0;
n ^= 1;
}
}
}
if (m != RcvMergebuff[route][i]) return false;
if (n != RcvMergebuff[route][i+1]) return false;
if (RcvMergebuff[route][i+2] != 0xcc) return false;
return true;
}
void mComm::Crc_Generate(int route)
{
MYBIT *nbit,*mbit;
int i,j,k;
unsigned char l,m,n;
bool nbool,mbool;
m=n=0;
i = Sendbuff[route][5]+6;
for(j = 0;j<i;j++)
{
l = Sendbuff[route][j];
m = m ^ l;
for (k=0;k<8;k++)
{
nbit = (MYBIT *)&n;
mbit = (MYBIT *)&m;
if (nbit->b7) nbool=true;
else nbool=false;
if (mbit->b7) mbool=true;
else mbool=false;
n = n << 1;
m = m << 1;
if (nbool) m|=1;
if (mbool)
{
m ^= 0xa0;
n ^= 1;
}
}
}
Sendbuff[route][i] = m;
Sendbuff[route][i+1] = n;
Sendbuff[route][i+2] = 0xcc;
SendLength[route] = i+3;
}
bool mComm::JudgeRequest(int route)
{
int i = 0,cnt = 0;
while (i<RcvPoint[route])
{
if (Rcvbuff[route][i]==0xaa) cnt++;
else cnt = 0;
i++;
if (cnt>=4)
{
RcvPoint[route] = 0;
return true;
}
}
if (cnt<4)
{
i -= cnt; //减去不足4个的0XAA的个数
cnt = 0;
while (i<RcvPoint[route])
{
Rcvbuff[route][cnt] = Rcvbuff[route][i];
i++;
cnt++;
}
Rcvbuff[route][cnt] = 0;
RcvPoint[route] = cnt;
}
return false;
}
void mComm::mCloseSocket(int route)
{
char telnum[12];
char* cp;
UCHAR* ScreenMessage;
CanRcvFlag[route] = false;
CanSendFlag[route] = false;
shutdown(theCommApp->GetSocket(route),2);
closesocket(theCommApp->GetSocket(route));
theCommApp->SetSocket(route,NULL);
cp = theCommApp->GetSocketTel(route);
ScreenMessage = new UCHAR[12];
strcpy((char*)ScreenMessage,cp);
::PostMessage(theCommApp->formWnd,DELETELISTID,WPARAM(0),LPARAM(ScreenMessage));
strcpy(telnum,"");
theCommApp->SetSocketTel(route,telnum);
theCommApp->DecreaseConnectedNum();
::PostMessage(theCommApp->frameWnd,DSPLAYSTATUSBAR,WPARAM(3),LPARAM(theCommApp->GetConnectedNum()));
}
#ifdef _DEBUG
void mComm::CatchRcvErr(int errcode)
{
switch (errcode)
{
case WSAENETDOWN:
errcode -= 1;
break;
case WSAEFAULT:
errcode -= 1;
break;
case WSAENOTCONN:
errcode -= 1;
break;
case WSAEINTR:
errcode -= 1;
break;
case WSAEINPROGRESS:
errcode -= 1;
break;
case WSAENETRESET:
errcode -= 1;
break;
case WSAENOTSOCK:
errcode -= 1;
break;
case WSAEOPNOTSUPP:
errcode -= 1;
break;
case WSAESHUTDOWN:
errcode -= 1;
break;
case WSAEWOULDBLOCK:
errcode -= 1;
break;
case WSAEMSGSIZE:
errcode -= 1;
break;
case WSAEINVAL:
errcode -= 1;
break;
case WSAECONNABORTED:
errcode -= 1;
break;
case WSAETIMEDOUT:
errcode -= 1;
break;
case WSAECONNRESET:
errcode -= 1;
break;
default:
break;
}
errcode += 1;
}
#endif
void mComm::mProcCmd()
{
MSG msg;
DWORD order,route;
// unsigned char md;
if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
if(msg.hwnd != 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
return;
}
switch(msg.message)
{
case UPLOADDATA:
route = msg.lParam;
order = msg.wParam;
MainState[route] = SENDREQUEST;
OrderBuff[route] = (unsigned char)order&0xff;
MDBuff[route] = (unsigned char)(order>>16)&0xff;
break;
default:
break;
}
}
}
bool mComm::AssembleOrder(int route)
{
char* id;
SYSTEMTIME loctime;
unsigned char time,tc;
int i;
Sendbuff[route][0] = 0xaa;
id = theCommApp->GetSocketTel(route);
Sendbuff[route][1] = ((id[0]-'0')<<4)+(id[1]-'0');
Sendbuff[route][2] = ((id[2]-'0')<<4)+(id[3]-'0');
Sendbuff[route][3] = OrderBuff[route];
Sendbuff[route][4] = MDBuff[route];
switch(OrderBuff[route])
{
case 3:
case 4:
case 5:
case 6:
case 7:
case 0x0d:
case 0x0e:
case 0x0f:
Sendbuff[route][5] = 0;
break;
case 0x23:
Sendbuff[route][5] = 24;
Sendbuff[route][6] = 0x55;
if (!theCommApp->DbPtr->ReadMonthData(&Sendbuff[route][7],id,MDBuff[route]))
return false;
time = 0;
tc = 0;
for (i=6;i<28;i++)
{
tc ^= Sendbuff[route][i];
time += Sendbuff[route][i];
}
Sendbuff[route][28] = tc;
Sendbuff[route][29] = time;
break;
case 0x24:
case 0x25:
Sendbuff[route][5] = 24;
Sendbuff[route][6] = 0x55;
GetLocalTime(&loctime);
time = (unsigned char)(loctime.wMonth);
if (OrderBuff[route] == 0x25)
{
if (time == 1) time = 12; //上月
else time -= 1;
}
if (!theCommApp->DbPtr->ReadDayData(&Sendbuff[route][7],id,time,MDBuff[route]))
return false;
time = 0;
tc = 0;
for (i=6;i<28;i++)
{
tc ^= Sendbuff[route][i];
time += Sendbuff[route][i];
}
Sendbuff[route][28] = tc;
Sendbuff[route][29] = time;
break;
case 0x2d: //下载时钟
Sendbuff[route][5] = 6;
GetLocalTime(&loctime);
time = (loctime.wYear%100);
Sendbuff[route][6] = ((time/10)<<4)+(time%10);
Sendbuff[route][7] = ((loctime.wMonth/10)<<4)+(loctime.wMonth%10);
Sendbuff[route][8] = ((loctime.wDay/10)<<4)+(loctime.wDay%10);
Sendbuff[route][9] = ((loctime.wHour/10)<<4)+(loctime.wHour%10);
Sendbuff[route][10] = ((loctime.wMinute/10)<<4)+(loctime.wMinute%10);
Sendbuff[route][11] = ((loctime.wSecond/10)<<4)+(loctime.wSecond%10);
break;
case 0x2e: //下载仪器参数
Sendbuff[route][5] = 31;
if (!theCommApp->DbPtr->ReadMeterParameter(&Sendbuff[route][6]))
return false;
Sendbuff[route][16] = Sendbuff[route][1]; //表号
Sendbuff[route][17] = Sendbuff[route][2];
time = 0;
tc = 0;
for (i=6;i<35;i++)
{
tc ^= Sendbuff[route][i];
time += Sendbuff[route][i];
}
Sendbuff[route][35] = tc;
Sendbuff[route][36] = time;
/* for (i=0;i<29;i++)
Sendbuff[route][6+i] = 0;
Sendbuff[route][9] = 0x10;
Sendbuff[route][10] = 0x11;
Sendbuff[route][12] = 0x09;
Sendbuff[route][14] = 0x10;
Sendbuff[route][17] = 0x01;
Sendbuff[route][18] = 0x13;
Sendbuff[route][19] = 0x88;
Sendbuff[route][20] = 0xC0;
Sendbuff[route][23] = 0x01;
Sendbuff[route][28] = 0x01;
Sendbuff[route][29] = 0x23;
Sendbuff[route][30] = 0x01;
Sendbuff[route][31] = 0x10;
tc = 0;
time = 0;
for (i=0;i<29;i++)
{
tc += Sendbuff[route][6+i];
time ^= Sendbuff[route][6+i];
}
Sendbuff[route][35] = time;
Sendbuff[route][36] = tc;*/
break;
default:
Sendbuff[route][4] = 3;
Sendbuff[route][5] = 0;
//AfxMessageBox("严重错误!");
break;
}
Crc_Generate(route);
return true;
}
int mComm::GetSocketCommState(int route)
{
return MainState[route];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -