📄 tongxundlg.cpp
字号:
if(btnName_closejcq=="合接触器")
{
SetDlgItemText(IDC_CLOSEJCQ,"断接触器");
// int len=String2Hex(m_strTXData,hexdata); //此处返回的len可以用于计算发送了多少个十六进制数
int len=String2Hex("7E E7 7E 58 F3 4D 02 A0 A0 E4 DA 0D ",hexdata);
// m_ctrlComm.SetOutput(COleVariant("7E E7 7E 58 F3 4D 02 A0 A0 E4 DA 0D "));
m_ctrlComm.SetOutput(COleVariant(hexdata)); //以16进制发送数据
SetDlgItemText(IDC_EDIT_JCQCLOSUC,"接触器已合上");
}
if(btnName_closejcq=="断接触器")
{
SetDlgItemText(IDC_CLOSEJCQ,"合接触器");
int len=String2Hex("7E E7 7E 58 F3 4D 02 0A 0A E4 AE 0D ",hexdata);
m_ctrlComm.SetOutput(COleVariant(hexdata)); //以16进制发送数据
// m_ctrlComm.SetOutput(COleVariant("7E E7 7E 58 F3 4D 02 0A 0A E4 AE 0D "));
SetDlgItemText(IDC_EDIT_JCQCLOSUC,"接触器已断开");
}
SetTimer(1,500,NULL);
}//end else
}
//*****************************************************
//以16进制发送数据的格式
// String2Hex("7E E7 7E 58 F3 4C 02 0D 0D E5 B3 0D ",hexdata);
// m_ctrlComm.SetOutput(COleVariant(hexdata)); //以16进制发送数据
//定时发送查询命令
void CTongxunDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
UpdateData(TRUE);
if(receiving_flag!=1&&m_ctrlComm.GetPortOpen()) //串口打开了,才进行下面的操作
{
CString str="";
if(m_autoinquire.GetCheck()) //没有正在读缓冲区,且选中自动查询,则隔0.5s发送一次查询命令
{
CByteArray hexdata;
String2Hex("7E E7 7E 58 F3 5C 02 AA 55 0A A8 0D ",hexdata);
m_ctrlComm.SetOutput(COleVariant(hexdata)); //以16进制发送数据 //每隔0.5ms发送一次查询命令
UpdateData(FALSE); //更新编辑框内容
}
//**************************************************************************
// SetDlgItemText(IDC_EDIT_COMOPSUC,m_strrxdata); //用IDC向编辑框发送变量显示
// SetDlgItemText(IDC_EDIT_COMOPSUC,"串口已关闭"); //用IDC向编辑框发送常量显示
// m_ctrlComm.SetOutput(COleVariant(hexdata)); //用变量向编辑框发送变量显示
// nbit_dec2str(int dec_data,int nbit_data) //转换函数的格式
//**************************************************************************
//对查询返回数据进行处理
//
UpdateData(TRUE); //读取编辑框数据
if(rxdata_notdisplay=="")
{
SetDlgItemText(IDC_EDIT_CHARGE_STATE,"充电前"); //充电机状态
SetDlgItemText(IDC_EDIT_VCHECK_DATA,"0"); //充电电压
SetDlgItemText(IDC_EDIT_ICHECK_DATA,"0.0000"); //充电电流
SetDlgItemText(IDC_EDIT_VSET_DATA,"0"); //设置电压
SetDlgItemText(IDC_EDIT_MXVCHECK_DATA,"0"); //母线电压
SetDlgItemText(IDC_EDIT_MXICHECK_DATA,"0.0000"); //母线电流
SetDlgItemText(IDC_EDIT_JCQSTATE,"闭合"); //接触器状态
}
else
{
str="";
int len=rxdata_notdisplay.GetLength();
if(len>=20) //若<20,肯定不是查询返回的数据,跳过
{
for(int i=0;i<20;i++)
str+=rxdata_notdisplay[i];
if(str=="7E E7 7E F3 58 C5 0A") //不是查询返回的数据,不对显示作修改处理
{
str=nbit_dec2str(bitn_str2dec(rxdata_notdisplay,8)*256+bitn_str2dec(rxdata_notdisplay,9),4);
SetDlgItemText(IDC_EDIT_VSET_DATA,str); //设置电压
//--------------------------------
str=nbit_dec2str(bitn_str2dec(rxdata_notdisplay,10)*256+bitn_str2dec(rxdata_notdisplay,11),4);
SetDlgItemText(IDC_EDIT_VCHECK_DATA,str); //充电电压
//--------------------------------
str=nbit_dec2str(bitn_str2dec(rxdata_notdisplay,12)*256+bitn_str2dec(rxdata_notdisplay,13),4);
SetDlgItemText(IDC_EDIT_MXVCHECK_DATA,str); //母线电压
//--------------------------------
str=nbit_dec2str(bitn_str2dec(rxdata_notdisplay,14)*256+bitn_str2dec(rxdata_notdisplay,15),4);
SetDlgItemText(IDC_EDIT_MXICHECK_DATA,str); //母线电流
//--------------------------------
char ch1=rxdata_notdisplay[48];
char ch2=rxdata_notdisplay[49];
if(ch1=='0'&&ch2=='C')
// if(rxdata_notdisplay[48]=='0'&&rxdata_notdisplay[49]=='C')
SetDlgItemText(IDC_EDIT_JCQSTATE,"闭合"); //充电机状态
else if(rxdata_notdisplay[48]=='C'&&rxdata_notdisplay[49]=='0')
SetDlgItemText(IDC_EDIT_JCQSTATE,"断开");
else
SetDlgItemText(IDC_EDIT_JCQSTATE,"****");
//--------------------------------
if(rxdata_notdisplay[46]=='1'&&rxdata_notdisplay[47]=='A')
SetDlgItemText(IDC_EDIT_CHARGE_STATE,"充电前"); //接触器状态
else if(rxdata_notdisplay[46]=='2'&&rxdata_notdisplay[47]=='A')
SetDlgItemText(IDC_EDIT_CHARGE_STATE,"充电中");
else if(rxdata_notdisplay[46]=='3'&&rxdata_notdisplay[47]=='A')
SetDlgItemText(IDC_EDIT_CHARGE_STATE,"充电完毕");
else if(rxdata_notdisplay[46]=='A'&&rxdata_notdisplay[47]=='1')
SetDlgItemText(IDC_EDIT_CHARGE_STATE,"输入电压过高");
else if(rxdata_notdisplay[46]=='A'&&rxdata_notdisplay[47]=='2')
SetDlgItemText(IDC_EDIT_CHARGE_STATE,"输入电压过低");
else if(rxdata_notdisplay[46]=='A'&&rxdata_notdisplay[47]=='3')
SetDlgItemText(IDC_EDIT_CHARGE_STATE,"母线过流");
else if(rxdata_notdisplay[46]=='A'&&rxdata_notdisplay[47]=='4')
SetDlgItemText(IDC_EDIT_CHARGE_STATE,"充电过压");
else if(rxdata_notdisplay[46]=='A'&&rxdata_notdisplay[47]=='5')
SetDlgItemText(IDC_EDIT_CHARGE_STATE,"泻能开关未打开");
else if(rxdata_notdisplay[46]=='A'&&rxdata_notdisplay[47]=='6')
SetDlgItemText(IDC_EDIT_CHARGE_STATE,"变压器故障");
else if(rxdata_notdisplay[46]=='A'&&rxdata_notdisplay[47]=='7')
SetDlgItemText(IDC_EDIT_CHARGE_STATE,"充电过流");
else if(rxdata_notdisplay[46]=='A'&&rxdata_notdisplay[47]=='8')
SetDlgItemText(IDC_EDIT_CHARGE_STATE,"充电中");
else if(rxdata_notdisplay[46]=='A'&&rxdata_notdisplay[47]=='9')
SetDlgItemText(IDC_EDIT_CHARGE_STATE,"电压闪络");
else
SetDlgItemText(IDC_EDIT_CHARGE_STATE,"****");
}//end if(str=="7E E7 7E F3 58 5C 0A")
}//end if(len>=20)
}//end else
UpdateData(FALSE); //更新编辑框内容
}//end if(receiving_flag!=1)
CDialog::OnTimer(nIDEvent);
}
//***********************************************
//清空接收框内容
void CTongxunDlg::OnClearrxdata()
{
// TODO: Add your control notification handler code here
SetDlgItemText(IDC_RXDATA,""); //设置接收编辑框内容为空
m_strrxdata=""; //rxdata同时清空,因为接收时是累加接收:m_strrxdata+=strtemp;
}
//*********************************************************************
//数据转换程序
//由于这个转换函数的格式限制,在发送框中的十六制字符应该每两个字符之间插入一个空隔
//如:A1 23 45 0B 00 29
//CByteArray是一个动态字节数组,可参看MSDN帮助
int CTongxunDlg::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;
}
//这是一个将字符转换为相应的十六进制值的函数
//好多C语言书上都可以找到
//功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1
char CTongxunDlg::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);
}
///*
int CTongxunDlg::string_to_hex(CString str)
{
return 0;
}
void CTongxunDlg::OnVoltset()
{
// TODO: Add your control notification handler code here
CString vset_txdata,temp="",str="";
CByteArray hexdata;
int check_data=0;
vset_txdata="7E E7 7E 58 F3 3B 03 ";
UpdateData(TRUE); //读入编辑框数据
str=m_vsetdata;
int len=str.GetLength();
int str2dex=0;
for(int i=0;i<len;i++) //设置电压是以字符串格式读入,将其转换为十进制数据
str2dex+=(int)(str[i]-48)*(int)pow(10,len-i-1);
char ch='0';
vset_txdata+=onehex2string(str2dex/4096); //设置电压高位的高位:bit4.转成对应的字符
vset_txdata+=onehex2string(str2dex/256); //设置电压高位的低位:bit3.转成对应的字符
vset_txdata+=" ";
vset_txdata+=onehex2string(str2dex/16); //设置电压低位的高位:bit2.转成对应的字符
vset_txdata+=onehex2string(str2dex%16); //设置电压低位的低位:bit1.转成对应的字符
vset_txdata+=" 00 ";
check_data=0x93^str2dex/256; //异或校验位转成对应的字符
check_data^=str2dex%256;
vset_txdata+=twohex2string(check_data);
vset_txdata+=" ";
check_data=0x89+str2dex/256; //和校验位转成对应的字符
check_data+=str2dex%256;
check_data%=256;
vset_txdata+=twohex2string(check_data);
vset_txdata+=" 0D "; //分5段拼成设置命令
String2Hex(vset_txdata,hexdata); //转换成16进制数据
m_ctrlComm.SetOutput(COleVariant(hexdata)); //发送十六进制数据
UpdateData(FALSE); //更新编辑框内容
}
//*****************************************
//将2位16进制数字转换成相对应的字符
/////
CString CTongxunDlg::twohex2string(int hex2str_data=0)
{
CString str="";
char ch='0';
if(hex2str_data/16<10)
ch=(char)(hex2str_data/16+48); //数字0-9转成字符0-9
else
ch=(char)(hex2str_data/16+55); //数字10-15转成字符A-F
str+=ch;
if(hex2str_data%16<10)
ch=(char)(hex2str_data%16+48);
else
ch=(char)(hex2str_data%16+55);
str+=ch;
return str;
}
//*****************************************
//将1位16进制数字转换成相对应的字符
/////
CString CTongxunDlg::onehex2string(int hex2str_data=0)
{
CString str="";
char ch='0';
if(hex2str_data%16<10)
ch=(char)(hex2str_data%16+48); //数字0-9转成字符0-9
else
ch=(char)(hex2str_data%16+55); //数字10-15转成字符A-F
str+=ch;
return str;
}
//*****************************************
//将字符串中指定位转换成10进制数据
//该程序仅针对形如7E E7 7E 87 99 ……类中间带空格,每个数据是2位16进制 的字符串
/////
int CTongxunDlg::bitn_str2dec(CString str="",int bitn=0)
{
int bitn_data=0;
int i=0,j=0;
int len=str.GetLength();
for(i=0;i<len;i++)
{
if(j==bitn-1)
{
bitn_data=onehexstr2dec(str[i])*16+onehexstr2dec(str[i+1]);
break;
}
if(str[i]==' ')
j++;
}
return bitn_data;
}
//*****************************************
//该程序将一位16进制表示的字符转成对应的10进制数据.如将'e'转成14
/////////
int CTongxunDlg::onehexstr2dec(char ch='0')
{
int i=0;
int oneh2d_data=-1;
if(ch>='0'&&ch<='9')
oneh2d_data=(int)ch-48;
else if(ch>='a'&&ch<='f')
oneh2d_data=(int)ch-87;
else if(ch>='A'&&ch<='F')
oneh2d_data=(int)ch-55;
return oneh2d_data;
}
//**************************************************
//将指定位数的10进制数据转成字符
////////////
CString CTongxunDlg::nbit_dec2str(int dec_data,int nbit_data)
{
int i=0;
char ch='0';
CString str="";
for(i=0;i<nbit_data;i++)
{
str+=(char)(dec_data/pow(10,nbit_data-i-1)+48);
dec_data%=(int)pow(10,nbit_data-i-1);
}
return str;
}
void CTongxunDlg::OnInquire()
{
// TODO: Add your control notification handler code here
if(!m_ctrlComm.GetPortOpen()) //若串口没有打开且没有选自动查询,说明是在点手动发送时串口没打开,报错
{
if(!m_autoinquire.GetCheck())
AfxMessageBox("串口未打开,请打开串口!");
if(m_autoinquire.GetCheck()&&have_warm_flag!=1) //选中了自动查询,且没报过错,则报错.避免一直报错
{
AfxMessageBox("串口未打开,请打开串口!"); //关串口时将定时器关了,就不会连续报错
have_warm_flag=1;
}
}
else
{
KillTimer(1);
CByteArray hexdata;
String2Hex("7E E7 7E 58 F3 5C 02 AA 55 0A A8 0D ",hexdata);
m_ctrlComm.SetOutput(COleVariant(hexdata)); //以16进制发送数据
UpdateData(FALSE); //更新编辑框内容
SetTimer(1,500,NULL);
}
}
void CTongxunDlg::OnSelchangeChosecom()
{
// TODO: Add your control notification handler code here
have_chosecom_flag=1;
if(m_ctrlComm.GetPortOpen()) //若串口已打开
{
SetDlgItemText(IDC_OPEN_COMPORT,"打开串口");
m_ctrlComm.SetPortOpen(FALSE); //关闭串口
SetDlgItemText(IDC_EDIT_COMOPSUC,"");
AfxMessageBox("COM口选择,串口自动关闭,选择好后请重新打开串口!");
}
}
void CTongxunDlg::OnSelchangeChosebud()
{
// TODO: Add your control notification handler code here
have_chosebud_flag=1;
if(m_ctrlComm.GetPortOpen()) //若串口已打开
{
SetDlgItemText(IDC_OPEN_COMPORT,"打开串口");
m_ctrlComm.SetPortOpen(FALSE); //关闭串口
SetDlgItemText(IDC_EDIT_COMOPSUC,"");
AfxMessageBox("波特率选择,串口自动关闭,选择好后请重新打开串口!");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -