MFC自动搜索串口编程

来源:互联网 发布:汽车资源软件下载 编辑:程序博客网 时间:2024/06/11 01:32

参照下面博客的方法实现了串口通信,但是博文里的串口需要事先知道自己所用所用串口,然后在COM口下拉列表里选择对应的,不是 很方便,然后参考网上的资料加了自动搜索串口的功能

http://blog.csdn.net/a_runing_man/article/details/9947343

功能的实现:

首先注释掉上面博文里的

 //int nSel;   //   nSel = m_comboCom.GetCurSel();//获取组合框控件的列表框中选中项的索引   //  //   m_ctrlComm.put_CommPort(nSel+1);//选择串口号(这里因为列表框的索引号是从0开始,所以(nSel+1)对应的才是我们所选的串口号)   //   m_ctrlComm.put_PortOpen(TRUE);//打开串口   //   m_ctrlComm.put_RThreshold(2);//收到两个字节引发OnComm事件    //   m_ctrlComm.put_InputMode(1);//输入模式选为二进制    //   m_ctrlComm.put_Settings(_T("9600,n,8,1"));//设置串口参数,波特率,无奇偶校验,位停止位,位数据位   //   m_ctrlComm.put_InputMode(1);  // 以二进制方式检取数据    //   m_ctrlComm.put_RThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件    //   m_ctrlComm.put_InputLen(0); //设置当前接收区数据长度为0    //   m_ctrlComm.get_Input();//先预读缓冲区以清除残留数据     //  //   m_setOk = true;     //标记串口设置OK  
然后加个Button按钮,改为打开按钮,添加事件处理程序程序
CString strChoosed;    int i;    m_comboCom.GetLBText(m_comboCom.GetCurSel(),strChoosed);char data=strChoosed.GetAt (3);    i = atoi(&data);    m_ctrlComm.put_CommPort(i);//选择串口号(这里因为列表框的索引号是从0开始,所以(nSel+1)对应的才是我们所选的串口号)      m_ctrlComm.put_PortOpen(TRUE);//打开串口      m_ctrlComm.put_RThreshold(2);//收到两个字节引发OnComm事件       m_ctrlComm.put_InputMode(1);//输入模式选为二进制       m_ctrlComm.put_Settings(_T("9600,n,8,1"));//设置串口参数,波特率,无奇偶校验,位停止位,位数据位      m_ctrlComm.put_InputMode(1);  // 以二进制方式检取数据       m_ctrlComm.put_RThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件       m_ctrlComm.put_InputLen(0); //设置当前接收区数据长度为0       m_ctrlComm.get_Input();//先预读缓冲区以清除残留数据          m_setOk = true;     //标记串口设置OK  m_ctrlComm.put_PortOpen(false);//打开串口  
最后在添加个函数void GetCOM(void),这里111是我自己建的工程
void CMy111Dlg::GetCOM(void){    //程序启动时获取全部可用串口    HANDLE  hCom;    int i,num,k;    CString str;    BOOL flag;        ((CComboBox *)GetDlgItem(IDC_COMBO1))->ResetContent();    flag = FALSE;    num = 0;    for (i = 1;i <= 16;i++)    {//此程序支持16个串口        str.Format("\\\\.\\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_COMBO1))->AddString(str);            if (flag == FALSE)            {                flag = TRUE;                num = i;            }        }    }    i = ((CComboBox *)GetDlgItem(IDC_COMBO1))->GetCount();    if (i == 0)    {//若找不到可用串口则禁用“打开串口”功能        ((CComboBox *)GetDlgItem(IDC_COMBO1))->EnableWindow(FALSE);    }    else    {        k = ((CComboBox *)GetDlgItem((IDC_COMBO1)))->GetCount();        ((CComboBox *)GetDlgItem(IDC_COMBO1))->SetCurSel(k - 1);    }}

最后在初始化对话框函数OnInitDialog()里加上GetCOM()即可,最后如图所示运行后自动选择串口,只需点击打开串口就能实现通信了


原创粉丝点击