{
// TODO: Add your control notification handler code here UpdateData(true);
m_ParityCheck=((CComboBox*)GetDlgItem(IDC_COMBO_ParityCheck))->GetCurSel();//当前选中的行
///*******************************************************************************/
///********************************************************************************/
switch(m_ParityCheck) {
case 1: m_ctrlComm.SetSettings(\ break;
case 2: m_ctrlComm.SetSettings(\ break;
default:m_ctrlComm.SetSettings(\ break; }
//*********************************************************************************//
UpdateData(false); }
此时应将代码段2:提示4中所指的那5个语句前的“//”删除 9、串口添加打开或关闭按钮 以同样的方式添加按钮,并将标题修改为“关闭串口”字样,为此按钮添加处理函数程序代码如下: 代码段8:
void CSCommTestDlg::OnButton1Start() {
//检查是否改变默认的串口值,没有改变m_Index的值是0的,否则则不为0 if(m_Index<0)//串口的默认值没有改变 { switch(m_ctrlComm.GetPortOpen())//点击打开或关闭串口按键时,根据当前串口是否打开进行相应操作 { case 1: /************************************************************** 关闭串口前先将自动发送功能关闭
***************************************************************/
SetDlgItemText(IDC_BUTTON_AutoSend,\自动发送\更改按键指示 KillTimer(1);
/**************************************************************/ //当前串口是打开的则进行关串口操作 m_ctrlComm.SetPortOpen(FALSE);//关闭串口 SetDlgItemText(IDC_BUTTON1,\打开串口\更改按键指示 UpdateData(FALSE);//更新按键状态 break; case 0://当前串口是关闭的则进行开串口操作 m_ctrlComm.SetCommPort(1);//如果要打开串口则应先选择哪个串口 m_ctrlComm.SetPortOpen(TRUE);//打开串口 SetDlgItemText(IDC_BUTTON1,\关闭串口\更改按键指示 UpdateData(FALSE); break; default : AfxMessageBox(\ } }
else//串口的默认值有改变 { switch(m_ctrlComm.GetPortOpen())//点击打开或关闭串口按键时,根据当前串口是否打开进行相应操作 { case 0://当前串口是关闭的则进行开串口操作 m_ctrlComm.SetCommPort(m_Index+1);//如果要打开串口则应先选择哪个串口 m_ctrlComm.SetPortOpen(TRUE);//打开串口 SetDlgItemText(IDC_BUTTON1,\关闭串口\更改按键指示 UpdateData(FALSE);//更新按键状态 break; case 1: /************************************************************** 关闭串口前先将自动发送功能关闭
***************************************************************/ SetDlgItemText(IDC_BUTTON_AutoSend,\自动发送\更改按键指示 KillTimer(1);
/**************************************************************/ //当前串口是打开的则进行关串口操作
m_ctrlComm.SetPortOpen(FALSE); SetDlgItemText(IDC_BUTTON1,\打开串口\ UpdateData(FALSE); break; default : AfxMessageBox(\ } }
if(m_Index<0)
((CComboBox*)GetDlgItem(IDC_COMBO_CommSelect))->SetCurSel(0);//如果没有另外进行串口选择则显示COM1 if(m_BaudRate<0)
((CComboBox*)GetDlgItem(IDC_COMBO_BaudRate_Select))->SetCurSel(0);//如果没有另外进行波特率选择则显示9600 if(m_Date_Select<0)
((CComboBox*)GetDlgItem(IDC_COMBO_Date_Select))->SetCurSel(0);////如果没有另外进行数据位选择则显示8 if(m_StopBit<0)
((CComboBox*)GetDlgItem(IDC_COMBO_StopBit))->SetCurSel(0);//如果没有另外进行停止位选择则显示1 if(m_ParityCheck<0)
((CComboBox*)GetDlgItem(IDC_COMBO_ParityCheck))->SetCurSel(0);//如果没有另外进行校验位选择则显示没有校验位N }
10、添加自动发送功能: A、添加一个“编辑框”控件,此控件用于获取自动发送的时间间隔的,修改其ID为IDC_EDIT_Timer,为其添加一个value类UINT型变量m_Timer B、添加一个“按钮”控件,修改其ID为IDC_BUTTON_AutoSend修改其标题为“自动发送” C、添加一个“按钮”控件,修改其ID为IDC_BUTTON_StopAutoSend修改其标题为“停止自动发送” D、为“自动发送”按钮添加BN_CLICKED处理函数,程序代码如下: 代码段9:
void CSCommTestDlg::OnBUTTONAutoSend() {
UpdateData(TRUE);
if(m_Timer<=0)//判断是否设置自动发送时间间隔 AfxMessageBox(\请设置自动发送时间间隔\
else if(!m_ctrlComm.GetPortOpen())//判断是否打开串口 AfxMessageBox(\请打开串口\ else
{SetDlgItemText(IDC_BUTTON_AutoSend,\自动发送...\更改按键指示 SetTimer(1,m_Timer,NULL);} }
E、为“停止自动发送”按钮添加BN_CLICKED处理函数,程序代码如下: 代码段9:
void CSCommTestDlg::OnBUTTONStopAutoSend() {
// TODO: Add your control notification handler code here
SetDlgItemText(IDC_BUTTON_AutoSend,\自动发送\更改按键指示 KillTimer(1); } F、因为要设置自发送,所以要添加一个Windows定时函数,步骤如下: 进入类向导,Message Maps中的Object IDs中选择CScommTestDlg再选择Messages中的
WM_TIMER,进入TIMER函数后,添加如下程序代码如下:
代码段10:
void CSCommTestDlg::OnTimer(UINT nIDEvent) {
// TODO: Add your message handler code here and/or call default UpdateData(TRUE);
if(m_ctrlHexSend.GetCheck()) {
CByteArray hexdate;
int len=String2Hex(m_strTXData,hexdate);
m_ctrlComm.SetOutput(COleVariant(hexdate)); } else
m_ctrlComm.SetOutput(COleVariant(m_strTXData)); CDialog::OnTimer(nIDEvent); }
11、十六进制数据发送及接收显示
添加一个“复选框”控件,修改ID为IDC_CHECK_HexSend,标题为“HEX发送”,进
入类向导添加control类CButton型变量,变量名为m_ctrlHexSend,然后为为SCommTestDlg类添加以下两个PUBLIC成员函数,在Class view中右击CCommTestDlg选中Add Member Function… 然后在函数类型中输入“int”,在函数描述中输入“String2Hex(CString str, CByteArray &senddate)”然后确定。编辑函数体如下:
代码段11:
int CSCommTestDlg::String2Hex(CString str, CByteArray &senddate) { int hexdate,lowhexdate; int hexdatelen=0; int len=str.GetLength(); senddate.SetSize(len/2); for(int i=0;i { i++; continue; } i++; if(i>=len) break; lstr=str[i]; hexdate=ConvertHexChar(hstr); lowhexdate=ConvertHexChar(lstr); if((hexdate==16)||(lowhexdate==16)) break; else hexdate=hexdate*16+lowhexdate; i++; senddate[hexdatelen]=(char)hexdate; hexdatelen++; } senddate.SetSize(hexdatelen); return hexdatelen; } 再添加别一个CCommTestDlg添加两个成员函数,在函数类型中输入“char”,在函数描述中输入“ConvertHexChar(char ch)”然后确定。编辑函数体如下: 代码段12: char CSCommTestDlg::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); }