⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcomm.cpp

📁 电压监测后台管理程序,数据是通过GPRS传到因特网的
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -