


全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
WIN32 API串口通信掌握串行通信API函数的用法是掌握串行通信编程技术的关键。在Win32中,系统将串行口与文件统一了起来, 对它们的打开、读写、关闭等操作都使用相同的API函数,但是它们之间又有差别,这些差别主要体现在API函 数中部分参数的设置上。有关通信的API主要包括打开串口、关闭串口、配置串口、设置缓冲区、设置超时、 事件驱动、读串口、写串口等。串口的打开和关闭 1:串口的打开。由于在Windows环境中,串口作为一种文件来使用,打开串口用打开文件同样的API函数 CreateFile()。 函数原型为: HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); 其中几个参数的含义分别为: lpFileName指定文件名或设备名,串口通讯时,它必须是“COMx”,其中的“x”为串口编号,如第一个串口 则为“COM1”;dwDesiredAccess 为串口读写属性; dwShareMode指定该端口的共享属性,串行口不能作为共 享设备,故参数值必须为0;lpSecurityAttributes为安全属性,对于串口应该为0 ; dwCreationDisposition指文件的创建模式,对于串口必须为OPENEXISTING; dwFlagsAndAttributes描述了创建文件的其它属性,对于串行口,有效的设置只能是FILE-FLAG-OVERLAPPED 或者0,分别表示异步或同步读写; 参数hTemplateFile必须为NULL。 返回值:若成功,返回创建的句柄;否则返回INVALIDHANDLEVALUE。 2:串口的关闭。关闭串口相对简单,通过关闭句柄BOOL CloseHandle(HANDLE hObject )函数进行, hObject为打开串口时所得到的句柄。句柄关闭后,串口资源即释放,其它程序可以使用。 配置串口 串行口在打开后,将保持上一次使用的配置,要使之和外设进行通信,必须对串口进行配置,使之和外设保持 相同的串口配置,这样才能有效地配置外设并接收数据。在WIN32中,串口的配置主要通过一个称之为 COMMCONFIG的结构来实现,此结构包含了一个DCB结构,在DCB中,有波特率、数据位数、停止位、校验位等串 行口通信参数,对串口的配置主要即是对这些参数的配置。对COMMCONFIG进行配置的WIN32 API 主要有一下几 个: 1:获取默认配置函数。其原型为: BOOL GetDefaultCommConfig( LPCSTR lpszName, LPCOMMCONFIG lpCC, LPDWORD lpdwSize) 其参数如下: LpszName为设备名,如“COM1”; lpCC为COMMCONFIG结构体的指针。 LpdwSize是lpCC的大小。 通过使用此函数可以得到某串口的默认配置,此函数与机器硬件相关,在不同的机器上会有不同的结果,因而 容易出错,所以建议用户自己重写此函数,分别对COMMCONFIG的成员进行赋值,这样才稳定可靠。 2:得到串口的当前配置,原形如下: BOOL GetCommConfig( HANDLE hCommDev, LPCOMMCONFIG lpCC, LPDWORD lpdwSize ) 其参数同GetDefaultCommConfig(); 3:配置串口 BOOL SetCommConfig( HANDLE hCommDev,LPCOMMCONFIG lpCC, DWORD dwSize); 此函数将由hCommDev指定的串口按lpCC结构体中的内容进行配置。LPCOMMCONFIG结构体中的主要成员是设备控 制块结构DCB,在DCB中指定了设备的波特率,奇偶校验位,流控,停止位等参数。 4:配置串口的对话框 BOOL CommConfigDialog(LPCSTR lpszName,HWND hWnd,LPCOMMCONFIG lpCC ) 此函数提供了一个用户熟悉的串口配置对话框,其句柄为hWnd。用户可在此对话框中进行对lpszName指示的串 口配置,配置结果存放在lpCC所指向的COMMCONFIG结构体中。 5:设置缓冲区 WIN32环境下读写串口已经不是传统方式下针对串口的UART进行,而是提供一缓冲区,串口的读写都是针对于此 缓冲区进行。确定缓冲区的大小比较重要,太大浪费资源,太小又会使有效数据丢失。用户必须在串口读写前计算出外设流量的大小,按照宁大勿小、有所冗余的原则确定合适大小的缓冲区,再使用SetupComm()函数对串 口进行设置。其原型如下: BOOL SetupComm(HANDLE hFile,DWORD dwInQueue,DWORD dwOutQueue); hFile为打开串口时所得到的句柄; dwInQueue为输入缓冲区的大小,以字节为单位; dwOutQueue为输出缓冲区的大小。6:设置超时 数据通信过程中可能会发生的不可预测的事件,如数据传输电缆损坏、外设意外失效中断,或者发送数据突然停止等等。通信应用程序的一个关键问题就是如何处理通信中的不可预测的事件,处理错误事件的能力是一个通信应用程序优劣的重要标志。这些问题处理的不好可能会引起I/O线程挂起或者线程被无限阻塞。Windows对于这类问题提供了安全措施,用户可以通过超时设置来决定通信是否异常并作相应处理。因此超时设置在串行 通信中显得尤为重要。在Win32中提供了SetCommTimeouts()函数设置串口的超时值。 BOOL SetCommTimeouts(HANDLE hFile, LPCOMMTIMEOUTS lpCommTimeouts); hFile为打开串口时所得到的句柄; lpCommTimeouts为指向超时结构体的指针。读写串口 在打开串口并对其进行正确地和必要的配置后就可以用它进行通信即读写数据。读数据就是接收输入,些 数据就是向外设发送数据。读写数据通过两个API函数完成。 1:读数据函数 BOOL ReadFile ( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped data); hFile是由CreateFile()返回的句柄; lpBuffer是读取的数据缓冲区指针; nNumberOfBytesToRead是要读取的字节数; lpNumberOfBytesRead是实际读取的字节数的首地址; lpOverlapped 是指向一个可重叠I/O(异步)的数据结构指针。如果lpOverlapped设置为NULL,则ReadFile()工 作在同步方式;如果lpOverlapped指向一个重叠结构,则工作在异步方式。不管是同步还是异步, ReadFile()函数执行后将立刻返回。 2:写串口函数 BOOL WriteFile( HANDLE hFile, LPVOID lpBuffer, DWORD nNumberOfBytesToRead, LPDWORD lpNumberOfBytesRead, LPOVERLAPPED lpOverlapped data); 其参数的意义与读串口相似。 工作模式 在串口读写操作时,存在多种操作模式,从同步控制角度讲,有同步和异步方式,从编程角度讲,有查询 方式和事件驱动方式。在同步读串口时,如果串口缓冲区中内容没有读完,系统将处于等待状态,直至读完才返回;如果是异步读,即使缓冲区中没有读完,系统也将下行,执行下一句代码。如果串口的交互频繁,则宜使用异步读写,但对于一般采集而言,主要是读数据,写命令不多,一次读取的数据量又不会太大,所以使用同步较好,更易于控制。查询方式是指在一个无穷循环中直接读写串口数据,对于从串口读取数据来说,查询是最为直接、最简单的方法,但是这种方法效率较低,要花费大量的CPU时间。事件驱动方式是指线程通过监 视通信资源中的一组事件来进行读写操作,这种方式类似于DOS下的中断工作方式,效率高。监视事件的工作 是通过SetCommMask()和WaitCommEvent()函数进行的。在读或写操作中可以通过SetCommMask()函数设置事件屏蔽来监视指定通信资源上的事件,指定一组事件后,线程可以使用WaitCommEvent()函数等待其中一个事件发 生,在等待过程中线程将挂起,这样将花费极少的CPU时间,一旦有相应事件发生,WaitCommEvent()将返回, 告诉系统发生的事件,用户可以根据事件的内容确定相应的处理方式。在等待事件时,WaitCommEvent()函数将独占串口,此时串口既不能读也不能写,读写工作必须等WaitCommEvent()函数返回后进行。设置同步控制模式在打开串口时进行,由其第三个参数指定。 而在编程时采用事件驱动模式的函数有以下几个。 1:设置事件掩码 BOOL SetCommMask(HANDLE hFile,DWORD dwEvtMask); 其中hFile为打开串口的文件句柄。 DwEvtMask是设置的掩码,其形式和意义如下表所示 掩码 事件 EV_BREAK 在输入中检测到断点 EV_CTS CTS (clear-to-send) 信号改变状态 EV_DSR DSR (data-set-ready) 信号改变状态 EV_ERR 出现线路状态错误。 EV_RING 检测到振铃指示 EV_RLSD RLSD (receive-line-signal-detect) 信号改变状态 EV_RXCHAR 一个字符到达并存放于接收缓冲区 EV_RXFLAG 一个事件字符到达并存放于接收缓冲区,事件字符包含在设备的DCB中,由SetCommState 函数应用到串口 EV_TXEMPTY 发送缓冲区中的最后一个字符被送出 2:等待事件到来 BOOL SetCommMask(HANDLE hFile
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025昆明市呈贡区卫生健康系统编外合同制专业技术人员招聘(7人)模拟试卷附答案详解
- 高校软硬件设施维护计划
- 光相干长度与光学存储-洞察及研究
- 公共文化服务质量评价指标体系研究-洞察及研究
- 家庭支持与老年人隔离问题-洞察及研究
- 监管创新模式研究-洞察及研究
- 学生代表大会活动总结与心得
- 2025广东省中医院贵州医院第十三届贵州人才博览会引才19人考前自测高频考点模拟试题附答案详解(考试直接用)
- 煤炭价格波动预测-洞察及研究
- 基于位置的服务与车险定价-洞察及研究
- 四年级数学上册试题 一课一练2.3《平移与平行》习题1-北师大版(含答案)
- 小学英语外研版5A Unit2 They sell many different things Module 2部优课件
- 中国文学史概述
- 9.10.11有机、酸碱一般排-盛剑
- 完整版:美制螺纹尺寸对照表(牙数、牙高、螺距、小径、中径外径、钻孔)
- 毕业设计-太平哨水利枢纽引水式水电站设计
- 农村与区域发展概论样题 2
- 陈氏太极56式拳谱
- 小井眼套管开窗侧钻技术
- 机电技术应用专业岗位任务分析表
- 2019法考主观题考前聚焦2小时商法曹新川案例题参考答案
评论
0/150
提交评论