- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
5.1 引 言 在Win32下,可以使用两种编程方式实现串口通信:其一是使用ActiveX控件,这种方法程序简单,但不够灵活;其二是调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活。本章只介绍API串口通信部分。 串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式)。同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而重叠操作时,API函数会立即返回,操作在后台进行,能避免线程的阻塞。 无论哪种操作方式,一般都通过以下四个步骤来完成: (1) 打开串口。 (2) 配置串口。 (3) 读写串口。 (4) 关闭串口。 5.2 打 开 串 口 Win32系统把文件的概念进行了扩展。无论是文件、通信设备、命名管道、邮件槽、磁盘还是控制台,都是用API函数CreateFile来打开或创建的。该函数的原型为: 其中: ? ?lpFileName:将要打开的串口逻辑名,如“COM1”。 ? ?dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列。 ? ?dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0。 ? ?lpSecurityAttributes:引用安全性属性结构,缺省值为NULL。 ? ?dwCreationDistribution:创建标志,对串口操作,该参数必须置为OPEN_EXISTING。 ???dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O操作。 ? ?hTemplateFile:对串口而言该参数必须置为NULL。 同步I/O方式打开串口的示例代码: 5.3 配 置 串 口 1.设置串口参数 设置串口参数需要通过一个DCB结构来进行。DCB结构包含了诸如波特率、数据位数、奇偶校验和停止位数等信息。在查询或配置串口的属性时,都要用DCB结构来作为缓冲区。 一般用CreateFile打开串口后,可以调用GetCommState函数来获取串口的初始配置。要修改串口的配置,应该先修改DCB结构,然后再调用SetCommState函数设置串口。 DCB结构包含了串口的各项参数设置,该结构原型如下: 2.申请串口通信缓冲区 除了在DCB中进行的设置外,程序一般还需要设置I/O缓冲区的大小和超时。Windows用I/O缓冲区来暂存串口输入和输出的数据。如果通信的速率较高,则应该设置较大的缓冲区。调用SetupComm函数可以设置串行口的输入和输出缓冲区的大小。 3.串口通信超时设置 在用ReadFile和WriteFile读写串行口时,需要考虑超时问题。超时的作用是在指定的时间内没有读入或发送指定数量的字符时,ReadFile或WriteFile的操作仍然会结束。 要查询当前的超时设置应调用GetCommTimeouts函数,该函数会填充一个COMMTIMEOUTS结构。调用SetComm Timeouts可以用某一个COMMTIMEOUTS结构的内容来设置超时。 读写串口的超时有两种:间隔超时和总超时。间隔超时是指在接收时两个字符之间的最大时延。总超时是指读写操作总共花费的最大时间。写操作只支持总超时,而读操作两种超时均支持。用COMMTIMEOUTS结构可以规定读写操作的超时。 COMMTIMEOUTS结构的成员都以毫秒为单位。总超时的计算公式是: 总超时=时间系数×要求读/写的字符数+时间常量 可以看出,间隔超时和总超时的设置是不相关的,这可以方便通信程序灵活地设置各种超时。 如果所有写超时参数均为0,那么就不使用写超时。如果ReadIntervalTimeout为0,那么就不使用读间隔超时。如果ReadTotalTimeoutMultiplier 和 ReadTotalTimeoutConstant 都为0,则不使用读总超时。如果读间隔超时被设置成MAXDWORD并且读时间系数和读时间常量都为0,那么在读一次输入缓冲区的内容后读操作就立即返回,不管是否读入了要求的字符。 4.清空串口通信缓冲区 在读写串口之前,还要用PurgeComm()函数清空缓冲区,该函数原型如下: 5.4 读 写 串 口 使用ReadFile和WriteFile读写串口,下面是两个函数的声明: 在用ReadFile和WriteFile读写串口时,既可以
文档评论(0)