VS2008串口控件操作

来源:互联网 发布:vscode 字体设置 编辑:程序博客网 时间:2024/06/08 07:53

  通常情况,需要先注册串口控件,然后是    工具箱右键菜单 --》选择项--》COM组件--》Microsoft Communication Control,version

   1   可能用到的变量

        CMSComm m_ctrlComm;
       CComboBox m_comList;


       CString   m_strRXData;
       CString   m_strTXData;


   2   列举系统所有串口

       

void CSCommTestDlg::EnumPort(CComboBox * CmboBoxPort)  {      HKEY hKey = NULL;        long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Hardware\\DeviceMap\\SerialComm",0,KEY_READ,&hKey);    //打开注册表      if( lRet != ERROR_SUCCESS )      {          MessageBox("无法找到串口!");          return;      }        DWORD i = 0;                            //键值序号      char cValueName[_MAX_PATH];             //键值名称      DWORD nValueNameSize = _MAX_PATH;       //键值名称长度      DWORD ValueType;                        //键值类型      BYTE bValueData[_MAX_PATH];             //键值数值      DWORD nValueDataSize = _MAX_PATH;       //键值数值长度      do      {          DWORD nValueNameSize = _MAX_PATH;   //重置键值名称长度          DWORD nValueDataSize = _MAX_PATH;   //重置键值数值长度            lRet = RegEnumValue(hKey, i, cValueName, &nValueNameSize, 0, &ValueType, bValueData, &nValueDataSize);  //枚举键值          if(lRet == ERROR_SUCCESS)          {              CmboBoxPort->AddString((LPCTSTR)bValueData); //将串口号添加至组合框的列表中          }          i++;      }while(lRet == ERROR_SUCCESS);          //读取完毕后退出循环  }  

 3  打开串口

     

void CSCommTestDlg::OnCbnSelchangeCombo1(){int portNum=0;if(m_comList.GetCurSel()>=0){     portNum=m_comList.GetCurSel()+1;if(m_ctrlComm.GetPortOpen())m_ctrlComm.SetPortOpen(FALSE);m_ctrlComm.SetCommPort(portNum);//选择comif( !m_ctrlComm.GetPortOpen())m_ctrlComm.SetPortOpen(TRUE);//打开串口else    { AfxMessageBox("串口打开失败!"); return ;     }m_ctrlComm.SetSettings("9600,n,8,1");//波特率9600,无校验,8个数据位,1个停止位m_ctrlComm.SetInputMode(1);m_ctrlComm.SetRThreshold(1); //参数1表示每当串口接收缓冲区中//有多于或等于1个字符时将引发一                                        //个接收数据的OnComm事件m_ctrlComm.SetInputLen(0);//设置当前接收区数据长度为0m_ctrlComm.GetInput();//先预读缓冲区以清除残留数据CString str("");m_comList.GetLBText(m_comList.GetCurSel(),str);SetWindowText(str); AfxMessageBox("串口打开成功!");}}

  4   发送数据

      

void CSCommTestDlg::OnButtonManualsend() {// TODO: Add your control notification handler code hereUpdateData(TRUE); //读取编辑框内容m_ctrlComm.SetOutput(COleVariant(m_strTXData));//发送数据m_strTXData="";UpdateData(FALSE); //清空编辑框内容}

5  接收数据

  

void CSCommTestDlg::OnComm() {// TODO: Add your control notification handler code hereVARIANT variant_inp;COleSafeArray safearray_inp;LONG len,k;BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.CString strtemp;if(m_ctrlComm.GetCommEvent()==2)     //事件值为2表示接收缓冲区内有字符{variant_inp=m_ctrlComm.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型变量{BYTE bt=*(char*)(rxdata+k);      //字符型strtemp.Format("%c",bt);         //将字符送入临时变量strtemp存放m_strRXData+=strtemp;    //加入接收编辑框对应字符串    }}UpdateData(FALSE);           //更新编辑框内容}

0 0