用Visual C++编制串行通信程序.docxVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
用VisualC编制串行通信程序

用Visual C++编制串行通信程序?摘 要: 本文介绍了在Win32环境下用Visual C++的MFC实现串行通信方法,用类实现多线程编程,较好地将32位串口通信的API函数封装在一个类中实现串行通信,并给出示例程序。关键词:串行通信 多线程 Visual C++ MFC随着计算机应用深入,经常需要通过计算机RS-232串口与外部设备通信,采集如温度、压力、重量等模拟数据,或发出控制信息,用Visual C++编制串行通信程序可有三种方法:1、采用Microsoft Win32应用程序编程接口(API)所提供串行通信函数,用SDK思路编写。2、用ActiveX通讯控件开发串行通信程序。3、用C++的MFC思路,将Win32串口通信的API函数封装在一个类中实现串行通信。前两种方法己有不少刊物已作过介绍,方法各有利弊,而第三种方法较为繁琐,不仅要了解Win32位串行通信的API函数,还要掌握多线程编程,但控制灵活,既涉及到底层编程、纠错能力强,又有C++风格,为专业C++开发人员所采用。本文就在Win32环境下串行通信、多线程编程概念作简单叙述,并给出相应的示例程序,以供参考。一、串口通信1.串口通信步骤 :一般编制串行通信程序分四个部分:A 打开串行端口:打开通信资源,设置通信参数、设置通信事件、创建读、写事件、进入等待串口消息循环。B 读取串行端口信息,当串口发生EV_RXCHAR(接收到字符并放入了输入缓冲区)消息后读取串口、数据传输错误处理、字符串处理如回车符、空格并相应转化成数据,如果模拟量还要进行数据检验等功能。C 写串行端口信息:将要发送的信息写入串口,相应进行错误处理。D 断开串行端口连接:关闭事件,清除通信事件,丢弃通信资源并关闭。2. 串口通信函数在Win32环境下,由于Windows禁止应用程序直接和硬件打交道,所以程序员只能用Win32 API提供的串行通信函数与串行端口打交道,主要函数有:打开、关闭通信资源 CreateFile();CloseHandle( );设置通信资源SetCommState(()等待串口事件WaitCommEvent()创建、关闭事件对象 CreateEvent();CloseHandle()串口读写ReadFile(),WriteFile()以上函数具体如何使用见示例或联机帮助。在Windows3.1-16位通信函数有一个WM_COMMNOTIFY消息,每当发生一个串行端口事件,通信设备驱动器就发送此消息,以便程序读、写串信端口,在Win32中已被取消,而串行端口事件(特别接收串口数据)与外部设备有关,计算机要保证及时接收数据又不使主程序暂停,就要引入多线程编程。3. 多线程现实生活中,许多事情都时同时进行的,在我们设计应用程序时,也就常常需要采用并行编程机制-多线程,在本示例中,主线程负责创建子线程、向串口发送信息,子线程等待串口EV_RXCHAR(收到字符放入缓冲区)事件,读取缓冲区字符并显示。一般MFC将线程分两类:用户界面线程和工作者线程,工作者线程没有消息循环,只是一般函数,本示例中采用是用户界面线程,其实现方法为:4.从CWinThread派生新的子类。必须用宏DECLARE_DYNCREATE()和IMPLEMENT_DYNCREATE声明和实现CwinThread5. 在CwinThread派生类覆盖以下函数。. InitInstance:执行线程实例的初始化。. ExitInstance:在线程终止时执行清理工作。. Run:控制线程的函数,包含消息循环。.OnIdle:执行线程的空闭处理。a)调用全局函数AfxBeginThread启动用户界面线程。此时,采用以下原型:CWinThread* AfxBeginThread(CRuntimeClass* pThreadClass, int nPriority = THREAD_PRIORITY_NORMAL, UINT nStackSize = 0, DWORD dwCreateFlags = 0, LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL );其中,参数pThreadClass为从CWinThread派生类对象的RUNTIME_CLASS宏调用;nPriority用于指定线程优先级(可选)可以调用API函数SetThreadPriority设置优先级;nStackSize用于指定线程的堆栈大小;dwCreateFlags为控制线程创建的附加标记,如果为CREATE_SUSPENDED,则创建线程为挂起状态,必须调用成员函数ResumeThread恢复;lpSecurityAttrs用于指定安全属性。要保证线程之间数据正常传输,还要涉及线程间通信、线程间同

文档评论(0)

yan698698 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档