版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、TTY字符接受程序一、功能描述接受方接受发送方发送的字符,并显示。可以传送字符包括可见英文字符(ASCII码32126)和回车符。要求:,1. 采用MSComm控件实现(事件驱动方式)。2. 采用WinAPI方式,多线程(子线程检测事件,主线程显示),事件驱动方式,自定义消息二、采用MSCommTTY接受界面设计1. 主界面设计添加4个Button,一个Edit Control,三个Static Text控件。设置Caption。2. 通信界面设计添加3个Static Text,3个Combo Box控件。设置Caption。添加Combo Box 的data值。如通信端口添加COM1;COM
2、2;COM3;等。变量声明声明主界面成员变量和设置对话框的成员变量。1、 在主对话框类头文件中声明设置对话框实例、串口号、奇偶校验类型以及波特率,并包含相应头文件保证编译通过;CMSComm m_Comm;/ 串口控件对象CSetupDlg m_SetupDlg;/ 设置对话框对象BYTE m_Com;/ 端口号CString m_BaudRate;/ 波特率CString m_Parity;/ 校验类型2、 利用“ClassWizard”创建主对话框及设置对话框控件变量。如图所示添加相应控件变量。更改对应变量类型和类别。创建串口控件加载后,在主对话框OnInitDialog消息处理函数中创建
3、串口。BOOL Ctest22Dlg:OnInitDialog()CDialogEx:OnInitDialog();/ 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动/ 执行此操作SetIcon(m_hIcon, TRUE);/ 设置大图标SetIcon(m_hIcon, FALSE);/ 设置小图标/ TODO: 在此添加额外的初始化代码DWORD style=WS_VISIBLE|WS_CHILD;if (!m_Comm.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1)AfxMessageBox("创建MSComm
4、控件失败!");m_OpenComm.EnableWindow(false);/使打开串口按钮无效m_CloseComm.EnableWindow(false);/使关闭串口按钮无效m_SetupComm.EnableWindow(false);/使设置按钮无效return -1;m_Para="COM1,9600,N,8,1"UpdateData(false);return TRUE; / 除非将焦点设置到控件,否则返回 TRUE设置串口 “设置”按钮添加点击事件响应函数:void Ctest22Dlg:OnClickedSetupcomm()/ TODO: 在
5、此添加控件通知处理程序代码if(m_SetupDlg.DoModal() = IDOK) / 打开设置对话框UpdateData(true); / 更新数据 (从控件->成员变量)m_Com = m_SetupDlg.m_Com+1;/ 获得端口号double baudRate = pow(2, (double)m_SetupDlg.m_BaudRate);baudRate = 19200/baudRate;m_BaudRate.Format("%.0f", baudRate);/ 转化为字符串,得到波特率switch(m_SetupDlg.m_Parity) / 获
6、得校验类型case 0:m_Parity = "N"break;case 1:m_Parity = "O"break;case 2:m_Parity = "E"break;CString windowsTitle, temp;/ 设置窗口标题windowsTitle = "COM"temp.Format("%d", m_Com);windowsTitle += temp;windowsTitle += ","windowsTitle += m_BaudRate;windows
7、Title += ","windowsTitle += m_Parity;windowsTitle += ",8,1"m_Para=windowsTitle;UpdateData(false);/ 更新控件内容(从成员变量->控件)打开串口 “打开串口”按钮添加点击事件处理函数“:void Ctest22Dlg:OnClickedOpencomm()/ TODO: 在此添加控件通知处理程序代码CString strPara;/串口参数m_Comm.put_CommPort(m_Com);/指定串口号strPara=m_BaudRate;strPar
8、a+=","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_Com
9、m.put_PortOpen(1);/打开串口m_OpenComm.EnableWindow(false);/使打开串口按钮无效m_CloseComm.EnableWindow(true);/使关闭串口按钮生效m_SetupComm.EnableWindow(false); /使设置按钮无效AfxMessageBox("串口打开成功!");关闭串口 “关闭串口”按钮添加单击事件处理函数:void Ctest22Dlg:OnClickedClosecomm()/ TODO: 在此添加控件通知处理程序代码m_Comm.put_PortOpen(0);/关闭串口AfxMessag
10、eBox("串口关闭成功!");m_OpenComm.EnableWindow(true);/使打开串口按钮生效m_CloseComm.EnableWindow(false);/使关闭串口按钮无效m_SetupComm.EnableWindow(true);/使设置按钮生效接收数据处理在MSComm控件的OnComm事件中接受数据。添加OnComm事件处理函数:void Ctest22Dlg:OnOncommMscomm1()/ TODO: 在此处添加消息处理程序代码VARIANT input1; /定义VARIANT类型变量BYTE rxdata2048; /定义存放二进
11、制数据的数组COleSafeArray safearray1; /定义COleSafeArray类的实例CString strDis, strTemp;switch(m_Comm.get_CommEvent() case 2: input1=m_Comm.get_Input();safearray1=input1; /使用COleSafeArray类的成员函数获取数据长度long len1=safearray1.GetOneDimSize();for(long k=0;k<len1;k+)/使用COleSafeArray成员函数将数据写入数组safearray1.GetElement(&
12、amp;k,rxdata+k); /收到 RThreshold 个字符, 添加接收处理代码/将接受缓冲区数据放入VARIANT变量;/将VARAIANT变量赋值给COleSafeArray类的实例/使用COleSafeArray类的成员函数获取数据长度/使用COleSafeArray类的成员函数将数据写入数组rxdatafor(long k=0;k<1;k+)if(rxdatak=13)/ 回车键/换行显示m_Display.SetSel(1000000,1000000);m_Display.ReplaceSel("1512");UpdateData(false);e
13、lse/ 可见字符if(rxdatak<=126 && rxdatak>=32)strDis+=rxdatak;m_Display.SetSel(1000000,1000000);m_Display.ReplaceSel(strDis);strDis=""UpdateData(false);程序结果展示:三、采用API界面设计:1. 主界面,设置参数界面同上:变量声明(主对话框CthreadReceiveDlg.cpp中头部添加声明):CSetupDlg mySetupDlg; /设置对话框对象DWORD myfParity; /校验标志LPCS
14、TR myCom; /串口号BYTE myParity; /校验类型DWORD myBaudRate; /波特率HANDLE hCom; /串口句柄HANDLE hThreadEvent; /事件线程句柄DWORD ThreadProcEvent(LPVOID pParam); /事件响应函数bool hEventRun; /事件线程函数执行标志HWND hWnd; /窗口句柄DWORD dwThreadID; /事件线程IDOVERLAPPED Eol=0; /事件线程使用的OVERLAPPED结构OVERLAPPED Rol=0; /读操作使用的OVERLAPPED的结构bool fSto
15、pMsg; /事件线程向主线程发送消息标志2、利用“ClassWizard”创建主对话框及设置对话框控件变量(同上)。3、设置串口按钮添加单击事件响应函数(并保存参数到相应变量以便打开串口设置DCB结构时使用)。CString strStatus;if(mySetupDlg.DoModal()=IDOK)switch(mySetupDlg.m_Com)case 0:strStatus="COM1"myCom="COM1"break;case 1:strStatus="COM2"myCom="COM2"break;c
16、ase 2:strStatus="COM3"myCom="COM3"break;case 3: strStatus="COM4"myCom="COM4"break;case 4: strStatus="COM5"myCom="COM5"break;case 5:strStatus="COM6"myCom="COM6"break;strStatus+=","switch (mySetupDlg.m_BaudRate)c
17、ase 0: strStatus+="19200" myBaudRate=CBR_19200; break;case 1:strStatus+="9600"myBaudRate=CBR_9600;break;case 2:strStatus+="4800"myBaudRate=CBR_4800;break;case 3:strStatus+="2400"myBaudRate=CBR_2400;break;default:break;strStatus+=","switch (mySetupDlg
18、.m_Parity)case 0:myfParity=false;myParity=NOPARITY;strStatus+="N"break;case 1:myParity=ODDPARITY;strStatus+="O"break;case 2: myParity=EVENPARITY;strStatus+="E"break;default:break;strStatus+=",8,1"m_Para=strStatus; /将参数显示在主对话框头部以便观察。UpdateData(false);/ 更新控件内容(从
19、成员变量->控件)4.添加打开串口单击事件响应函数。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); /缓冲区设置DCB myDCB;GetCommState(hCom,&myDCB); /获得串口DCB数据结构myDCB.BaudRate=myBaudRate;myDC
20、B.fBinary=TRUE;myDCB.fParity=myfParity;myDCB.ByteSize=8;myDCB.Parity=myParity;myDCB.StopBits=ONESTOPBIT; /设置DCB需要改动的相应参数SetCommState(hCom,&myDCB); /使用新的DCB结构设置串口AfxMessageBox("串口打开成功");elseAfxMessageBox("创建串口失败!");hWnd=GetSafeHwnd();DWORD dwParam; if(!SetCommMask(hCom,EV_RXCH
21、AR|EV_TXEMPTY)AfxMessageBox("建立事件掩码失败");hThreadEvent=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProcEvent,&dwParam,0,&dwThreadID); /创建并立即执行事件线程if(hThreadEvent=INVALID_HANDLE_VALUE)AfxMessageBox("事件线程创建失败");hEventRun=true;5、添加关闭串口,退出单击事件响应函数(1)关闭串口:hEventRun=false;
22、/事件线程运行标志置0WaitForSingleObject(hThreadEvent,INFINITE); /等待事件线程函数退出CloseHandle(hThreadEvent); /关闭事件线程句柄if(CloseHandle(hCom) /关闭串口句柄并提示串口关闭AfxMessageBox("串口关闭成功");(2)退出:this->EndDialog(true);6、主对话框CthreadReceiveDlg.cpp 添加事件线程函数。DWORD ThreadProcEvent(LPVOID pParam)DWORD dwEvtMask,dwRes;Eol
23、.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);while(hEventRun) /循环检测事件线程函数状态。WaitCommEvent(hCom,&dwEvtMask,&Eol);dwRes=WaitForSingleObject(Eol.hEvent,100);switch(dwRes)case WAIT_OBJECT_0:switch (dwEvtMask)case EV_RXCHAR:if(!fStopMsg)fStopMsg=true;:PostMessage(hWnd,WM_MYMSG,0,(LPARAM)EV_RXCHAR);
24、/接受到数据通知自定义消息函数。break;case EV_TXEMPTY:AfxMessageBox("send buffer is empty");break;break;return true;7、自定义消息读取数据(1)在主对话框ThreadReceiveDlg.h中头部添加 自定义消息ID #define WM_MYMSG WM_USER+100 /自定义消息WM_MYMSG ID为WM_USER+100 (2)在ThreadReceiveDlg类定义中添加消息函数声明 afx_msg LONG OnReceiveEvent(WPARAM wParam,LPARA
25、M lParam); (3) 在CthreadReceiveDlg.cpp中添加自定义消息映射 BEGIN_MESSAGE_MAP(CThreadReceiveDlg, CDialogEx)ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_SETUPCOM, &CThreadReceiveDlg:OnBnClickedSetupcom)ON_BN_CLICKED(IDC_OPENCOM, &CThreadReceiveDlg:OnBnClickedOpencom)ON_BN_CLICKED(IDC_CLOSECOM, &am
26、p;CThreadReceiveDlg:OnBnClickedClosecom)ON_BN_CLICKED(IDC_EXIT, &CThreadReceiveDlg:OnBnClickedExit)ON_MESSAGE(WM_MYMSG,OnReceiveEvent) /接受数据消息映射END_MESSAGE_MAP()(4)在CthreadReceiveDlg.cpp中添加自定义消息函数实现(接收数据实现)LONG CThreadReceiveDlg:OnReceiveEvent(WPARAM wParam,LPARAM lParam)CString strDis, strTemp;BYTE myByte50;DWORD dwRes;DWORD dwRead;DWORD dwErrors;COMSTAT Rcs;fStopMsg=true;ClearCommError(hCom,&dwErrors,&Rcs);if(ReadFile(hCom,&myByte,Rcs.cbInQu
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《信息科学类专业英语》课件第2章
- 地税局2024双拥工作计划
- 2024至2030年中国化学感光标牌行业投资前景及策略咨询研究报告
- 2024至2030年中国钨金手表行业投资前景及策略咨询研究报告
- 2024至2030年中国红外半球型摄像机行业投资前景及策略咨询研究报告
- 2024至2030年中国硅酸盐材料行业投资前景及策略咨询研究报告
- 2024至2030年中国水质污水处理设备行业投资前景及策略咨询研究报告
- 2024至2030年中国气珠薄膜包装行业投资前景及策略咨询研究报告
- 2024至2030年中国整体硬质合金直刃钻铰刀行业投资前景及策略咨询研究报告
- 2024至2030年电力工业自动化系统平台软件包项目投资价值分析报告
- 母婴保健法-课件
- (完整word版)田字格-word打印版
- 工程材料检测实验计划表
- 2023年电大开放英语作文范文
- 人工智能在教师工作中的应用
- 赤壁赋-完整版统编版
- VDI云桌面技术及方案
- 商务、技术响应偏离情况说明表(格式)
- 清华大学出版社机械制图习题集参考答案(第三版)最全整理
- ECB防水施工方案
- 合成碳量子点方法总结
评论
0/150
提交评论