📄 sampledlg.cpp
字号:
m_szCOMName == "COM2")
{
m_COM.SetPortOpen(FALSE); //先关闭
if (m_szCOMName == "COM1") m_COM.SetCommPort(1);
if (m_szCOMName == "COM2") m_COM.SetCommPort(2);
}
else
{
::AfxMessageBox("COM端口不对");
return ;
}
m_COM.SetPortOpen(TRUE); //打开串口
m_szStatus = "打开";
this->UpdateData(FALSE);
m_COM.SetSettings(szSetting);
m_COM.SetInputMode(1); //1:表示以二进制方式检取数据
m_COM.SetRThreshold(1); //为1表示有一个字符引发一个事件
m_COM.SetSThreshold(1); //参数1表示每当串口接收缓冲区中有
//多于或等于1个字符时将引发一个接收数据的OnComm事件
m_COM.SetInputLen(0); //设置当前接收区数据长度为0
m_COM.GetInput(); //先预读缓冲区以清除残留数据
}
else
{
this->UpdateData(TRUE); //读取内容
}
}
/////////下拉选择改变时调用SettingChanged()//////////
////////////////////////////////////////////////////
void CSampleDlg::OnSelchangeComName()
{
SettingChanged();
}
void CSampleDlg::OnSelchangeBaud()
{
SettingChanged();
}
void CSampleDlg::OnSelchangeDataBit()
{
SettingChanged();
}
void CSampleDlg::OnSelchangeParity()
{
SettingChanged();
}
void CSampleDlg::OnSelchangeStopBit()
{
SettingChanged();
}
//////////////////////定时器函数//////////////
///////////////////////////////////////////////
void CSampleDlg::OnTimer(UINT nIDEvent)
{
int dblValue;
double value;
if(temptemp=="FE"||temptemp=="FF") //屏蔽FE和FF的干扰
m_quxian.AppendPoint(0);
else
{
dblValue=strHexToInt(temptemp); //将转速转化为整型
value=dblValue; //转化为实型
m_quxian.AppendPoint(value); //画图置点
}
CDialog::OnTimer(nIDEvent);
}
HBRUSH CSampleDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
switch(nCtlColor) {
case CTLCOLOR_STATIC:
pDC->SetBkMode(TRANSPARENT);
case CTLCOLOR_EDIT:
pDC->SetBkMode(TRANSPARENT);
case CTLCOLOR_DLG:
return static_cast<HBRUSH>(m_bkBrush.GetSafeHandle());
}
return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}
BEGIN_EVENTSINK_MAP(CSampleDlg, CDialog)
//{{AFX_EVENTSINK_MAP(CSampleDlg)
ON_EVENT(CSampleDlg, IDC_MSCOMM1, 1 /* OnComm */, OnOnCommMscomm1, VTS_NONE)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
/////////////////////////////////////////////////
////////////MSComm控件事件处理函数///////////////
////////////////////////////////////////////////
void CSampleDlg::OnOnCommMscomm1()
{
CString temp1=receive(); //调用接收数据函数
if ((int)::strlen(temp1)==4) //收到数据为4个字节
{
int i;
temptemp="";
for(i=0;i<=1;i++)
temptemp+=temp1[i]; //提取前两个字节(电机状态)
if(temptemp=="EA")
{
m_zhuanxiang="正转";
m_quxian.AppendPoint(0);
}
else if(temptemp=="E9")
{
m_zhuanxiang="反转";
m_quxian.AppendPoint(0);
}
UpdateData(FALSE); //显示电机状态
temptemp="";
for(i=2;i<=3;i++)
temptemp+=temp1[i];//提取后两个字节(转速)
}
else
{
temptemp="";
temptemp=temp1;
if(temptemp=="00")
m_zhuanxiang="停止";
}
m_strRXData+=temp1;
UpdateData(FALSE); //更新编辑框内容
}
/////////////////////////////////////////////////////////////////
//若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1////
////////////////////////////////////////////////////////////////
char CSampleDlg::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 CSampleDlg::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 CSampleDlg::comsend(CString m_sendms)
{
if(m_COM.GetPortOpen())
{
CByteArray hexdata;
int len=String2Hex(m_sendms,hexdata); //此处返回的len可以用于计算发送了多少个十六进制数
m_COM.SetOutput(COleVariant(hexdata)); //发送十六进制数
}
else
{
::AfxMessageBox("请先打开串行口");
}
}
/////////////////////////////////////////
//////////接收数据函数/////////////////////
/////////////////////////////////////////
CString CSampleDlg::receive()
{
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组
CString strtemp;
CString temp;
if(m_COM.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{
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型数组
temp="";
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%02X",bt); //将字符以十六进制方式送入临时变量strtemp存放
temp+=strtemp; //加入接收编辑框对应字符串
}
}
return temp;
}
///////////////////////////////////////////////////////////////////
////////////////////////////////////延时程序////////////////////////
////////////////////////////////////////////////////////////////////
void CSampleDlg::timedelay(double i)
{
DWORD dwStart = GetTickCount();
DWORD dwEnd = dwStart;
do{ MSG msg;
GetMessage(&msg,NULL,0,0);
TranslateMessage(&msg);
DispatchMessage(&msg);
dwEnd = GetTickCount();
}
while((dwEnd-dwStart)<=i);
}
//////////////////////////////////////////////////////////////
//////////////////CString 类型16进制转化为整型////////////////
//////////////////////////////////////////////////////////////
int CSampleDlg::strHexToInt(CString strTemp)
{
int nTemp=0;
for(int i = 0; i<(int)::strlen(strTemp); i++)
{
int nDecNum;
switch(strTemp[i])
{
case 'a':
case 'A': nDecNum = 10; break;
case 'b':
case 'B': nDecNum = 11; break;
case 'c':
case 'C': nDecNum = 12; break;
case 'd':
case 'D': nDecNum = 13; break;
case 'e':
case 'E': nDecNum = 14; break;
case 'f':
case 'F': nDecNum = 15; break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9': nDecNum = strTemp[i] - '0'; break;
default: return 0;
}
nTemp += nDecNum * (int)::pow(16,::strlen(strTemp)-i -1);
}
return nTemp;
}
///////////////发送正转命令//////////////
void CSampleDlg::Onzhengzhuan()
{
m_quxian.AppendPoint(0);
comsend("EF"); //发送EF
timedelay(30); //延时
comsend("AA"); //索取转速
m_zhuanxiang="正转";//设置状态
UpdateData(FALSE); //更新编辑框内容
}
///////////////发送停止命令//////////////
void CSampleDlg::Ontingzhi()
{
comsend("EE");//发送EE
timedelay(30);//延时
comsend("AA"); //索取转速
m_zhuanxiang="停止";//设置状态
UpdateData(FALSE); //更新编辑框内容
}
///////////////发送反转命令//////////////
void CSampleDlg::Onfanzhuan()
{
m_quxian.AppendPoint(0);
comsend("ED");//发送ED
timedelay(30);//延时
comsend("AA");//索取转速
m_zhuanxiang="反转";//设置状态
UpdateData(FALSE); //更新编辑框内容
}
///////////////发送加速命令//////////////
void CSampleDlg::Onjiasu()
{
comsend("EB");//发送EB
timedelay(30);//延时
comsend("AA");//索取转速
}
///////////////发送减速命令//////////////
void CSampleDlg::Onjiansu()
{
comsend("EC");//发送EC
timedelay(30);//延时
comsend("AA");//索取转速
}
////////////端口测试///////////////
void CSampleDlg::Onduankou()
{
if(m_COM.GetPortOpen())
{
::AfxMessageBox("串口工作正常");
}
else
::AfxMessageBox("请先设置端口参数");
}
////////////////发送手动命令//////////////
void CSampleDlg::Onfasong()
{
if(m_COM.GetPortOpen())
{
UpdateData();
comsend(m_mingling);
}
else
::AfxMessageBox("请先打开端口");
}
/////////跳出直流电机参数设置对话框/////////
void CSampleDlg::Ondianjicanshu()
{
CMyDlg1 dlg1;
dlg1.DoModal();
}
//////////跳出温度控制参数设置对话框//////////
void CSampleDlg::Onweducanshu()
{
CMyDlg2 dlg2;
dlg2.DoModal();
}
/////////////跳出关于对话框///////////
void CSampleDlg::Onguanyu()
{
CAboutDlg about;
about.DoModal();
}
//////////退出程序////////////////////
void CSampleDlg::Onlikai()
{
DestroyWindow();
}
/////////直流电机控制反转命令///////////
void CSampleDlg::Onfanzhuan1()
{
::AfxMessageBox("请先设置电机参数");
}
/////////直流电机控制减速命令///////////
void CSampleDlg::Onjiansu1()
{
::AfxMessageBox("请先设置电机参数");
}
/////////直流电机控制正转命令///////////
void CSampleDlg::Onzhenzhuan1()
{
::AfxMessageBox("请先设置电机参数");
}
/////////直流电机控制停止命令///////////
void CSampleDlg::Ontingzhi1()
{
::AfxMessageBox("请先设置电机参数");
}
/////////直流电机控制加速命令///////////
void CSampleDlg::Onjiasu1()
{
::AfxMessageBox("请先设置电机参数");
}
/////////温度控制降温命令///////////
void CSampleDlg::Onjiangwen1()
{
::AfxMessageBox("请先设置温度控制参数");
}
/////////温度控制升温命令///////////
void CSampleDlg::Onshenwen1()
{
::AfxMessageBox("请先设置温度控制参数");
}
/////////温度控制升温命令///////////
void CSampleDlg::Onshengwen()
{
::AfxMessageBox("请先设置温度控制参数");
}
/////////温度控制降温命令///////////
void CSampleDlg::Onjiangwen()
{
::AfxMessageBox("请先设置温度控制参数");
}
//////////////////////画图命令///////////////////
/////////////////////////////////////////////////
void CSampleDlg::Onhuatu()
{
if(m_zhuangtai==TRUE) //按钮状态为"画图"
{
m_quxian.Reset(); //画图清屏
SetTimer(1,1000,NULL);//启动定时器画图
m_zhuangtai=FALSE; //设置按钮状态
GetDlgItem(IDC_huatu)->SetWindowText("停止");//更新按钮名称
}
else
{
KillTimer(1); //关闭定时器
m_zhuangtai=TRUE; //设置按钮状态
GetDlgItem(IDC_huatu)->SetWindowText("画图"); //更新按钮状态
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -