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

📄 pc2clientdlg.cpp

📁 VisualC实践与提高——串口通信与工程应用篇代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
								break;
							}
						}
					}
                    else
					{
						switch(intOffset)
						{
						case 1:
							{
							   m_Valve1.SetWindowText("已关闭");
								break;
							}
						case 2:
							{
							   m_Valve2.SetWindowText("已关闭");
								break;
							}
						case 3:
							{
							   m_Valve3.SetWindowText("已关闭");
								break;
							}
						case 4:
							{
							   m_Valve4.SetWindowText("已关闭");
								break;
							}
						}

					}
					break;
				}
			case 3:
				{
                    for(i=0;i<=3;i++)
                        arrTemp[i]=arrReceive[i+6];
					if(Bin2Float(arrTemp,&fTemp)) arrF[intOffset]=fTemp;

					myStr1=" 写F";
					myStr.Format("%d=%f",intOffset,arrF[intOffset]);
					myStr1+=myStr;
					myStr1+="\15\12";
					m_Edit1.SetSel(1000000,1000000);
					m_Edit1.ReplaceSel(myStr1);

					break;
				}
			}
            bFlag = AckCorrect();
			break;
		}
	case 0x52:                             //读操作
		{
            bytNumber = arrReceive[6];     //读取欲传送数据个数到bytNumber
 			Array1.RemoveAll();
			bytDataLong=5 + bytNumber * arrTypeLong[bytType];
			Array1.SetSize(bytDataLong);
			Array1.SetAt(0,6);
			Array1.SetAt(1,0x27);
			Array1.SetAt(2,bytNumber * arrTypeLong[bytType]);
            switch(bytType)
			{
			case 1:
				{
                    for(i=0;i<=(bytNumber - 1);i++)
						Array1.SetAt(i+3,arrB[i + intOffset]);

					myStr1=" 读B";
					if(bytNumber==1)
							myStr.Format("%d",intOffset);
						else
							myStr.Format("%d~B%d",intOffset,intOffset+bytNumber-1);

					myStr1+=myStr;
					myStr1+="\15\12";
					m_Edit1.SetSel(1000000,1000000);
					m_Edit1.ReplaceSel(myStr1);
					break;
				}
			case 3:
				{
                    for(i=0;i<=(bytNumber - 1);i++)
					{
                        fTemp = arrF[i + intOffset];
						if(Float2Bin(fTemp,arrTemp))
						{
							Array1.SetAt(4*i+3,arrTemp[0]);
							Array1.SetAt(4*i+4,arrTemp[1]);
							Array1.SetAt(4*i+5,arrTemp[2]);
							Array1.SetAt(4*i+6,arrTemp[3]);
						}
					}
					myStr1=" 读F";
					if(bytNumber==1)
							myStr.Format("%d",intOffset);
						else
							myStr.Format("%d~F%d",intOffset,intOffset+bytNumber-1);

					myStr1+=myStr;
					myStr1+="\15\12";
					m_Edit1.SetSel(1000000,1000000);
					m_Edit1.ReplaceSel(myStr1);
					break;

				}
			}
			bytTemp = 0;
            for(i=0;i<=(bytDataLong - 3);i++)
                bytTemp^=Array1.GetAt(i);
			Array1.SetAt(bytDataLong-2,bytTemp);
			Array1.SetAt(bytDataLong-1,0x0d);
			myComm.SetOutput(COleVariant(Array1)); 
			myStr1="响应: ";
			for(i=0;i<=bytDataLong-1;i++)
			{
				myStr.Format("%02X",Array1.GetAt(i));
				myStr1+=myStr;
				myStr1+="-";
			}
			myStr1.TrimRight('-');
			myStr1+="\15\12\15\12";
			m_Edit1.SetSel(1000000,1000000);
			m_Edit1.ReplaceSel(myStr1);
			
			break;
		}
	}
}

void CPC2ClientDlg::OnOpencom() 
{
	// TODO: Add your control notification handler code here
	CString myStr;
	if (!myComm.GetPortOpen())                  //若串口尚未打开
	{
		myComm.SetCommPort(mySetupDlg.m_Com+1); //指定串口号
		switch (mySetupDlg.m_BaudRate)
		{
		case 0:
			{
			myStr="19200,";
			break;
			}
		case 1:
			{
			myStr="9600,";
			break;
			}
		case 2:
			{
			myStr="4800,";
			break;
			}
		case 3:
			{
			myStr="2400,";
			break;
			}
		}
		switch (mySetupDlg.m_Parity)
		{
		case 0:
			{
			myStr+="N,8,1";
			break;
			}
		case 1:
			{
			myStr+="O,8,1";
			break;
			}
		case 2:
			{
			myStr+="E,8,1";
			break;
			}
		}		
		myComm.SetSettings(myStr);          //通信参数设置
		myComm.SetInBufferSize(1024);       //指定接收缓冲区大小
		myComm.SetInBufferCount(0);         //清空接收缓冲区
		myComm.SetInputMode(1);             //设置数据获取方式
		myComm.SetInputLen(0);              //设置每次读取长度
		myComm.SetRThreshold(3);            //设置接收OnComm事件门限值
		myComm.SetPortOpen(1);              //打开串口
		myComm.SetInBufferCount(0);         //清除输入缓冲区
		m_Close.EnableWindow(true);
		m_Open.EnableWindow(false);
		m_Setup.EnableWindow(false);
		SetTimer(1,1000,NULL);
	}
	else                                   //串口已经打开
	{
		AfxMessageBox("串口已经打开!");
	}

}

void CPC2ClientDlg::OnClosecom() 
{
	// TODO: Add your control notification handler code here
	if (myComm.GetPortOpen())             //串口若打开
	{
		myComm.SetPortOpen(false);
		m_Close.EnableWindow(false);
		m_Open.EnableWindow(true);
		m_Setup.EnableWindow(true);
		KillTimer(1);
	}
}


void CPC2ClientDlg::OnClose() 
{
	// TODO: Add your message handler code here and/or call default
	if (myComm.GetPortOpen())             //串口若打开
	{
		myComm.SetPortOpen(false);
		m_Close.EnableWindow(false);
		m_Open.EnableWindow(true);
		m_Setup.EnableWindow(true);

	}
	
	CDialog::OnClose();
}

//32位二进制数转浮点数程序
bool  CPC2ClientDlg::Bin2Float(BYTE arrBin[],float *fOutput)
{
    int Power;                         //Power存放阶码,
	int i,j;                           //i,j计数
    float fMantissa;                   //存放尾数十进制数值
    BYTE arrBits[32];                  //存放32位1或0值
    long lTemp;
    lTemp = 0;
    for(i=0;i<=3;i++)
        lTemp = lTemp + arrBin[i];
    if(lTemp != 0)
	{
        Power = 0;
        for(i=3;i>=0;i--)
		{
            for(j=7;j>=0;j--)
			{
                if(arrBin[i] >= arrCompare[j])
				{
                    arrBits[i * 8 + j] = 1;
                    arrBin[i]=arrBin[i] - arrCompare[j];
				}
				else
                    arrBits[i * 8 + j]=0;
			}
		}
        for(i=0;i<=7;i++)
            Power = Power + arrBits[i + 23] * (int)pow(2,i);
        Power = Power - 127;             //阶码采用过余127码格式,故需减去127
        fMantissa = 0;
        for(i=22;i>=0;i--)
            fMantissa = fMantissa + arrMantissa[i] * arrBits[i];
        fMantissa = fMantissa + 1;       //规格化浮点数隐含整数1,故需加入
        //浮点数=-1位符次幂*2阶码次幂*尾数
        *fOutput =(float)(pow(-1,arrBits[31])* pow(2,Power) * fMantissa);
	}
	else
		*fOutput=0;
	return true;
}

//浮点数转32位二进制数程序
bool  CPC2ClientDlg::Float2Bin(float fInput,BYTE *arrBin)
{
    BYTE Power;                        //浮点数的阶码
	BYTE *tmpBin;
	int j;
    BYTE arrBits[23];                  //23位尾数各位的取值情况,1或0
    BYTE bytBit23;                     //第23位的取值情况,1或0
    for(j=0;j<=22;j++)
        arrBits[j] = 0;
	tmpBin=arrBin;                     //将字节数组地址保存起来
    for(j=0;j<=3;j++)                  //四字节数初始化为0
	{
        *arrBin=0;
		arrBin++;
	}
	arrBin=tmpBin;                    //恢复数组地址
    if(fInput!=0)                     //若fInput为0,则arrBin(0~3)都为0
	{
        Power=127;                    //设置基值,以恢复过余127码的原值
        if(fInput < 1)
		{
            for(j=1;j<=127;j++)       //此处的127只是大概数值,更准确的上限值应考察浮点数的可用范围
			{
                Power--;
                if((fInput * pow(2,j)) >= 1)
				{
                    fInput = fInput * (float)pow(2,j);
                    break;
				}
			}
		}
		else
		{
            while ( fInput >= 2)
			{
                fInput = fInput / 2;
                Power++;
			}
		}
        if((Power%2)!=0)
		{
            bytBit23 = 1;
		}
		arrBin=arrBin+3;
        *arrBin=(BYTE)Power/2;              //求arrBin[3]
		arrBin=tmpBin;
        fInput--;                           //消除规格化浮点数的隐含整数1
        for(j=22;j>=0;j--)
		{
            if(fInput >= arrMantissa[j])
			{
                arrBits[j] = 1;
                fInput-=arrMantissa[j];
			}
			else
			{
                arrBits[j] = 0;
            }

		}
        for(j=7;j>=0;j--)
            *arrBin+=(BYTE)pow(2,j) * arrBits[j];       //求arrBin[0]
		arrBin++;
        for(j=15;j>=8;j--)
            *arrBin+=(BYTE)pow(2,(j - 8))* arrBits[j];  //求arrBin[1]
		arrBin++;
        for(j=22;j>=16;j--)
            *arrBin+=(BYTE)pow(2,(j - 16))* arrBits[j]; //求arrBin[2]
        *arrBin+=(BYTE)pow(2,7)* bytBit23;
		arrBin=tmpBin;

	}
	return true;
}

//返回错误响应程序
bool	CPC2ClientDlg::AckError(BYTE errCode)
{
	CByteArray Array1;              //创建存放二进制数据的CByteArray类实例
	CString myStr1,myStr;           //显示信息时使用的字符串
	int i;
	Array1.RemoveAll();
	Array1.SetSize(4);
	Array1.SetAt(0,0xf);
	Array1.SetAt(1,errCode);
	Array1.SetAt(2,errCode^0xf);
	Array1.SetAt(3,0x0d);
	myComm.SetOutput(COleVariant(Array1)); 
	myStr1="  回应: ";
	for(i=0;i<=3;i++)
	{
		myStr.Format("%02X",Array1.GetAt(i));
		myStr1+=myStr;
		myStr1+="-";
	}
	myStr1.TrimRight('-');
	myStr1+="\15\12\15\12";
	m_Edit1.SetSel(1000000,1000000);
	m_Edit1.ReplaceSel(myStr1);
	return true;
}

//返回正确响应程序
bool	CPC2ClientDlg::AckCorrect()
{

	CByteArray Array1;            //创建存放二进制数据的CByteArray类实例
	CString myStr1,myStr;         //显示信息时使用的字符串
	int i;
	Array1.RemoveAll();
	Array1.SetSize(4);
	Array1.SetAt(0,6);
	Array1.SetAt(1,0x27);
	Array1.SetAt(2,0x21);
	Array1.SetAt(3,0x0d);
	myComm.SetOutput(COleVariant(Array1)); 
	myStr1="响应:";
	for(i=0;i<=3;i++)
	{
		myStr.Format("%02X",Array1.GetAt(i));
		myStr1+=myStr;
		myStr1+="-";
	}
	myStr1.TrimRight('-');
	myStr1+="\15\12\15\12";
	m_Edit1.SetSel(1000000,1000000);
	m_Edit1.ReplaceSel(myStr1);
	if(m_Edit1.GetLineCount()>=1000)
	{
		m_Edit1.SetReadOnly(false);
		m_Edit1.SetSel(0,-1);
		m_Edit1.Clear();
		m_Edit1.SetReadOnly(true);
	}
    return true;
}

void CPC2ClientDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	CString myStr;
	if(dblVarible>2)
	{
		dblIncStep=-0.1;
	}
	if(dblVarible<-1)
	{
		dblIncStep=0.1;
	}
	dblVarible+=dblIncStep;
	arrF[1]=(float)dblVarible*10+12;
	arrF[2]=(float)dblVarible*10+32;
	arrF[3]=(float)dblVarible*10+62;
	arrF[4]=(float)dblVarible*10+82;

	myStr.Format("%.2f",arrF[1]);
	m_Volume1.SetWindowText(myStr);
	myStr.Format("%.2f",arrF[2]);
	m_Volume2.SetWindowText(myStr);
	myStr.Format("%.2f",arrF[3]);
	m_Volume3.SetWindowText(myStr);
	myStr.Format("%.2f",arrF[4]);
	m_Volume4.SetWindowText(myStr);

	CDialog::OnTimer(nIDEvent);
}

⌨️ 快捷键说明

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