欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    CPP高级语言串口通信课程设计.docx

    • 资源ID:14609470       资源大小:361.46KB        全文页数:24页
    • 资源格式: DOCX        下载积分:1金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要1金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    CPP高级语言串口通信课程设计.docx

    1、CPP高级语言串口通信课程设计目 录 1引言 11.1问题的提出 11.2国内外研究的现状 11.5任务与分析 21.5.1主要任务 21.5.2分析 22程序的主要功能 22.1参数设置功能 22.2参数显示功能 22.3打开串口功能 22.4关闭串口功能 22.5接收数据功能 32.6发送数据功能 32.7清空数据接收区功能 32.8清空数据发送区功能 32.9自动发送功能 32.10十六进制显示功能 32.11十六进制发送功能 33程序运行平台 34总体设计 45程序类的说明 46模块分析 66.1参数设置和显示模块 66.2打开串口模块 96.3发送数据模块 96.4自动发送模块 10

    2、6.5接收数据模块 116.6清空接收区模块 126.7清空发送区模块 126.8关闭串口模块 127系统测试 137.1测试 137.2总结 188结论 18参考文献 19摘 要随着计算机的普及,计算机网络和多微机系统的广泛应用,尽管当今USB通信技术和以太网技术快速发展,然而串口通信技术始终以其连接简便,价格低廉,稳定可靠等优点,在计算机通信领域占有一席之地。MSCOmm控件是微软公司为了用户使用方便而提供的一种便捷的控制串口编程的解决方案,本文主要介绍了如何利用VC + + 2008 MSComm 控件的串口通信方法,对程序的类进行了说明,分析了本程序各个模块怎样实现起作用。此次设计以M

    3、FC 来设计界面编制程序,同时利用MSComm 控件通过串口发送和接收数据,实现了串口通信。该串口通信控制程序具有通信参数设置、通信参数显示、打开和关闭串口、接收数据、发送数据、清空发送区和接收区数据的功能。关键词:串口通信 visual studio 2008 MSComm控件1引言1.1问题的提出串行通信(Serial Communication )在现代工业控制系统中一直有着及其重要的地位,作为一种基本而又灵活方便的通信方式,它被广泛应用于PC与PC或者PC与PLC之间的数据交换以及其他工业控制与自动控制中,它不仅没有因为时代的进步而遭淘汰,反而在规格上越来越完善,应用也越来越广泛。VC

    4、+是新一代面向对象的可视化开发工具,提供了良好的界面设计能力,在PC机的串口通信方面有很强的功能。对于从事机械行业的人来说,熟悉基于RS232串口通信的高级语言编程方法显得十分重要。1.2国内外研究的现状目前,计算机的串行通信应用十分广泛,串行接口已成为计算机的必需部件和接口之一。由于其具有连接简单、使用灵活方便、数据传递可靠等优点,在工业监控、数据采集和实时控制系统中得到了广泛应用。当今,实现串口通信的方法以及第三方控件有很多,例如PComm控件,Windows API函数等等。但是这几种方法都过于复杂,对程序员要求较高,而且可靠性并不是很好。利用Microsoft推出的MSComm控件,使

    5、得串口通信的实现更为简单、可靠。随着当今信息技术的快速发展,通信已成为信息技术中的关键问题。尤其在控制领域,以何种方式实现计算机与外围设备间既简单又可靠的通信,就显得特别重要。由于串行通信具有实现简单、使用灵活方便、数据传输可靠等优点,因而广泛应用于工业控制系统中,是计算机与外部设备进行数据通信时经常使用的方式之一。VC+是新一代面向对象的可视化开发工具,提供了良好的界面设计能力,在PC机的串口通信方面有很强的功能。它具有功能强大、简便易用和代码执行速度快等特点,在通信软件的开发中成为越来越多开发人员的首选工具。无论在工业控制中PC机和单片机之间的通信,还是在2台Pc机之间的串口通信,都具有相

    6、同的原理。只要掌握其中的通信本质,就能灵活地实现串口通信,串口控制。1.5任务与分析1.5.1主要任务制定串口通信控制程序的总体构架;熟悉VC平台下的高级语言编程方法;熟悉基于RS232串口通信的高级语言编程方法;在同一台PC机上调试通过所编写的程序;1.5.2分析目前Win32 中基于VC + + 6. 0 的常用串口通信程序一般可以用两种方法实现: 利用MSComm ActiveX 串行通信控件; 使用Win2dows API 通信函数。虽然在Windows下Win32API提供了使用文件操作方式的函数进行串口操作的方法,但是在编程实现上还是比较复杂。Windows平台先进的ActiveX

    7、技术使得对串口编程不再需要处理烦琐的细节。利用已有的AxtiveX控件,只需要编写少量的代码,就可以轻松高效地完成任务。因此程序员不需要花时间去了解复杂的API函数,只需要利用MSComm控件就可实现串口编程。2程序的主要功能2.1参数设置功能设置和修改串口通信参数,包括端口,波特率,奇偶校验位,数据位,停止位。2.2参数显示功能 显示当前串口通信参数,包括端口号,波特率,奇偶校验位,数据位,停止位。2.3打开串口功能参数设置后,才能打开串口,实现通信。2.4关闭串口功能关闭串口,停止通信。2.5接收数据功能能够进行单个或多个数据的接收和显示。2.6发送数据功能能够进行单个或多个数据的发送。2

    8、.7清空数据接收区功能删除接收区所有数据。2.8清空数据发送区功能清除发送区内所有数据。2.9自动发送功能能把发送区内的数据每2s自动发送。2.10十六进制显示功能在接收区只显示十六进制数,每两个字符一个空格。2.11十六进制发送功能只能发送十六进制数,不能发送非十六进制数。3程序运行平台Visual studio 2008具体操作如下:(1)新建MSComm项目,选择MFC应用程序,应用程序类型选择“基于对话框”,生成的类中选择“CMSCommDlg”;(2)为MSComm项目添加新建一个Dialog设置对话框;(3)加载MSComm控件,添加相应的源程序,加载必要的控件;(4)编写程序代码

    9、,再编译,链接,调试,执行等,生成应用程序。4总体设计图4.1系统总体框架图5程序类的说明class CMSCommDlg : public CDialog/ 构造public: CMSCommDlg(CWnd* pParent = NULL); / 标准构造函数/ 对话框数据 int OnCreate(LPCREATESTRUCT lpCreateStruct); int String2Hex(CString str, CByteArray &senddata); char ConvertHexChar(char ch); enum IDD = IDD_MSCOMM_DIALOG ; pro

    10、tected: virtual void DoDataExchange(CDataExchange* pDX); / DDX/DDV 支持/ 实现protected: HICON m_hIcon; / 生成的消息映射函数 virtual BOOL OnInitDialog(); afx_msg void OnSysCommand(UINT nID, LPARAM lParam); afx_msg void OnPaint(); afx_msg HCURSOR OnQueryDragIcon(); DECLARE_MESSAGE_MAP()public: CMSComm m_mscom; /声明

    11、m_mscomm变量为CMSComm类型 CString m_recv; /接收区 CString m_send; /发送区 CSetupDlg mySetupDlg; /声明设置对话框 BYTE myCom; /串口号码 CString myParity; /奇偶校验类型 CString myBaudRate; /通信波特率 CString myData; /数据位 CString myStop; /停止位 DECLARE_EVENTSINK_MAP() void OnCommMscomm1(); afx_msg void OnBnClickedSendbutton(); afx_msg v

    12、oid OnBnClickedClearsend(); afx_msg void OnBnClickedClearRecv(); afx_msg void OnBnClickedSetupcom(); afx_msg void OnBnClickedOpencom(); afx_msg void OnBnClickedClosecom(); afx_msg void OnTimer(UINT_PTR nIDEvent); afx_msg void OnBnClickedCheckAutosend(); CButton m_Opencom; /打开串口按钮 CButton m_Closecom;

    13、 /关闭串口按钮 CButton m_Setupcom; /设置按钮 CString m_Para; /通信参数显示 CButton m_ClearRecv; /清空接收按钮 CButton m_ClearSend; /清空发送按钮 CButton m_SendText; /发送按钮 CButton m_ctrlHexSend; /十六进制发送 CButton m_ctrlHexDisplay; /十六进制显示 BOOL m_bAutoSend; /自动发送;6模块分析6.1参数设置和显示模块单击主界面中的【设置】按钮,将弹出“设置”对话框,如图7.1所示,可以在该对话框中设置串口的通信参数。

    14、该命令的代码如下:void CMSCommDlg:OnBnClickedSetupcom() / TODO: 在此添加控件通知处理程序代码 m_Opencom.EnableWindow(TRUE); AfxMessageBox(_T(请设置通信参数并打开串口以实现通信!); CString strStatus,strTemp; double dblBaund; int mdata,mstop; if (mySetupDlg.DoModal()=IDOK) myCom=mySetupDlg.m_com+1; /求取串口编号 if(mySetupDlg.m_BaudRate8) dblBaund=

    15、pow(2,(double)mySetupDlg.m_BaudRate); /求取波特率 dblBaund=300*dblBaund; else switch(mySetupDlg.m_BaudRate) case 8: dblBaund=43000; break; case 9: dblBaund=56000; break; case 10: dblBaund=57600; break; case 11: dblBaund=115200; break; case 12: dblBaund=128000; break; case 13: dblBaund=256000; break; strS

    16、tatus.Format(_T(%.0f),dblBaund); myBaudRate=strStatus; switch(mySetupDlg.m_Parity) / 求取奇偶校验位 case 0: myParity=E; break; case 1: myParity=M; break; case 2: myParity=N; break; case 3: myParity=O; break; case 4: myParity=S; break; mdata=4+mySetupDlg.m_Data; /求取数据位 strStatus.Format(_T(%d),mdata); myData

    17、=strStatus; mstop=1+mySetupDlg.m_Stop; /求取停止位 strStatus.Format(_T(%d),mstop); myStop=strStatus; strStatus=COM; strTemp.Format(_T(%d),myCom); strStatus+=strTemp; strStatus+=, ; strStatus+=myBaudRate; strStatus+=bit/s, ; strStatus+=myParity; strStatus+=, ; strStatus+=myData; strStatus+=, ; strStatus+=

    18、myStop; m_Para=strStatus; /求取静态文本显示内容 UpdateData(false); 6.2打开串口模块单击主界面中的【打开串口】按钮,如果参数已设置好,将打开指定的串口,提示“串口打开成功!”,如图7.2所示,该命令的代码如下:void CMSCommDlg:OnBnClickedOpencom() / TODO: 在此添加控件通知处理程序代码 CString strPara; /串口参数 m_mscom.put_CommPort(myCom); /指定串口号mycom strPara=myBaudRate; strPara+=, ; strPara+=myPar

    19、ity; strPara+=, ; strPara+=myData; strPara+=, ; strPara+=myStop; /AfxMessageBox(strPara); m_mscom.put_Settings(strPara); /通信参数设置 m_mscom.put_InBufferSize(1024); /指定接收缓冲区大小 m_mscom.put_InBufferCount(0); /清空接收缓冲区 m_mscom.put_InputMode(1); /设置数据获取方式 m_mscom.put_InputLen(0); /设置每次读取长度 m_mscom.put_RThres

    20、hold(1); /oncomm事件门限值 m_mscom.put_PortOpen(1); /打开串口 m_Opencom.EnableWindow(false); /使打开串口按钮无效 m_Closecom.EnableWindow(true); /使关闭串口按钮生效 m_SendText.EnableWindow(true); m_Setupcom.EnableWindow(false); /使设置按钮无效 AfxMessageBox(_T(串口打开成功!);6.3发送数据模块单击主界面中的【发送】按钮,将把发送区的内容发送到串口调试助手的接收区,如果【十六进制发送】选中,则只能发送0F

    21、,如图7.3(a)(b)所示,该命令的代码如下:void CMSCommDlg:OnBnClickedSendbutton() / TODO: 在此添加控件通知处理程序代码 UpdateData(true); if(m_ctrlHexSend.GetCheck() CByteArray hexdata; int len=String2Hex(m_send,hexdata); /此处返回的len可以用于计算发送了多少个十六进制数 m_mscom.put_Output(COleVariant(hexdata); /发送十六进制数据 else CByteArray sendArr; WORD wLe

    22、ngth; wLength = m_send.GetLength(); sendArr.SetSize(wLength); for(int i =0; iwLength; i+) sendArr.SetAt(i, m_send.GetAt(i); m_mscom.put_Output(COleVariant(m_send); 6.4自动发送模块当【自动发送】选中时,系统将自动每隔2s发送一次数据,如图7.4(a)(b)所示,程序代码如下:void CMSCommDlg:OnTimer(UINT_PTR nIDEvent) / TODO: 在此添加消息处理程序代码和/或调用默认值 OnBnCli

    23、ckedSendbutton(); CDialog:OnTimer(nIDEvent);void CMSCommDlg:OnBnClickedCheckAutosend() / TODO: 在此添加控件通知处理程序代码 m_bAutoSend=!m_bAutoSend; if(m_bAutoSend) SetTimer(1,2000,NULL);/时间为毫秒 else KillTimer(1); /取消定时 6.5接收数据模块发送方发送数据后,在接受区显示对方的发送内容,如果【十六进制显示】选中,则将只显示十六进制数0F,如图7.5(a)(b)所示,该命令的代码如下:void CMSCommD

    24、lg:OnCommMscomm1() / TODO: 在此处添加消息处理程序代码 UpdateData(true); VARIANT variant_inp; COleSafeArray safearray_inp; long i = 0; int len; char rxdata2048; CString tmp; switch (m_mscom.get_CommEvent() case 2: /表示接收缓冲区内有字符 variant_inp = m_mscom.get_Input(); safearray_inp = variant_inp; len = safearray_inp.Get

    25、OneDimSize(); for (i = 0; i len; i+) safearray_inp.GetElement(&i, &rxdatai);/转换为BYTE型数组 for (i = 0; i len; i+) /将数组转换为Cstring型变量 BYTE bt=*(char*)(rxdata+i); /字符型 if(m_ctrlHexDisplay.GetCheck() tmp.Format(_T(%02X ),bt); /将字符以十六进制方式送入临时变量tmp存放,注意这里加入一个空隔 m_recv+=tmp; /加入接收编辑框对应字符串 if(!m_ctrlHexDisplay

    26、.GetCheck() rxdatai = 0; if(!m_ctrlHexDisplay.GetCheck() m_recv += rxdata; UpdateData(false); break; default: break; 6.6清空接收区模块单击主界面中的【清空接收区】按钮,将清空接收区内容,提示“清空接收区内容!” 如图7.6所示,该命令的代码如下:void CMSCommDlg:OnBnClickedClearRecv() / TODO: 在此添加控件通知处理程序代码 m_recv=; UpdateData(FALSE); AfxMessageBox(_T(清空接收区成功!);

    27、6.7清空发送区模块单击主界面中的【清空发送区】按钮,将清空发送区内容,提示“清空发送区内容!” 如图7.7所示,该命令的代码如下:void CMSCommDlg:OnBnClickedClearsend() / TODO: 在此添加控件通知处理程序代码 m_send=; UpdateData(FALSE); AfxMessageBox(_T(清空发送区成功!);6.8关闭串口模块单击主界面中的【关闭串口】按钮,将关闭串口,提示“串口关闭成功!”,如图7.8所示,该命令的代码如下:void CMSCommDlg:OnBnClickedClosecom() / TODO: 在此添加控件通知处理程

    28、序代码 m_mscom.put_PortOpen(0); /关闭串口 AfxMessageBox(_T(串口关闭成功!); m_Opencom.EnableWindow(true); /使打开串口按钮生效 m_Closecom.EnableWindow(false); /使关闭串口按钮无效 m_Setupcom.EnableWindow(true); /使设置按钮生效7系统测试7.1测试首先,直接双击MSComm文件夹下的debug子文件夹下的MSComm.exe运行文件;其次,按以下步骤进行测试:(1)参数设置:图7.1 参数设置(2)打开串口:图7.2 打开串口(3) 发送十六进制:图7.3(a)十六进制发送图7.3(b)串口调试助手十六进制显示(4)接收数据:图7.4(a)串口调试助手发送数据图7.4(b)接收数据(5)自动发送图7.5(a)自动发送图7.5(b)串口调试助手数据显示(6)清空接收区图7.6 清空接收区(7)清空发送区图7.7 清空发送区(8)清空发送区图7.8 关闭串口7.2总结通过上述测试,本系统实现了参数设置与显示、打开关闭串口、接收和发送数据、自


    注意事项

    本文(CPP高级语言串口通信课程设计.docx)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2023 冰点文库 网站版权所有

    经营许可证编号:鄂ICP备19020893号-2


    收起
    展开