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

📄 mp2kdlg.cpp

📁 这是我用VC写的一个串口通信的程序,希望大学喜欢啊!
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			DestData[PackagerCount ++] = 0xfd;
			DestData[PackagerCount ++] = 0x02;
			DataToCheck += 2;
			break;
		default:
			DestData[PackagerCount ++] = SourceData[i];
			DataToCheck ++;
			break;
		}
	}
	pCheckedData = DestData + 1;
	CRC_Check = crc16_check(pCheckedData,(BYTE)DataToCheck);
	switch((BYTE)CRC_Check)
	{
	case 0xff:
		DestData[PackagerCount ++] = 0xfd;
		DestData[PackagerCount ++] = 0x00;
		break;
	case 0xfe:
		DestData[PackagerCount ++] = 0xfd;
		DestData[PackagerCount ++] = 0x01;
		break;
	case 0xfd:
		DestData[PackagerCount ++] = 0xfd;
		DestData[PackagerCount ++] = 0x02;
		break;
	default:
		DestData[PackagerCount ++] = (BYTE)CRC_Check;
		break;
	}
	CRC_Check >>= 8;
	switch((BYTE)CRC_Check)
	{
	case 0xff:
		DestData[PackagerCount ++] = 0xfd;
		DestData[PackagerCount ++] = 0x00;
		break;
	case 0xfe:
		DestData[PackagerCount ++] = 0xfd;
		DestData[PackagerCount ++] = 0x01;
		break;
	case 0xfd:
		DestData[PackagerCount ++] = 0xfd;
		DestData[PackagerCount ++] = 0x02;
		break;
	default:
		DestData[PackagerCount ++] = (BYTE)CRC_Check;
		break;
	}
	DestData[PackagerCount ++] = 0xfe;
	*PackagedDataLen = PackagerCount;
	return true;
}

bool CMp2KDlg::Unpackager(BYTE SourceData[1024],BYTE DestData[250],
				long DataToUnpackage,long *UnpackagedDataLen)
{
	long DataToCheck,DestDataCounter = 0;
	BYTE *pCheckedData,LowCRC,HiCRC,*pLowCRC;
	DataToCheck = DataToUnpackage - 4;

	HiCRC = SourceData[DataToUnpackage - 2];
	if((HiCRC == 0x00 || HiCRC == 0x01 || HiCRC == 0x02) &&
	   (SourceData[DataToUnpackage - 3] == 0xfd))
	{
		DataToCheck --;
		LowCRC = SourceData[DataToUnpackage - 4];
		pLowCRC = SourceData + DataToUnpackage - 4;
		switch(HiCRC)
		{
		case 0x00:
			HiCRC = 0xff;
			break;
		case 0x01:
			HiCRC = 0xfe;
			break;
		case 0x02:
			HiCRC = 0xfd;
			break;
		}
	}
	else
	{
		LowCRC = SourceData[DataToUnpackage - 3];
		pLowCRC = SourceData + DataToUnpackage - 3;
	}
	if((LowCRC == 0x00 || LowCRC == 0x01 || LowCRC == 0x02) &&
	   ((*pLowCRC) == 0xfd))
	{
		DataToCheck --;
		switch(LowCRC)
		{
		case 0x00:
			LowCRC = 0xff;
			break;
		case 0x01:
			LowCRC = 0xfe;
			break;
		case 0x02:
			LowCRC = 0xfd;
			break;
		}
	}

	pCheckedData = SourceData + 1;
	CRC_Check = crc16_check(pCheckedData,(BYTE)DataToCheck);
	if(LowCRC != (BYTE)CRC_Check)
		return false;
	if(HiCRC != (BYTE)(CRC_Check >> 8))
		return false;

	for(int i = 1;i <= DataToCheck;i ++)
	{
		if(SourceData[i] == 0xfd)
		{
			switch(SourceData[++ i])
			{
			case 0x00:
				DestData[DestDataCounter ++] = 0xff;
				break;
			case 0x01:
				DestData[DestDataCounter ++] = 0xfe;
				break;
			case 0x02:
				DestData[DestDataCounter ++] = 0xfd;
				break;
			}
		}
		else
			DestData[DestDataCounter ++] = SourceData[i];
	}
	*UnpackagedDataLen = DestDataCounter;
	return true;
}


WORD CMp2KDlg::crc16_check(BYTE *data_in,BYTE length)
{
	BYTE i;
	WORD reg_crc = 0xffff;
	while(length --)
	{
		reg_crc ^= *data_in++;
		for(i = 0;i < 8;i ++)
		{
			if(reg_crc & 0x01)
				reg_crc = (reg_crc >> 1) ^ 0xA001;
			else
				reg_crc = reg_crc >> 1;
		}
	}
	return reg_crc;
}

void CMp2KDlg::TransferData(BYTE *TransferedData,long *DataToTransfer)
{
	Unpackaged_Data.PackagedDataLen = 0;
	CByteArray SentArray;
	SentArray.RemoveAll();
	SentArray.SetSize(*DataToTransfer);
	for(int i = 0;i < (*DataToTransfer);i ++)
		SentArray.SetAt(i,TransferedData[i]);
	if(pCurSedMode->Operation_Mode == GETVERSION)
		SerialCom.SetRThreshold(10);
	else
		SerialCom.SetRThreshold((short)(*DataToTransfer));
	SerialCom.SetOutput(COleVariant(SentArray));
	*DataToTransfer = 0;
	if(PreviousOperation == SETBAUD)
	{
		SerialCom.SetInBufferCount(0);
		PreviousOperation = NOOPERATE;
	}
}

void CMp2KDlg::GetInputData(BYTE *ReceivedData,long *RDataLen)
{
	input = SerialCom.GetInput();
	SafeArray = input;
	len = SafeArray.GetOneDimSize();
	for(long i = 0;i < len;i ++)
	{
		SafeArray.GetElement(& i,ReceivedData + (*RDataLen));
		(*RDataLen) ++;
	}
}

void CMp2KDlg::MCom()
{
	pCurSedNode->SentData[0] = 0x01;
	pCurSedNode->SentData[1] = 0x00;	// 串口地址
	pCurSedNode->SentData[2] = 0x00;	// 功能代码
	for(int i = 3;i < 240;i ++)
		pCurSedNode->SentData[i] = 0x01;
	pCurSedNode->DataToWrited = 240;
	Packager(pCurSedNode->SentData,Packaged_Data.PackagedData,pCurSedNode->DataToWrited,
		&Packaged_Data.PackagedDataLen);
	TransferData(Packaged_Data.PackagedData,&Packaged_Data.PackagedDataLen);
	pCurSedNode = pCurSedNode->next;
}

void CMp2KDlg::SCom1()
{
	pCurSedNode->SentData[0] = 0x01;
	pCurSedNode->SentData[1] = 0x01;	// 串口地址
	pCurSedNode->SentData[2] = 0x00;	// 功能代码
	for(int i = 3;i < 240;i ++)
		pCurSedNode->SentData[i] = 0x01;
	pCurSedNode->DataToWrited = 240;
	Packager(pCurSedNode->SentData,Packaged_Data.PackagedData,pCurSedNode->DataToWrited,
		&Packaged_Data.PackagedDataLen);
	TransferData(Packaged_Data.PackagedData,&Packaged_Data.PackagedDataLen);
	pCurSedNode = pCurSedNode->next;
}

void CMp2KDlg::SCom2()
{
	pCurSedNode->SentData[0] = 0x01;
	pCurSedNode->SentData[1] = 0x02;	// 串口地址
	pCurSedNode->SentData[2] = 0x00;	// 功能代码
	for(int i = 3;i < 240;i ++)
		pCurSedNode->SentData[i] = 0x01;
	pCurSedNode->DataToWrited = 240;
	Packager(pCurSedNode->SentData,Packaged_Data.PackagedData,pCurSedNode->DataToWrited,
		&Packaged_Data.PackagedDataLen);
	TransferData(Packaged_Data.PackagedData,&Packaged_Data.PackagedDataLen);
	pCurSedNode = pCurSedNode->next;
}

void CMp2KDlg::SCom3()
{
	pCurSedNode->SentData[0] = 0x01;
	pCurSedNode->SentData[1] = 0x03;	// 串口地址
	pCurSedNode->SentData[2] = 0x00;	// 功能代码
	for(int i = 3;i < 240;i ++)
		pCurSedNode->SentData[i] = 0x01;
	pCurSedNode->DataToWrited = 240;
	Packager(pCurSedNode->SentData,Packaged_Data.PackagedData,pCurSedNode->DataToWrited,
		&Packaged_Data.PackagedDataLen);
	TransferData(Packaged_Data.PackagedData,&Packaged_Data.PackagedDataLen);
	pCurSedNode = pCurSedNode->next;
}

void CMp2KDlg::SCom4()
{
	pCurSedNode->SentData[0] = 0x01;
	pCurSedNode->SentData[1] = 0x04;	// 串口地址
	pCurSedNode->SentData[2] = 0x00;	// 功能代码
	for(int i = 3;i < 240;i ++)
		pCurSedNode->SentData[i] = 0x01;
	pCurSedNode->DataToWrited = 240;
	Packager(pCurSedNode->SentData,Packaged_Data.PackagedData,pCurSedNode->DataToWrited,
		&Packaged_Data.PackagedDataLen);
	TransferData(Packaged_Data.PackagedData,&Packaged_Data.PackagedDataLen);
	pCurSedNode = pCurSedNode->next;
}

void CMp2KDlg::OnMcom() 
{
	MComLoop = !MComLoop;
	if(MComLoop)
	{
		KillTimer(ID_SCom1Timer);
		KillTimer(ID_SCom2Timer);
		KillTimer(ID_SCom3Timer);
		KillTimer(ID_SCom4Timer);
		SCom1Loop = false;
		SCom2Loop = false;
		SCom3Loop = false;
		SCom4Loop = false;
		SetTimer(ID_MComTimer,SEPTESTDELAY,NULL);
	}
	else
		KillTimer(ID_MComTimer);
}

void CMp2KDlg::OnScom1() 
{
	SCom1Loop = !SCom1Loop;
	if(SCom1Loop)
	{
		KillTimer(ID_MComTimer);
		KillTimer(ID_SCom2Timer);
		KillTimer(ID_SCom3Timer);
		KillTimer(ID_SCom4Timer);
		MComLoop = false;
		SCom2Loop = false;
		SCom3Loop = false;
		SCom4Loop = false;
		SetTimer(ID_SCom1Timer,SEPTESTDELAY,NULL);
	}
	else
		KillTimer(ID_SCom1Timer);
}

void CMp2KDlg::OnScom2() 
{
	SCom2Loop = !SCom2Loop;
	if(SCom2Loop)
	{
		KillTimer(ID_MComTimer);
		KillTimer(ID_SCom1Timer);
		KillTimer(ID_SCom3Timer);
		KillTimer(ID_SCom4Timer);
		MComLoop = false;
		SCom1Loop = false;
		SCom3Loop = false;
		SCom4Loop = false;
		SetTimer(ID_SCom2Timer,SEPTESTDELAY,NULL);
	}
	else
		KillTimer(ID_SCom2Timer);
}

void CMp2KDlg::OnScom3() 
{
	SCom3Loop = !SCom3Loop;
	if(SCom3Loop)
	{
		KillTimer(ID_MComTimer);
		KillTimer(ID_SCom1Timer);
		KillTimer(ID_SCom2Timer);
		KillTimer(ID_SCom4Timer);
		MComLoop = false;
		SCom1Loop = false;
		SCom2Loop = false;
		SCom4Loop = false;
		SetTimer(ID_SCom3Timer,SEPTESTDELAY,NULL);
	}
	else
		KillTimer(ID_SCom3Timer);
}

void CMp2KDlg::OnScom4() 
{
	SCom4Loop = !SCom4Loop;
	if(SCom4Loop)
	{
		KillTimer(ID_MComTimer);
		KillTimer(ID_SCom1Timer);
		KillTimer(ID_SCom2Timer);
		KillTimer(ID_SCom3Timer);
		MComLoop = false;
		SCom1Loop = false;
		SCom2Loop = false;
		SCom3Loop = false;
		SetTimer(ID_SCom4Timer,SEPTESTDELAY,NULL);
	}
	else
		KillTimer(ID_SCom4Timer);
}

void CMp2KDlg::UpdateVersion()
{
	CString tempString;
	int VersionInt;
	if(Data.DataToRead != 6)
		return;
	VersionInt = Data.ReceivedData[4];
	VersionInt <<= 8;
	VersionInt += Data.ReceivedData[5];
	tempString.Format("%d",VersionInt);
	if(m_VersionString.GetLength() == m_VersionString.ReverseFind(':') + 1)
		m_VersionString += (" V" + tempString);
	else
		m_VersionString.Replace(m_VersionString.Mid(
			m_VersionString.ReverseFind('V') + 1),tempString);
	UpdateData(false);
}

void CMp2KDlg::OnOnCommMscomm1() 
{//0
	int i;
	CString temp,temp1;
	int ii;
	switch(SerialCom.GetCommEvent())
	{//1
	case 1:
		// 在发送缓冲区中的字符比SThresHold少
		break;
	case 2:
		// 收到RThresHold个字符
		GetInputData(Unpackaged_Data.PackagedData,&Unpackaged_Data.PackagedDataLen);
		if(Unpackaged_Data.PackagedData[Unpackaged_Data.PackagedDataLen - 1] == 0xfe)
		{//2
			Unpackager(Unpackaged_Data.PackagedData,Data.ReceivedData,
				Unpackaged_Data.PackagedDataLen,&Data.DataToRead);
			Unpackaged_Data.PackagedDataLen = 0;
			if(Data.DataToRead != pCurCheckedNode->DataToWrited)
			{//3
				switch(pCurCheckedMode->Operation_Mode)
				{
				case MCOM:
					m_MComFail ++;
					UpdateData(false);
					break;
				case SCOM1:
					m_SCom1Fail ++;
					UpdateData(false);
					break;
				case SCOM2:
					m_SCom2Fail ++;
					UpdateData(false);
					break;
				case SCOM3:
					m_SCom3Fail ++;
					UpdateData(false);
					break;
				case SCOM4:
					m_SCom4Fail ++;
					UpdateData(false);
					break;
				case LOOPMCOM:
					m_MComLoopFail ++;
					UpdateData(false);
					break;
				case LOOPSCOM1:
					m_SCom1LoopFail ++;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -