【用MFC写串口调试助手】

发布时间:2026/7/15 14:02:03

【用MFC写串口调试助手】 用MFC写串口调试助手界面设计各控件说明串口控件的插入程序设计初始化函数添加串口检测按钮相关函数打开按钮相关函数发送数据按钮相关函数点选定时发送复选框点选HEX发送复选框相关函数点选HEX接收复选框相关函数清空接收区按钮相关函数清空发送区按钮相关函数关闭串口按钮相关函数完整程序.cpp文件.h文件Resource.h文件界面设计各控件说明IDTypeMember说明IDC_BUTTON_SERCHSEL检测串口按钮IDC_BUTTON_OPENSEL打开串口按钮IDC_BUTTON_CLOSESEL关闭串口按钮IDC_BUTTON_CLEARGETDATA清空接收区按钮IDC_BUTTON_SENDDATA发送数据按钮IDC_BUTTON_CLEARSENDDATA清空发送区按钮IDC_COMBO_CHOOSESELCComboBoxm_COMBO_ChooseSel串口选择下拉框IDC_COMBO_BOTRATCComboBoxm_COMBO_BotRat波特率选择下拉框IDC_COMBO_DABITCComboBoxm_COMBO_DaBit数据位选择下拉框IDC_COMBO_CKBITCComboBoxm_COMBO_CkBit校验位选择下拉框IDC_COMBO_STOPBITCComboBoxm_COMBO_StopBit停止位选择下拉框IDC_CHECK_SENDDATATIMEBOOLm_SendDataTime定时发送复选框IDC_CHECK_GETHEXDATABOOLm_GetHexDataHEX接收复选框IDC_CHECK_SENDHEXDATABOOLm_SendHexDataHEX发送复选框IDC_EDIT_GETDATACStringm_EDIT_GetData显示接收数据编辑框IDC_EDIT_GETDATABATECStringm_EDIT_GetDataBate显示已接收数据长度编辑框IDC_EDIT_SENDDATACStringm_EDIT_SendData显示发送数据编辑框IDC_EDIT_SENDDATABATECStringm_EDIT_SendDataBate显示已发送数据长度编辑框IDC_EDIT_SENDDATATIMEintm_EDIT_SendDataTime设置定时发送时间编辑框IDC_MSCOMMCMSCommm_Comm串口控件串口控件的插入在页面设计界面点击鼠标右键,选择插入ActiveX控件…,在弹出的界面选择Microsoft Communications Control, Version 5…,点击确定进行串口控件的插入。若出现Active X控件不能例示可到网上下载MSDATGRD.OCX和MSADODC.OCX两个文件,注册一下就好了,具体步骤如下:1.先下载这两个文件使用说明:如果是64位系统:请分别将MSADODC.OCX放入C:\Windows\SysWOW64目录下MSDATGRD.OCX放入C:\Windows\System32目录下如果是32位系统:请将MSADODC.OCX和MSDATGRD.OCX都放入C:\Windows\System32目录下2.对文件进行注册按win+r开打“运行”对话框,输入"cmd",打开命令提示符,输入"regsvr32 C:\Windows\SysWOW64\MSADODC.OCX"命令注册MSADODC.OCX输入"regsvr32 C:\Windows\System32\MSDATGRD.OCX"命令注册MSDATGRD.OCX再次打开工程文件,现在是不是已经可以正常使用了。若还是无法运行便可此文件进行注册表注册 注册表。程序设计初始化函数添加// TODO: Add extra initialization here// 波特率设置m_COMBO_BotRat.AddString(_T("110"));m_COMBO_BotRat.AddString(_T("300"));m_COMBO_BotRat.AddString(_T("600"));m_COMBO_BotRat.AddString(_T("1200"));m_COMBO_BotRat.AddString(_T("2400"));m_COMBO_BotRat.AddString(_T("4800"));m_COMBO_BotRat.AddString(_T("9600"));m_COMBO_BotRat.AddString(_T("11400"));m_COMBO_BotRat.AddString(_T("19200"));m_COMBO_BotRat.AddString(_T("38400"));m_COMBO_BotRat.AddString(_T("56000"));m_COMBO_BotRat.AddString(_T("57600"));m_COMBO_BotRat.AddString(_T("115200"));m_COMBO_BotRat.AddString(_T("128000"));m_COMBO_BotRat.AddString(_T("256000"));m_COMBO_BotRat.SetCurSel(6);// 数据位设置for(inti=5;i=8;i++){CString strBit;strBit.Format("%d",i);m_COMBO_DaBit.AddString(strBit);}m_COMBO_DaBit.SetCurSel(3);// 检验位设置m_COMBO_CkBit.AddString(_T("NONE"));m_COMBO_CkBit.AddString(_T("ODD"));m_COMBO_CkBit.AddString(_T("EVEN"));m_COMBO_CkBit.AddString(_T("MARK"));m_COMBO_CkBit.AddString(_T("SPACE"));m_COMBO_CkBit.SetCurSel(0);// 停止位设置m_COMBO_StopBit.AddString(_T("1"));m_COMBO_StopBit.AddString(_T("1.5"));m_COMBO_StopBit.AddString(_T("2"));m_COMBO_StopBit.SetCurSel(0);SendDataTimeState=0;GetHexDataState=0;SendHexDataState=0;OnButtonSerchsel();// 串口检测函数串口检测按钮相关函数CUIntArray ports;//所有存在的串口CUIntArray portse;//可用的串口CUIntArray portsu;//已占用的串口#defineMAX_SCAN_CNT128voidCSerial_DemoDlg::OnButtonSerchsel(){// TODO: Add your control notification handler code hereUpdateData(TRUE);unsignedshortcom_cnt;while(m_COMBO_ChooseSel.DeleteString(0)=0);com_cnt=AddCom(m_COMBO_ChooseSel);if(com_cnt){m_COMBO_ChooseSel.DeleteString(com_cnt+1);m_COMBO_ChooseSel.SetCurSel(0);}UpdateData(FALSE);}voidCSerial_DemoDlg::EnumerateSerialPorts(CUIntArrayporta,CUIntArrayportse,CUIntArrayportsu){//清除串口数组内容porta.RemoveAll();portse.RemoveAll();portsu.RemoveAll();//因为至多有255个串口,所以依次检查各串口是否存在//如果能打开某一串口,或打开串口不成功,但返回的是 ERROR_ACCESS_DENIED错误信息,//都认为串口存在,只不过后者表明串口已经被占用//否则串口不存在for(inti=1;iMAX_SCAN_CNT;i++){//形成原始设备名称CString sPort;sPort.Format(_T("\\\\.\\COM%d"),i);//尝试打开该端口BOOL bSuccess=FALSE;HANDLE hPort=::CreateFile(sPort,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);if(hPort==INVALID_HANDLE_VALUE){DWORD dwError=GetLastError();if(dwError==ERROR_ACCESS_DENIED){bSuccess=TRUE;portsu.Add(i);//已占用的串口}}else{//该端口已成功打开bSuccess=TRUE;portse.Add(i);//可用串口//不要忘记关闭端口,因为我们不会对它做任何事情CloseHandle(hPort);}//将端口号添加到将要返回的数组中if(bSuccess)porta.Add(i);//所有存在的串口}}UShortCSerial_DemoDlg::AddCom(CComboBox*pvect){UShort uicounter;//串口数量UShort uisetcom;CString str;EnumerateSerialPorts(ports,portse,portsu);//获得可用串口数//获取可用串口个数uicounter=portse.GetSize();//如果个数大于0if(uicounter0){//初始化串口列表框for(inti=0;iuicounter;i++){uisetcom=portse.ElementAt(i);str.Format(_T("COM%d "),uisetcom);pvect-InsertString(i,str);}}returnuicounter;}打开按钮相关函数voidCSerial_DemoDlg::OnButtonOpensel(){// TODO: Add your control notification handler code hereDWORD nCommPort;nCommPort=(unsigned)GetCommPortN();// 获取串口号CString strPara=GetCommPortParameter();if(strPara.GetLength()=0)MessageBox(_T("参数获取错误!"),_T("Error"),MB_ICONERROR|MB_OK);char*pszPara=strPara.GetBuffer(0);strPara.ReleaseBuffer();// 打开串口if(m_Comm.GetPortOpen())MessageBox(_T("串口已打开",_T("Warning"),MB_ICONWARNING|MB_OK));m_Comm.SetCommPort(nCommPort);// 选择串口号m_Comm.SetInBufferSize(1024);// 设置输入缓冲区的大小,Bytesm_Comm.SetOutBufferSize(1024);// 设置输入缓冲区的大小,Bytes//m_Comm.SetSettings(strPara);m_Comm.SetInputMode(1);// 1:表示以二进制方式检取数据m_Comm.SetRThreshold(1);// 参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnOnCommMscomm事件m_Comm.SetInputLen(0);// 设置当前接收区数据长度为0if(!m_Comm.GetPortOpen()){m_Comm.SetPortOpen(TRUE);GetDlgItem(IDC_BUTTON_OPENSEL)-EnableWindow(FALSE);GetDlgItem(IDC_BUTTON_CLOSESEL)-EnableWindow(TRUE);}elseAfxMessageBox("cannot open serial port");m_Comm.GetInput();//先预读缓冲区以清除残留数据UpdateData(false);}longCSerial_DemoDlg::GetCommPortN()// 获取COMBO BOX上的串口编号{CString strCommPort;m_COMBO_ChooseSel.GetWindowText(strCommPort);strCommPort=strCommPort.Mid(3);return_ttol(strCommPort);}CStringCSerial_DemoDlg::GetCommPortParameter()// 获取串口参数{CString strParameter="";CString strBaudRate;// 波特率CString strDataBit;// 数据位CString strCheckBit;// 校验位CString strStopBit;// 停止位m_COMBO_BotRat.GetWindowText(strBaudRate);m_COMBO_CkBit.GetWindowText(strCheckBit);m_COMBO_DaBit.GetWindowText(strDataBit);m_COMBO_StopBit.GetWindowText(strStopBit);strCheckBit=strCheckBit.Left(1);strCheckBit.MakeLower();strParameter+=strBaudRate;strParameter+=_T(",");strParameter+=strCheckBit;strParameter+=_T(",");strParameter+=strDataBit;strParameter+=_T(",");strParameter+=strStopBit;returnstrParameter;}voidCSerial_DemoDlg::OnOnCommMscomm()// 该函数可在类向导中ID选择IDC_MSCOMM,Messages选择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_Comm.GetCommEvent()==2)//事件值为2表示接收缓冲区内有字符{variant_inp=m_Comm.GetInput();//读缓冲区safearray_inp=variant_inp;//VARIANT型变量转换为ColeSafeArray型变量len=0;len=safearray_inp.GetOneDimSize();//得到有效数据长度for(k=0;klen;k++)safearray_inp.

相关新闻