计算机控制工程实验三报告实验三TTY字符发送程序一、功能描述TTY发送程序,在用户在主界面窗口中键入ASCII字符时,字符将通过串口发送到“实验二”TTY接受程序。“串口号”、“波特率”以及“奇偶校验类型”可以设置。要求:1.采用WinAPI编程实现。2.基于VC++“单文档应用程序”模板实现。注意:基类选择“CEditView”。二、实验环境1.MicrosoftVisualstudio2012;2.VSPD6.9虚拟串口软件三、界面设计1.主界面设计以CeditView为基类创建视图窗口。并编辑菜单属性。2.设置对话框界面设计主要完成对“端口”、“波特率”、“校验类型”的设置。四、变量声明1、在View类头文件(CMFCApplication3View.h)中声明如下成员变量及相应头文件。HANDLEhCom;//串口句柄OVERLAPPEDWol;//写操作OVERLAPPED结构变量BYTEmyWByte[300];//存放欲写数据longdataWLen;//发送数据的长度SetupDlgmySetupDlg;//声明设置对话框实例LPCSTRmyCom;//串口名称BYTEmyParity;//奇偶校验类型DWORDmyfParity;//是否使用奇偶校验DWORDmyBaudRate;//通信波特率boolblnOpened;//串口已经打开标志intm_delay;//延迟发送时间同时包含#includeSetupDlg.h头文件2、利用“ClassWizard”创建设置对话框控件成员变量五、打开串口CStringstrDis;hCom=CreateFile(myCom,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);if(hCom!=INVALID_HANDLE_VALUE){SetupComm(hCom,1024,512);DCBmyDCB;GetCommState(hCom,&myDCB);myDCB.BaudRate=myBaudRate;myDCB.fBinary=true;myDCB.fParity=myfParity;myDCB.ByteSize=8;myDCB.Parity=myParity;myDCB.StopBits=ONESTOPBIT;SetCommState(hCom,&myDCB);AfxMessageBox(串口打开成功);blnOpened=true;}else{AfxMessageBox(串口打开失败);blnOpened=false;}六、关闭串口在主界面“关闭串口”菜单项,在事件处理代码中添加:if((blnOpened)&&(hCom!=NULL)){CloseHandle(hCom);AfxMessageBox(串口已经关闭);blnOpened=false;}else{AfxMessageBox(串口未打开);}七、设置串口在主界面“设置”菜单项事件处理函数中打开“设置”对话框,对通信参数进行设置。voidCMFCApplication3View::OnSetupcom(){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:{myfParity=true;myParity=ODDPARITY;strStatus+=O;break;}case2:{myfParity=true;myParity=EVENPARITY;strStatus+=E;break;}default:break;}strStatus+=,8,1;CMainFrame*m_pGetFrame=(CMainFrame*)AfxGetApp()-m_pMainWnd;strStatus=TTY发送程序-+strStatus;m_pGetFrame-SetWindowText(strStatus);}}八、发送字符在View类“OnChar”事件中发送键入字符。voidCMFCApplication3View::OnChar(UINTnChar,UINTnRepCnt,UINTnFlags){//TODO:在此添加消息处理程序代码和/或调用默认myWByte[0]=nChar;dataWLen=1;Wol.Internal=0;Wol.InternalHigh=0;Wol.Offset=0;Wol.OffsetHigh=0;Wol.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);WriteFile(hCom,&myWByte,dataWLen,NULL,&Wol);Beep(1000,10);CEditView::OnChar(nChar,nRepCnt,nFlags);}九、命令的有效性处理“设置”、“打开串口”、“关闭串口”、“退出”命令有效性处理。以“设置”为例子说明:voidCMFCApplication3View::OnUpdateSetupcom(CCmdUI*pCmdUI){//TODO:在此添加命令更新用户界面处理程序代码if(!blnOpened){pCmdUI-Enable(true);}else{pCmdUI-Enable(false);}}十、定时器的设置添加定时器菜单按钮改变自动发送的定时时间:通过类向导添加事件处理函数:voidCMFCApplication3View::OnDelay(){//TODO:在此添加命令处理程序代码m_delay=rand()%1000;//随机产生一秒以内的定时时间}添加自动发送按钮:添加事件处理程序:voidCMFCApplication3View::OnAutosend(){//TODO:在此添加命令处理程序代码KillTimer(1);//关闭之前的定时器SetTimer(1,m_delay,NULL);//以m_delay的定时时间打开定时器}添加WM_TIMER消息响应函数:voidCMFCApplication3View::OnTimer(UINT_PTRnIDEvent){//TODO:在此添加消息处理程序代码和/或调用默认值Wol.Internal=0;Wol.InternalHigh=0;Wol.Offset=0;Wol.OffsetHigh=0;dataWLen=1;staticinti=0;myWByte[0]=48+i;if(i10)//自动发送0-9到接收端{Wol.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);WriteFile(hCom,myWByte,1,NULL,&Wol);Beep(1000,10);i++;}else{KillTimer(nIDEvent);//发送完毕关闭定时器i=0;}CEditView::OnTimer(nIDEvent);}十一、实验二、三联调自动发送