📄 pc2clientdlg.cpp
字号:
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 + -