📄 serialcommdlg.cpp
字号:
return TRUE;
}
void CSerialCommDlg::OnOpenClose()
{
// TODO: Add your control notification handler code here
//如果设备已经打开,那么关闭它
if(m_COM.GetPortOpen())
{
m_COM.SetPortOpen(FALSE);
GetDlgItem(IDC_OPEN_CLOSE)->SetWindowText("打开串口");
m_szStatus="关闭"; //在下面的状态框中输出当前的串口状态
}
else
{
//取得用户的设置
UpdateData(true);
//获取并设置端口号
int comNum; //获取组合框当前项的临时变量,下面也通用
// CString comna;
char comtemp;
// comNum=m_ctrlCOMName.GetCurSel();
// m_ctrlCOMName.GetDlgItemText(comNum,comna);
comtemp=m_szCOMName.GetAt(3);
comNum=comtemp-'0';
m_COM.SetCommPort(comNum); //选择com端口号
//获取校验位
comNum=m_ctrlParity.GetCurSel();
CString parityStytle[3]={"n","o","e"};
CString parity=parityStytle[comNum];
//如果串口没有打开则打开
if(!m_COM.GetPortOpen())
{
m_COM.SetPortOpen(TRUE); //打开串口
m_szStatus="打开"; //在下面的状态框中输出当前的串口状态
}
else
{
AfxMessageBox("串口打开失败!"); //打开失败则输出提示信息
}
//串口参数设置
m_COM.SetSettings(m_szBaud+parity+m_szDataBits+m_szStopBits); //波特率,校验,数据位,停止位
m_COM.SetInputMode(1); //1:表示以二进制方式检取数据
m_COM.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时,将引发一个接收数据的OnComm事件
m_COM.SetInputLen(0); //设置当前接收区数据长度为0
m_COM.GetInput(); //先预读缓存区,以清除残留数据
//打开后改变按钮的状态
if(m_COM.GetPortOpen())
{
GetDlgItem(IDC_OPEN_CLOSE)->SetWindowText("关闭串口");
}
}
UpdateData(false);
}
BEGIN_EVENTSINK_MAP(CSerialCommDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CSerialCommDlg)
ON_EVENT(CSerialCommDlg, IDC_MSCOMM, 1 /* OnComm */, OnOnCommMscomm, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
void CSerialCommDlg::OnOnCommMscomm()
{
// TODO: Add your control notification handler code here
if(reciflag)
{
//读取控件数据
UpdateData(true);
//代表控件引发的事件
switch(m_COM.GetCommEvent())
{
case 1://comEvSend 发送数据
{
//如有数据要发送
OnSend();
}
break;
case 2://comEvReceiv 接收数据
{
static counti=0;
int m_iRecvDataCount;
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[16]; //设置byte数组 An 8-bit integerthat is not signed.
CString strtemp;
static CString show;
variant_inp=m_COM.GetInput(); //读缓存区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
{
safearray_inp.GetElement(&k,rxdata+k); //转为byte型数组
}
for(k=0;k<len;k++) //将数组转换为cstring类型
{
m_iRecvDataCount; //接收数据的总数
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%C",bt); //将字符送入strtemp临时变量中存放
show+=strtemp; //加入接收编辑框对应的字符串
// if((m_iRecvDataCount>0)&&((m_iRecvDataCount % 16)==0))
// {
/// strtemp.Format("\r\n");
// m_szRecvData +=strtemp;
// }
// UpdateData(FALSE); //更新编辑框内容
// if((m_iRecvDataCount/16)>=13)
// {
// m_Recv_Ctrl.SendMessage(EM_SCROLL,SB_LINEDOWN,0);
// }
}
m_nRecvCount+=len;
counti+=len;
if(counti%16==0)
{
show.Replace("#V0","转速:");
show.Replace("#U0","控制量:");
m_szRecvData+=show+"\r\n";
this->UpdateData(FALSE);
counti=0;
CString temp1,temp2;
show.Delete(0,5);
show.Delete(5,7);
show.Remove(';');
temp1=show.Left(4);
temp2=show.Right(4);
WData.PV=atoi((LPCTSTR)temp1);
WData.MV=atoi((LPCTSTR)temp2);
WriteDataToFile();
show="";
}
}
break;
case 1009://comEventRxParity 事件,奇偶校验错误
{
//错误处理代码
AfxMessageBox("奇偶校验错误,未处理");
}
break;
default:
break;
}
this->UpdateData(FALSE);
}
else
{
WriteDataToFile();
}
}
char 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 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;
}
void CSerialCommDlg::OnSend()
{
// TODO: Add your control notification handler code here
this->UpdateData(true);
reciflag=0;
CString temp1,temp2,temp3;
temp2="";
if(m_kp<10)
temp1.Format("$P00%d;",m_kp);
else if(m_kp<100 && m_kp>=10)
temp1.Format("$P0%d;",m_kp);
else
temp1.Format("$P%d;",m_kp);
temp2=temp1;
temp3=temp2;
MySendOut(temp3);
for(int n=0;n<65535;n++){for(int n=0;n<1000;n++){}}
temp3="";
if(m_ti<10)
temp1.Format("$I00%d;",m_ti);
else if(m_ti<100 && m_ti>=10)
temp1.Format("$I0%d;",m_ti);
else
temp1.Format("$I%d;",m_ti);
temp2+=temp1;
temp3+=temp1;
MySendOut(temp3);
for(n=0;n<65535;n++){for(int n=0;n<1000;n++){}}
temp3="";
if(m_td<10)
temp1.Format("$D00%d;",m_td);
else if(m_td<100 && m_td>=10)
temp1.Format("$D0%d;",m_td);
else
temp1.Format("$D%d;",m_td);
temp2+=temp1;
temp3+=temp1;
MySendOut(temp3);
for(n=0;n<65535;n++){for(int n=0;n<1000;n++){}}
temp3="";
m_szSendData+=temp2+"设置控制器\r\n";
this->UpdateData(FALSE);
reciflag=1;
}
void CSerialCommDlg::OnClearCount()
{
// TODO: Add your control notification handler code here
m_nSendCount=0;
m_nRecvCount=0;
this->UpdateData(false);
}
void CSerialCommDlg::OnClearSend()
{
// TODO: Add your control notification handler code here
m_szSendData="";
this->UpdateData(FALSE);
}
void CSerialCommDlg::OnClearRecv()
{
// TODO: Add your control notification handler code here
m_szRecvData="";
this->UpdateData(FALSE);
}
void CSerialCommDlg::OnSetsv()
{
reciflag=0;
this->UpdateData(true);
CString temp1,temp2;
temp2="";
if(m_sv<10)
temp1.Format("$S00%d;",m_sv);
else
temp1.Format("$S0%d;",m_sv);
temp2=temp1;
MySendOut(temp2);
m_szSendData+=temp2+"设置给定\r\n";
this->UpdateData(FALSE);
reciflag=1;
}
void CSerialCommDlg::OnReset()
{
reciflag=0;
this->UpdateData(true);
CString temp1,temp2;
temp2="";
temp1="$R000;";
temp2=temp1;
MySendOut(temp2);
m_szSendData+=temp2+"控制器复位\r\n";
this->UpdateData(FALSE);
reciflag=1;
}
void CSerialCommDlg::OnLoopset()
{
reciflag=0;
this->UpdateData(true);
UINT loopsel;
loopsel=1-loopsel;
loopsel=m_ctrl_loop.GetCurSel();
CString temp1,temp2;
temp2="";
temp1.Format("$L00%d;",loopsel);
temp2=temp1;
MySendOut(temp2);
m_szSendData+=temp2+"开环闭环设置\r\n";
this->UpdateData(FALSE);
reciflag=1;
}
void CSerialCommDlg::OnInimv()
{
reciflag=0;
this->UpdateData(true);
CString temp1,temp2;
temp2="";
if(m_mv<10)
temp1.Format("$X00%d;",m_mv);
else
temp1.Format("$X0%d;",m_mv);
temp2=temp1;
MySendOut(temp2);
m_szSendData+=temp2+"设置初始控制量\r\n";
this->UpdateData(FALSE);
reciflag=1;
}
void CSerialCommDlg::WriteDataToFile()
{
this->UpdateData(TRUE);
WData.SV=m_sv;
WData.T=1;
CFile File;
File.Open("D:\\Real.dat",CFile::modeCreate||CFile::modeWrite);
File.Write(&WData,sizeof(WData));
File.Close();
}
void CSerialCommDlg::OnAbout()
{
// TODO: Add your control notification handler code here
CAboutDlg dlg;
dlg.DoModal();
}
void CSerialCommDlg::OnShowline()
{
// TODO: Add your control notification handler code here
WinExec("RunFlat.exe", SW_SHOW);
}
void CSerialCommDlg::MySendOut(CString sendbuff)
{
CString temp;
for(int i=1;i<=8;i++)
{
temp=sendbuff.Left(1);
/* int len;
CByteArray array;
len=send.GetLength();
array.RemoveAll();
array.SetSize(len);
for(int i=0;i<len;i++)
array.SetAt(i, send[i]);
*/
if(!m_ctrlSendMode.GetCurSel()) //以十六进制发送
{
CByteArray hexdata;
//此处返回的len可以用于计算发送了多少个16进制数
int len=String2Hex(temp,hexdata);
m_COM.SetOutput(COleVariant(hexdata)); //发送16进制数据
m_nSendCount +=len;
}
else //以ASCII方式发送
{
int len=temp.GetLength();
m_nSendCount +=len;
m_COM.SetOutput(COleVariant(temp)); //发送数据
}
sendbuff.Delete(0);
for(int n=0;n<65535;n++){for(int n=0;n<1000;n++){}}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -