环境VS2008
BOOL XXXDlg::OnInitDialog()
{
// TODO: 在此添加额外的初始化代码
GetCom();
int nselect=m_ctrlComoboComPort.GetCurSel()+1;
m_MSComm1.put_CommPort(short(nselect));
·
·
·
·
}
void CXXXXDlg::GetCom()//程序启动时获取全部可用串口
{
HANDLE hCom;
int i,num,k;
CString str;
BOOL flag;
((CComboBox *)GetDlgItem(IDC_COMBO_ComPort))->ResetContent();
flag = FALSE;
num = 0;
for (i = 1;i <= 16;i++)
{//此程序支持16个串口
str.Format(_T("\\\\.\\COM%d"),i);
hCom = CreateFile(str, 0, 0, 0,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if(INVALID_HANDLE_VALUE != hCom )
{//能打开该串口,则添加该串口
CloseHandle(hCom);
str = str.Mid(4);
((CComboBox *)GetDlgItem(IDC_COMBO_ComPort))->AddString(str);
if (flag == FALSE)
{
flag = TRUE;
num = i;
}
}
}
i = ((CComboBox *)GetDlgItem(IDC_COMBO_ComPort))->GetCount();
if (i == 0)
{//若找不到可用串口则禁用“打开串口”功能
((CComboBox *)GetDlgItem(IDC_COMBO_ComPort))->EnableWindow(FALSE);
}
else
{
k = ((CComboBox *)GetDlgItem((IDC_COMBO_ComPort)))->GetCount();
((CComboBox *)GetDlgItem(IDC_COMBO_ComPort))->SetCurSel(k - 1);
}
}
void CXXXXDlg::OnBnClickedButtonOpencomm()//打开串口按钮控件响应事件
{
// TODO: 在此添加控件通知处理程序代码
m_ctrlComoboBaudRate.GetCurSel();
m_ctrlComoboDataBit.GetCurSel();
m_ctrlComoboStopBit.GetCurSel();
m_ctrlComoboParityBit.GetCurSel();
UpdateData(TRUE);
CString strTmp;
m_ctrlComoboComPort.GetWindowText(strTmp);
if (!m_MSComm1.get_PortOpen())
{
m_MSComm1.put_PortOpen(TRUE);
m_MSComm1.put_RThreshold(1);
m_MSComm1.put_InputLen(0); //设置当前接受缓冲区的中的字节长度为0,清除当前接受缓冲区的内容
m_MSComm1.get_Input(); //先预读缓冲区以清楚残留数据
if (m_MSComm1.get_PortOpen())
{
AfxMessageBox(_T("打开") +strTmp+ _T("成功!"));
m_ctrlBmpPortStatus.SetIcon(m_hIconOn);
}
else AfxMessageBox (_T("串口")+strTmp+_T("打开失败"));
m_ctrlButtonOpenCom.SetWindowText(_T("关闭串口"));
}
else
{
m_MSComm1.put_PortOpen(FALSE);
m_ctrlButtonOpenCom.SetWindowText(_T("打开串口"));
m_ctrlBmpPortStatus.SetIcon(m_hIconOff);
}
}