TTY字符接受程序一、功能描述接受方接受发送方发送的字符,并显示。可以传送字符包括可见英文字符(ASCII码32~126)和回车符。要求:,1.采用MSComm控件实现(事件驱动方式)。2.采用WinAPI方式,多线程(子线程检测事件,主线程显示),事件驱动方式,自定义消息二、采用MSCommTTY接受界面设计1.主界面设计添加4个Button,一个EditControl,三个StaticText控件。设置Caption。2.通信界面设计添加3个StaticText,3个ComboBox控件。设置Caption。添加ComboBox的data值。如通信端口添加COM1;COM2;COM3;等。变量声明声明主界面成员变量和设置对话框的成员变量。1、在主对话框类头文件中声明设置对话框实例、串口号、奇偶校验类型以及波特率,并包含相应头文件保证编译通过;CMSCommm_Comm;//串口控件对象CSetupDlgm_SetupDlg;//设置对话框对象BYTEm_Com;//端口号CStringm_BaudRate;//波特率CStringm_Parity;//校验类型2、利用“ClassWizard”创建主对话框及设置对话框控件变量。如图所示添加相应控件变量。更改对应变量类型和类别。创建串口控件加载后,在主对话框OnInitDialog消息处理函数中创建串口。BOOLCtest22Dlg::OnInitDialog(){CDialogEx::OnInitDialog();//设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//执行此操作SetIcon(m_hIcon,TRUE);//设置大图标SetIcon(m_hIcon,FALSE);//设置小图标//TODO:在此添加额外的初始化代码DWORDstyle=WS_VISIBLE|WS_CHILD;if(!m_Comm.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1)){AfxMessageBox(创建MSComm控件失败!);m_OpenComm.EnableWindow(false);//使打开串口按钮无效m_CloseComm.EnableWindow(false);//使关闭串口按钮无效m_SetupComm.EnableWindow(false);//使设置按钮无效return-1;}m_Para=COM1,9600,N,8,1;UpdateData(false);returnTRUE;//除非将焦点设置到控件,否则返回TRUE}设置串口“设置”按钮添加点击事件响应函数:voidCtest22Dlg::OnClickedSetupcomm(){//TODO:在此添加控件通知处理程序代码if(m_SetupDlg.DoModal()==IDOK){//打开设置对话框UpdateData(true);//更新数据(从控件-成员变量)m_Com=m_SetupDlg.m_Com+1;//获得端口号doublebaudRate=pow(2,(double)m_SetupDlg.m_BaudRate);baudRate=19200/baudRate;m_BaudRate.Format(%.0f,baudRate);//转化为字符串,得到波特率switch(m_SetupDlg.m_Parity){//获得校验类型case0:{m_Parity=N;break;}case1:{m_Parity=O;break;}case2:{m_Parity=E;break;}}CStringwindowsTitle,temp;//设置窗口标题windowsTitle=COM;temp.Format(%d,m_Com);windowsTitle+=temp;windowsTitle+=,;windowsTitle+=m_BaudRate;windowsTitle+=,;windowsTitle+=m_Parity;windowsTitle+=,8,1;m_Para=windowsTitle;UpdateData(false);//更新控件内容(从成员变量-控件)}}打开串口“打开串口”按钮添加点击事件处理函数“:voidCtest22Dlg::OnClickedOpencomm(){//TODO:在此添加控件通知处理程序代码CStringstrPara;//串口参数m_Comm.put_CommPort(m_Com);//指定串口号strPara=m_BaudRate;strPara+=,;strPara+=m_Parity;strPara+=,8,1;m_Comm.put_Settings(strPara);//通信参数设置m_Comm.put_InBufferSize(1024);//指定接收缓冲区大小m_Comm.put_InBufferCount(0);//清空接收缓冲区m_Comm.put_InputMode(1);//设置数据获取方式,二进制方式m_Comm.put_InputLen(0);//设置每次读取长度,读取整个缓冲区内容m_Comm.put_RThreshold(1);//设置接收OnComm事件门限值,m_Comm.put_PortOpen(1);//打开串口m_OpenComm.EnableWindow(false);//使打开串口按钮无效m_CloseComm.EnableWindow(true);//使关闭串口按钮生效m_SetupComm.EnableWindow(false);//使设置按钮无效AfxMessageBox(串口打开成功!);}关闭串口“关闭串口”按钮添加单击事件处理函数:voidCtest22Dlg::OnClickedClosecomm(){//TODO:在此添加控件通知处理程序代码m_Comm.put_PortOpen(0);//关闭串口AfxMessageBox(串口关闭成功!);m_OpenComm.EnableWindow(true);//使打开串口按钮生效m_CloseComm.EnableWindow(false);//使关闭串口按钮无效m_SetupComm.EnableWindow(true);//使设置按钮生效}接收数据处理在MSComm控件的OnComm事件中接受数据。添加OnComm事件处理函数:voidCtest22Dlg::OnOncommMscomm1(){//TODO:在此处添加消息处理程序代码VARIANTinput1;//定义VARIANT类型变量BYTErxdata[2048];//定义存放二进制数据的数组COleSafeArraysafearray1;//定义COleSafeArray类的实例CStringstrDis,strTemp;switch(m_Comm.get_CommEvent()){case2:input1=m_Comm.get_Input();safearray1=input1;//使用COleSafeArray类的成员函数获取数据长度longlen1=safearray1.GetOneDimSize();for(longk=0;klen1;k++){//使用COleSafeArray成员函数将数据写入数组safearray1.GetElement(&k,rxdata+k);}//收到RThreshold个字符,添加接收处理代码//将接受缓冲区数据放入VARIANT变量;//将VARAIANT变量赋值给COleSafeArray类的实例//使用COleSafeArray类的成员函数获取数据长度//使用COleSafeArray类的成员函数将数据写入数组rxdatafor(longk=0;k1;k++){if(rxdata[k]==13)//回车键{//换行显示m_Display.SetSel(1000000,1000000);m_Display.ReplaceSel(\15\12);UpdateData(false);}else//可见字符{if(rxdata[k]=126&&rxdata[k]=32){strDis+=rxdata[k];m_Display.SetSel(1000000,1000000);m_Display.ReplaceSel(strDis);strDis=;UpdateData(false);}}}}}程序结果展示:三、采用API界面设计:1.主界面,设置参数界面同上:变量声明(主对话框CthreadReceiveDlg.cpp中头部添加声明):CSetupDlgmySetupDlg;//设置对话框对象DWORDmyfParity;//校验标志LPCSTRmyCom;//串口号BYTEmyParity;//校验类型DWORDmyBaudRate;//波特率HANDLEhCom;//串口句柄HANDLEhThreadEvent;//事件线程句柄DWORDThreadProcEvent(LPVOIDpParam);//事件响应函数boolhEventRun;//事件线程函数执行标志HWNDhWnd;//窗口句柄DWORDdwThreadID;//事件线程IDOVERLAPPEDEol={0};//事件线程使用的OVERLAPPED结构OVERLAPPEDRol={0};//读操作使用的OVERLAPPED的结构boolfStopMsg;//事件线程向主线程发送消息标志2、利用“ClassWizard”创建主对话框及设置对话框控件变量(同上)。3、设置串口按钮添加单击事件响应函数(并保存参数到相应变量以便打开串口设置DCB结构时使用)。CStringstrStatus;if(mySetupDlg.DoModal()==IDOK){switch(mySetupDlg.m_Com){case0:{strStatus=COM1;myCom=COM1;break;}case1:{strStatus=COM2;myCom=COM2;break;}case2:{strStatus=COM3;myCom=COM3;break;}case3:{strStatus=COM4;myCom=COM4;break;}case4:{strStatus=COM5;myCom=COM5;break;}case5:{strStatus=COM6;myCom=COM6;break;}}strStatus+=,;switch(mySetupDlg.m_BaudRate){case0:{strStatus+=19200;myBaudRate=CBR_19200;break;}case1:{strStatus+=9600;myBaudRate=CBR_9600;break;}case2:{strStatus+=4800;myBaudRate=CBR_4800;break;}case3:{strStatus+=2400;myBaudRate=CBR_2400;break;}default:break;}strStatus+=,;switch(mySetupDlg.m_Parity){case0:{myfParity=false;myParity=NOPARITY;strStatus+=N;break;}case1:{myParity=ODDPARITY;strStatus+=O;break;}case2:{myParity=EVENPARITY;strStatus+=E;break;}default:break;}strStatus+=,8,1;m_Para=strStatus;//将参数显示在主对话框头部以便观察。UpdateData(false);//更新控件内容(从成员变量-控件)}4.添加打开串口单击事件响应函数。hCom=CreateFile(myCom,GENERIC_READ|GENERIC_WRITE,0,N