欢迎来到虫虫下载站 | 资源下载 资源专辑 关于我们
虫虫下载站

commwizarddlg.cpp

实现网络+串口 红外接收、发送
CPP
第 1 页 / 共 5 页
字号:

			LTemp =  byTemp[22];
			LTemp = LTemp<<8;
			LTemp = LTemp + byTemp[23];
			sts.Format("%d",LTemp);
			m_edAlarmBDown.SetSel(0,-1);
			m_edAlarmBDown.Clear();
			m_edAlarmBDown.ReplaceSel(sts);

		}
		nRec = 0;
		KillTimer(5);
	}
	//CDialog::OnTimer(nIDEvent);
}


int CCommWizardDlg::String2Hex(CString str, CByteArray &senddata)
{
	int hexdata,lowhexdata;
	int hexdatalen=0;
	int len=str.GetLength();
	
	senddata.SetSize(len/2);
	
	for(int i=0;i<len;)
	{
		char lstr,hstr=str[i];
		if(hstr==' ')
		{
			i++;
			continue;
		}
		i++;
		if(i>=len)
			break;
		lstr=str[i];
		hexdata=ConvertHexChar(hstr);
		lowhexdata=ConvertHexChar(lstr);
		if((hexdata==16)||(lowhexdata==16))
			break;
		else 
			hexdata=hexdata*16+lowhexdata;
		i++;
		senddata[hexdatalen]=(char)hexdata;
		hexdatalen++;
	}

	senddata.SetSize(hexdatalen);
	return hexdatalen;
}
int CCommWizardDlg::String2HexA(CString str, char *senddata)
{
	int hexdata,lowhexdata;
	int hexdatalen=0;
	int len=str.GetLength();
	
//	senddata.SetSize(len/2);
	
	for(int i=0;i<len;)
	{
		char lstr,hstr=str[i];
		if(hstr==' ')
		{
			i++;
			continue;
		}
		i++;
		if(i>=len)
			break;
		lstr=str[i];
		hexdata=ConvertHexChar(hstr);
		lowhexdata=ConvertHexChar(lstr);
		if((hexdata==16)||(lowhexdata==16))
			break;
		else 
			hexdata=hexdata*16+lowhexdata;
		i++;
		senddata[hexdatalen]=(char)hexdata;
		hexdatalen++;
	}

//	senddata.SetSize(hexdatalen);
	return hexdatalen;
}

//这是一个将字符转换为相应的十六进制值的函数
//功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1
char CCommWizardDlg::ConvertHexChar(char ch) 
{
	if((ch>='0')&&(ch<='9'))
		return ch-0x30;
	else if((ch>='A')&&(ch<='F'))
		return ch-'A'+10;
	else if((ch>='a')&&(ch<='f'))
		return ch-'a'+10;
	else return (-1);
}
//红外数据上传
void CCommWizardDlg::OnDataup() 
{
	CString strcmd,str,stAA,st,strUp;
	int nTemp,nx,ny,num;
	unsigned char CRCH,CRCL;
	unsigned int  CRC;
	unsigned int unTemp;
		
	nRec = 0;	
	//清零网络命令
	for(int i =0;i<150;i++)
	{
		SendSerData[i] = 0;
	}
	if(count == 0)
	{
		if(nChNum ==0)
		{
			if(AfxMessageBox("提示:上传数据将覆盖原有数据,要覆盖吗?", MB_YESNO) == IDNO)
				return;
		}
		if(!m_bSerialSet)
			SetTimer(2,500,NULL);
		else
    		SetTimer(2,200,NULL);
	}
	switch(m_nChannelNum)
	{
	case 0:
		nx = 1;
		ny = 1;
		break;
	case 1:
		nx = 2;
		ny = 2;
		break;
	case 2:
		nx = 4;
		ny = 3;
		break;
	case 3:
		nx = 8;
		ny = 4;
		break;
	default:
		break;
	}


	if(bReceived)
	{
		if( (nChNum >= 1) && ( nChNum <=5) )
		{
			if(m_bSerialSet)//网络传输时
			{
				if(!m_bTreadRWok)//等待线程读写完成
					return;
			}

			if(count<26)
			{
				stAA.Format("AA(%02x-%d)",count,nChNum);
			}
			else
			{
				nTemp = count - 25;
				stAA.Format("AA(%xC-%d)",nTemp,nChNum);
			}
			//sIrda
			st.Format("NEW_CHANNEL%d_IRDA",ny);
			::WritePrivateProfileString(st,stAA, sRecIrda,	".\\irda.ini");
			sRecIrda = _T("");
		}

		if(count<=39)
		{
			nChNum++;

			if(nChNum >= 1 && nChNum <=5)
			{
				if(count<26)
				{
					stAA.Format("AA(%02x-%d)",count,nChNum);
					num=count;
				}
				else
				{
					nTemp = count - 25;
					stAA.Format("AA(%xC-%d)",nTemp,nChNum);

					unTemp = (unsigned int )(count - 25);
					unTemp = unTemp<<4;
					unTemp = unTemp + 0xc;
					num=unTemp;
				}
			}

			if( (nChNum >= 1) && (nChNum<=5) )
			{
				SendBuffer[0] = 0x7e;
				SendBuffer[1] = 0x7e;
				SendBuffer[2] = atoi(m_sAirModelAddr);//0x01;
				SendBuffer[3] = 0x00;
				nx = nx<<4;
				nx+=nChNum;
				SendBuffer[4] = nx;//通道号 + 数据段号
				SendBuffer[5] = 0x02;//字节数
				SendBuffer[6] = 0x11;//上传命令
				SendBuffer[7] = num; //数据号
				CRC = SendBuffer[2] + SendBuffer[3] + SendBuffer[4] + SendBuffer[5] + SendBuffer[6] + SendBuffer[7];
				CRCL=CRC&0x00ff;
				CRCH =(CRC>>8);
				SendBuffer[8] = CRCH;
				SendBuffer[9] = CRCL;
				SendBuffer[10]= 0x7e;
				SendBuffer[11]= 0x7e;


				strUp = _T("");
				for(int i=0;i<12;i++)
				{
					str.Format("%02x ",SendBuffer[i]);
					strUp=strUp+str;

						SendSerData[i+1] = SendBuffer[i];    //格式化网络数据命令  2008.06.23 ZQL
						SendSerData[0] ++;
				}
				if(!m_bSerialSet)
					SendCmd(strUp);//发送命令
				else
				{

					m_bSerSendFlag = 1;//置位发送命令,开始发送
					//AfxMessageBox(strUp);	
					AfxBeginThread(Serial_WriteThead,&SocketPr);//	
				}
			
			}
			if(nChNum >=6)
			{
				nChNum = 0;
				count ++;
			}
		}
		else
			count++;
	}

	if(count >= 41)
	{
		count = 0;
		bReceived = true;
		nChNum =0;
		m_ctPsupdown.SetPos(0);    //进度指示
		KillTimer(2);
		return;
	}	

	m_ctPsupdown.SetRange(0,40);
	m_ctPsupdown.SetPos(count);    //进度指示

}
//红外数据下载
void CCommWizardDlg::OnDatadown() 
{
	CString strcmd,stAA,str,strDown,strTp,st,stx;
	unsigned int CRC  = 0;
	unsigned int nCRC=0;
	unsigned char CRCL = 0;
	unsigned char CRCH = 0;
	char hexdata[512];
	unsigned char relen;
	unsigned char tm;
	int n,i,j,k=0;
	int nTemp,nx,ny;


#if 1  //zql Debug
	for(i=0;i<512;i++)
		hexdata[i] = 0x00;
	for(i=0;i<150;i++)
		SendSerData[i] = 0x00;    //清空网络数据命令  2008.06.23 ZQL
					/*
							CString ss;
							ss.Format("%d",byTemp[7]);
							AfxMessageBox(ss);
					*/

	if(m_bBULK)
	{
		if(m_bSerialSet)//网络传输时
		{
			if(!m_bTreadRWok)//等待线程读写完成
				return;
		}
	}
	else
	{
		for(i=0;i<512;i++)
		{
			byTemp[i] = 0x00;//本通道第一次运行清零
		}
	}
	//上次失败,本次五段数据均需重传
	if(((byTemp[7] == 0xAA) ||(byTemp[7] == 0xff)) && m_bBULK)//0xff 失败; 0xAA 无返回值
	{
		if(nSendChNum==0)
		{
		    count_d--;			
		}
		nSendChNum = 0;//数据号
	}
	else
	{
		
		if(count_d >= 40)
		{				
			count_d = 0;
			nSendChNum = 0;
			m_bBULK = 0;//校验数据结束
			m_uAutoD++;//自动下载红外通道号
			m_ctPsupdown.SetPos(0);    //进度指示

			if(m_bAutoDown && (m_uAutoD < 4))
			{
				m_ctrlChannelSel.SetCurSel(m_uAutoD);
				m_nChannelNum = m_ctrlChannelSel.GetCurSel();//通道号
			}
			if(m_bAutoDown && m_uAutoD >=4)
			{
				KillTimer(3);
				m_uAutoD =0;
				AfxMessageBox("四个通道的红外数据下载完毕!");
				m_ctrlChannelSel.SetCurSel(0);
				m_nChannelNum = m_ctrlChannelSel.GetCurSel();//通道号
				return;
			}
			else if(!m_bAutoDown)
			{
				KillTimer(3);
				m_uAutoD =0;
				AfxMessageBox("单通道的红外数据下载完毕!");
				return;
			}

		}
		
	}
	m_bBULK = 1;//开始校验下载标志
	
	//初始化
	nRec = 0;
	nSendChNum ++;


	if(count_d == 0)
	{
		if(!m_bSerialSet)
			SetTimer(3,350,NULL);
		else
    		SetTimer(3,200,NULL);
	}
	switch(m_nChannelNum)
	{
	case 0:
		nx = 1;
		ny = 1;
		break;
	case 1:
		nx = 2;
		ny = 2;
		break;
	case 2:
		nx = 4;
		ny = 3;
		break;
	case 3:
		nx = 8;
		ny = 4;
		break;
	default:
		break;
	}

	if(count_d<26)
		stAA.Format("AA(%02x-%d)",count_d,nSendChNum);
	else
	{
		nTemp = count_d - 25;
		stAA.Format("AA(%xC-%d)",nTemp,nSendChNum);
	}
	if(m_bDownOneEn)//读通道1数据,下载到其他通道或本通道
	{
		::GetPrivateProfileString("NEW_CHANNEL1_IRDA",stAA,NULL,strcmd.GetBuffer(1024),1024,".\\irda.ini");
	}
	else
	{
		stx.Format("NEW_CHANNEL%d_IRDA",ny);
		//读取文件红外数据
		::GetPrivateProfileString(stx,stAA,NULL,strcmd.GetBuffer(1024),1024,".\\irda.ini");
	}
	str.Format("%s",strcmd);
	int len = String2HexA(str,hexdata);

	hexdata[2] = atoi(m_sAirModelAddr);//0x01;//空调模块地址
	hexdata[3] = 0x00;//PC机地址
	nx = nx<<4;
	nx = nx + nSendChNum;
	hexdata[4] = nx;//通道号 + 数据段号
	hexdata[6] = 0x10;//下载命令

	if(nSendChNum >= 5)
	{
		nSendChNum = 0;
		count_d ++;
	}

	if((unsigned char)hexdata[len - 1] == 0xff)
		len = len - 1;
	tm = (unsigned char)hexdata[5]-1;
	hexdata[5] = tm;
	relen = tm  + 4;
	
	k = 0;
	j = 0;
	n = 0;
	for(i=2;i<len-2;i++)
	{

		if(i>=3 )
		{
			if( ( (((unsigned char)hexdata[i-1]) == 0x7e) && (((unsigned char)hexdata[i]) == 0x81))  || i==8 )
			{	
				if(i!=8)
				{
					n81Num++;
					
				}
				continue;
			}
		}
		nCRC = nCRC + (unsigned char)hexdata[i]; 
		k++;
		if(relen  == k)
		{
			k = 0;
			if((unsigned char)hexdata[i] == 0x7e)//2008.05.09 ZQL ADD:     ...7e 81 CRCH CRCL 7e 7e
				n81Num++;
			break;
		}
	}
				/*
				CString sss;
				sss.Format("%04x",nCRC);
				AfxMessageBox(sss);
				*/

	CRCL = nCRC&0x00ff;
	CRC = nCRC >> 8;
	CRCH = CRC&0x00ff;

	i = 0;
	k = 0;
	n = 0;
	for(j=0;j<len-2;j++)
	{

		if(j>=3)
		{
			if( j==8 )
			{
				continue;				
			}
		}

		SendSerData[SendSerData[0]+1] = ((unsigned char)hexdata[j]);    //格式化网络数据命令  2008.06.23 ZQL
		SendSerData[0] ++;

		strDown.Format("%02x ",(unsigned char)hexdata[j]);
		strTp = strTp + strDown;
		strDown= _T("");

		k++;
		if(relen + 2 + n81Num == k)
		{
			k=0;
			n81Num =0;
			break;
		}
	}
	//校验
	strDown.Format("%02x ",CRCH);
	strTp = strTp + strDown;
		SendSerData[SendSerData[0] + 1] = CRCH;    //格式化网络数据命令  2008.06.23 ZQL
		SendSerData[0] ++;
	if(strDown == _T("7e "))
	{
		strTp = strTp + _T("81 ");

		SendSerData[SendSerData[0] + 1] = 0x81;    //格式化网络数据命令  2008.06.23 ZQL
		SendSerData[0] ++;
	}
	strDown= _T("");

	strDown.Format("%02x ",CRCL);
	strTp = strTp + strDown;
		SendSerData[SendSerData[0] + 1] = CRCL;    //格式化网络数据命令  2008.06.23 ZQL
		SendSerData[0] ++;
	if(strDown == _T("7e "))
	{
		strTp = strTp + _T("81 ");

		SendSerData[SendSerData[0] + 1] = 0x81;    //格式化网络数据命令  2008.06.23 ZQL
		SendSerData[0] ++;
	}
	strDown= _T("");

	//贞尾 7e 7e
	strDown.Format("%02x ",(unsigned char)hexdata[0]);
	strTp = strTp + strDown;
	strDown= _T("");
		SendSerData[SendSerData[0] + 1] = ((unsigned char)hexdata[0]);    //格式化网络数据命令  2008.06.23 ZQL
		SendSerData[0] ++;


	strDown.Format("%02x ",(unsigned char)hexdata[0]);
	strTp = strTp + strDown;
	strDown= _T("");
		SendSerData[SendSerData[0] + 1] = ((unsigned char)hexdata[0]);    //格式化网络数据命令  2008.06.23 ZQL
		SendSerData[0] ++;

⌨️ 快捷键说明

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