基于多线程技术串口通信设计与研究.docVIP

基于多线程技术串口通信设计与研究.doc

  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文档。上传文档
查看更多
基于多线程技术串口通信设计与研究

基于多线程技术串口通信设计与研究   摘要 本文以VC++ 6.0为开发平台,讲述了如何使用32位的Windows API 串口通信函数,编程实现高效的多线程全双工串口通信,并在阐述中给出了相关函数或代码。实验证明,该方法有着较好的灵活性、可靠性与高效性。   关键词 VC++;串口通信;多线程;重叠I/O   中图分类号TP313 文献标识码A 文章编号 1674-6708(2010)24-0219-02      0 引言   串口是常用的计算机与外部设备之间的数据传输通道,由于使用其通信方便易行,且能实现数据的长远距离传输,故应用极其广泛。为此,根据不同的使用环境灵活地编写出串口通信处理程序是必要的工作。在Windows上,微软专门提供了相应的文件I/O函数和通信函数,以方便我们编写出所需的串口通信程序。目前,实现串口通信的方法有两种。第一种,使用VC++提供的串口通信控件MSComm;第二种,使用32位的API 通信函数。本文采用了第二种方法,且结合多线程技术,实现了更加灵活的串口通信程序设计。   1 编程实现过程   1.1 初始化端口   在Windows操作系统中,串行口是被作为文件来进行处理的,而不是直接对端口进行操作,为此我们使用某一个串口进行通信时,需首先调用API函数 CreateFile(szPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,NULL );获取一个串口通信设备句柄hCom。其中,该函数的第一个参数szPort标识将要开启的端口号,第二个参数规定了端口读写属性,剩下的参数中较重要的是设置FILE_FLAG_OVERLAPPED标识,即开启重叠I/O的方式。在该模式下,当我们调用读写函数时,即使操作还未完成,被调用的函数也会立即返回,这样费时的I/O操作会在后台进行,使系统在这段时间可以去干别的事情,提高了系统的执行效率,且借用多线程技术还能实现读、写的同时进行。   接下来,需要根据需求,调用SetCommTimeouts(hCom, m_CommTimeouts);函数,设置COMMTIMEOUTS类型的结构体变量m_CommTimeouts。更改COMMTIMEOUTS结构体里面的成员变量,可以设置串口读写超时时间,以实现系统若未在指定时间内读出或写入指定数量的字符,就不再继续,立即返回执行下一次的任务。然后,还需要分别调用SetCommState和SetupComm函数,设置端口的速率、数据位、输入输出缓冲区大小等配置信息。至此,就完成了串口的初始化并开启操作。   1.2 串口读写的实现   1.2.1 多线程全双工通信   想要编写高效率的串口通信程序,除了设置重叠I/O外,再结合多线程技术,可以起到更好的效果。所谓多线程,就是指要计算机并行的处理不同的事情。在VC中线程分为用户界面线程和工作者线程,其主要区别是前者能够提供界面和用户的交互,而后者没有界面,用于处理后台任务。本文在设计通信程序时,建立了两个工作者线程,一个用于不断监视数据的接收,一个用于数据的发送。这样,使程序实现了收发同时进行的全双工工作方式,在实际应用中更有效率。   另外,值得注意的是使用重叠I/O需要创建OVERLAPPED结构以供读写函数,即ReadFile和WriteFile使用。而OVERLAPPED结构中最重要的成员是hEvent。hEvent是一个事件对象句柄,通过CreateEvent函数来创建,被用作线程的同步对象使用。如果读写函数未完成操作就返回,那么会将hEvent置为无信号状态。只有操作完成后(包括超时),hEvent才会置为有信号状态,这样我们就可以通过hEvent知晓当前通讯设备的读写状态。   实际程序运行时,若发现读、写函数的返回值为假,由于开启了重叠I/O方式,那么未必是指读写失败,此时需要通过GetLastError函数的返回值做进一步判断。若返回为ERROR_IO_PENDING,说明当前读或写操作还未完成,这时就可以挂起读、写线程,等待操作完成。而程序设计时有两种等待方法:一种是用WaitForSingleObject等待函数来等待OVERLAPPED结构体中的成员hEvent为有信号状态;另一种办法是调用GetOverlappedResult函数等待,注意需要将该函数的bWait参数设为TRUE,那么该函数将会一直等待hEvent 事件,直到其有信号才返回。同时,利用GetOverlappedResult还可以返回一个OVERLAPPED结构体,里面包含有实际发送、接收字节等重叠操作的结果。

文档评论(0)

189****7685 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档