VC串口编程API详解
- 格式:docx
- 大小:197.05 KB
- 文档页数:11
VC CSerialPort类的使用方法详解API 参考:接口由两个类组成:CSerialException、CSerialPort。
其成员函数和成员变量清单如下:CSerialException::CSerialExceptionCSerialException::GetErrorMessageCSerialException::m_dwErrorCSerialPort::CSerialPortCSerialPort::~CSerialPortCSerialPort::OpenCSerialPort::CloseCSerialPort::AttachCSerialPort::DetachCSerialPort::operator HANDLECSerialPort::IsOpenCSerialPort::DumpCSerialPort::ReadCSerialPort::ReadExCSerialPort::WriteCSerialPort::WriteExCSerialPort::TransmitCharCSerialPort::GetOverlappedResult CSerialPort::CancelIo CSerialPort::GetConfig CSerialPort::GetDefaultConfig CSerialPort::SetConfig CSerialPort::SetDefaultConfig CSerialPort::ClearBreak CSerialPort::SetBreak CSerialPort::ClearError CSerialPort::GetStatus CSerialPort::GetState CSerialPort::SetState CSerialPort::Escape CSerialPort::ClearDTR CSerialPort::ClearRTS CSerialPort::SetDTR CSerialPort::SetRTS CSerialPort::SetXOFF CSerialPort::SetXON CSerialPort::GetProperties CSerialPort::GetModemStatus CSerialPort::SetTimeouts CSerialPort::GetTimeoutsCSerialPort::Set0TimeoutCSerialPort::Set0WriteTimeoutCSerialPort::Set0ReadTimeoutCSerialPort::SetMaskCSerialPort::GetMaskCSerialPort::WaitEventCSerialPort::FlushCSerialPort::PurgeCSerialPort::TerminateOutstandingWritesCSerialPort::TerminateOutstandingReadsCSerialPort::ClearWriteBufferCSerialPort::ClearReadBufferCSerialPort::SetupCSerialPort::OnCompletionCSerialPort::BytesWaitingCSerialPort::DataWaitingCSerialException::CSerialExceptionCSerialException( DWORD dwError = 0);参数dwError 导致异常的错误。
串口调试助手源程序及编程详细过程作者:龚建伟 2001.6.20可以任意转载,但必须注明作者和说明来自,不得作为商用目次:1.建立项目2.在项目中插入MSComm控件3.利用ClassWizard定义CMSComm类控制变量4.在对话框中添加控件5.添加串口事件消息处理函数OnComm()6.打开和设置串口参数7.发送数据在众多网友的支持下,串口调试助手从2001年5月21日发布至今,短短一个月,在全国各地累计下载量近5000人次,在近200多个电子邮件中,20多人提供了使用测试意见,更有50多位朋友提出要串口调试助手的源代码,为了答谢谢朋友们的支持,公开推出我最初用VC控件MSComm编写串口通信程序的源代码,并写出详细的编程过程,姑且叫串口调试助手源程序V1.0或VC串口通讯源程序吧,我相信,如果你用VC编程,那么有了这个代码,就可以轻而易举地完成串口编程任务了。
(也许本文过于详细,高手就不用看)开始吧:1.建立项目:打开VC++6.0,建立一个基于对话框的MFC应用程序SCommTest(与我源代码一致,等会你会方便一点);2.在项目中插入MSComm控件选择Project菜单下Add To Project子菜单中的 Components and Controls…选项,在弹出的对话框中双击Registered ActiveX Controls项(稍等一会,这个过程较慢),则所有注册过的ActiveX 控件出现在列表框中。
选择Microsoft Communications Control, version 6.0,,单击Insert按钮将它插入到我们的Project中来,接受缺省的选项。
(如果你在控件列表中看不到Microsoft Communications Control, version6.0,那可能是你在安装VC6时没有把ActiveX一项选上,重新安装VC6,选上ActiveX就可以了),这时在ClassView视窗中就可以看到CMSComm类了,(注意:此类在ClassWizard中看不到,重构clw文件也一样),并且在控件工具栏Controls中出现了电话图标(如图1所示),现在要做的是用鼠标将此图标拖到对话框中,程序运行后,这个图标是看不到的。
学校logo[请输入论文题目]专业:[请输入专业]班级:[请输入班级]学生姓名:[请输入姓名]指导教师:[请输入指导教师]完成时间:2013年3月29日用VC 6.0实现串行通信的三种方法---- 摘要:本文介绍了在Windows平台下串行通信的实现机制,讨论了根据不同的条件用Visual C++ 设计串行通信程序的三种方法,并结合实际,实现对温度数据的接收监控。
---- 在实验室和工业应用中,串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛。
依据不同的条件实现对串口的灵活编程控制是我们所需要的。
---- 在光学镜片镀膜工艺中,用单片机进行多路温度数据采集控制,采集结果以串行方式进入主机,每隔10S向主机发送一次采样数据,主机向单片机发送相关的控制命令,实现串行数据接收,处理,记录,显示,实时绘制曲线。
串行通信程序开发环境为VC++ 6.0。
---- Windows下串行通信---- 与以往DOS下串行通信程序不同的是,Windows不提倡应用程序直接控制硬件,而是通过Windows操作系统提供的设备驱动程序来进行数据传递。
串行口在Win 32中是作为文件来进行处理的,而不是直接对端口进行操作,对于串行通信,Win 32 提供了相应的文件I/O函数与通信函数,通过了解这些函数的使用,可以编制出符合不同需要的通信程序。
与通信设备相关的结构有COMMCONFIG ,COMMPROP,COMMTIMEOUTS,COMSTA T,DCB,MODEMDEVCAPS,MODEMSETTINGS共7个,与通信有关的Windows API函数共有26个,详细说明可参考MSDN帮助文件。
以下将结合实例,给出实现串行通信的三种方法。
---- 实现串行通信的三种方法---- 方法一:使用VC++提供的串行通信控件MSComm 首先,在对话框中创建通信控件,若Control工具栏中缺少该控件,可通过菜单Project --> Add to Project --> Components and Control插入即可,再将该控件从工具箱中拉到对话框中。
用VC++编写USB接口通讯程序摘要:详细介绍Visual C++ 6.0环境下利用Windows API(Application Program Interface)函数来实现与符合HID设备类的USB接口通讯,并给出了通信程序的部分代码。
关键词:通用串行总线人际接口设备API VisualC++1 引言在USB出现之前,计算机的典型接口有并行口(打印口)、串行口、鼠标口、键盘口、显示器口、游戏口及各种卡式接口(如声卡、网卡)等,与这些接口对应的有各种不同的电缆。
在传输速度方面,这些接口都存在速度偏低的问题;在技术方面,这种设计容易产生I/O冲突。
中断(IRQ)不够用,以及对于每一种新的外设都必须设计新的接口卡等缺点。
当今的计算机外部设备,都在追求高速度和高通用型。
USB接口适应了这种要求,并以其速度快,使用方便,成本低等优点,迅速得到了众多PC厂商和半导体厂商的大力支持,外设向USB过渡称为必然的趋势。
但如果主机PC不知道如何与USB外设通信,那么这个USB外设一点用处都没有,人机接口设备(HID)类是Windows完全支持的第一批USB设备类型中的一种。
在运行Windows98或更高版本的PC机上,应用程序可以使用操作系统内置的驱动与HID通信,但与HID通信不像打开一个端口,设定几个参数,然后就可以读写数据那么简单。
在应用程序能与HID交换数据之前,它先要找到设备,获取有关它的报告信息,为做到这些,应用程序必须通过访问通信API函数,使位于上层的应用程序与位于下层的设备驱动程序进行数据交换。
应用程序可以使用任何能访问API函数的编程语言,C++是一种能访问API函数的功能强大的语言,本文将在VisualC++6.0环境下编写与USB设备通信的Windows程序。
2 USB简介USB是由Intel,Compaq,Digital,IBM,Microsoft,NEC,Northern Telecom等七家世界著名的计算机和通信公司共同推出的新一代接口标准,全称为Universal Serial Bus(通用串行总线)。
VC++串口通信编程详解在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信。
串口通信方便易行,应用广泛。
一般情况下,工控机和各智能仪表通过RS485总线进行通信。
RS485的通信方式是半双工的,只能由作为主节点的工控PC机依次轮询网络上的各智能控制单元子节点。
每次通信都是由PC机通过串口向智能控制单元发布命令,智能控制单元在接收到正确的命令后作出应答。
在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序简单,但欠灵活。
其二是调用Windows 的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活。
本文我们只介绍API串口通信部分。
串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式)。
同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞。
无论那种操作方式,一般都通过四个步骤来完成:(1)打开串口(2)配置串口(3)读写串口(4)关闭串口1、打开串口Win32系统把文件的概念进行了扩展。
无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的。
该函数的原型为:C++代码1. HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile);lpFileName:将要打开的串口逻辑名,如“COM1”;dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列;dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0;lpSecurityAttributes:引用安全性属性结构,缺省值为NULL;dwCreationDistribution:创建标志,对串口操作该参数必须置为OPEN_EXISTING;dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O操作;hTemplateFile:对串口而言该参数必须置为NULL。
4.4.1 RS-232C 接口介绍在介绍具体的RS-232 函数库之前,本节先简要介绍RS-232C 接口。
美国电子工业协会(EIA)公布的RS-232C 是用的最多的一种串行通信标准,它是从CCITT 远程通信标准中导出的,用于数据终端设备(DTE)和数据通信设备(DEC)之间的接口。
该标准包括按位串行传输的电气和机械方面的规定。
一、接口信号RS-232C 的机械指标规定:RS-232C 接口通向外部的连接器(插针插座)是一种“D”型25 针插头。
由于25 芯中有许多是不常用的,IBM-PC 对其进行了简化,取了其中的常用的9 芯,构成了9 芯RS-232C 串行接口,使其成为一种事实上的串行接口标准配置。
RS-232C 的“D”型9 针插头引脚定义如图4-13 所示。
RS-232C 标准接口中的主要信号是“发送数据”和“接收数据”,它们用来在两个系统或设备之间传送串行信息。
对于异步通信,传输的串行位数据信息的单位是字符。
二、数据传送格式和电气特性图4-14 示出了RS-232C 以位串行方式传输数据的格式,这是微机系统中最通用的格式。
7 位ASCII 码数据的连续传送由最低有效数字位开始,而以奇偶校验位结束。
应当指出,RS-232C 标准接口并不限于ASCII 数据,事实上还可有5 到8 个数据位,后加一奇偶校验位,并有1 或2 位停止位。
在电性能方面,这一标准使用负逻辑。
逻辑1 电平是在-15V 到-5V 范围内,逻辑0电平则在+5V 到+15V 范围内。
它要求RS-232C 接收器必须能识别低至+3V 的信号作为逻辑0,而识别高至-3V 的信号作为逻辑1,这意味着有2V 的噪声容限。
RS-232C 进行数据传输的最高速率为20KB/S,通信距离最长为15m。
4.4.2 RS-232 函数库概述LabWindows/CVI 6.0 提供的RS-232 函数库主要包括以下几类函数:串行口打开/关闭(Open/Close)函数,串行口输入/输出(Input/Output)函数,串行口控制(Control)函数,串行口状态查询(Status)函数,串行口事件处理(Callbacks)函数。
在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信。
串口通信方便易行,应用广泛。
一般情况下,工控机和各智能仪表通过RS485总线进行通信。
RS485的通信方式是半双工的,只能由作为主节点的工控PC机依次轮询网络上的各智能控制单元子节点。
每次通信都是由PC机通过串口向智能控制单元发布命令,智能控制单元在接收到正确的命令后作出应答。
在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序简单,但欠灵活。
其二是调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活。
本文我们只介绍API串口通信部分。
串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式)。
同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞。
无论那种操作方式,一般都通过四个步骤来完成:(1)打开串口(2)配置串口(3)读写串口(4)关闭串口(1)打开串口Win32系统把文件的概念进行了扩展。
无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的。
该函数的原型为:HANDLE CreateFile( LPCTSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,DWORD dwCreationDistribution,DWORD dwFlagsAndAttributes,HANDLE hTemplateFile);•lpFileName:将要打开的串口逻辑名,如“COM1”;•dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列;•dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0;•lpSecurityAttributes:引用安全性属性结构,缺省值为NULL;•dwCreationDistribution:创建标志,对串口操作该参数必须置为OPEN_EXISTING;•dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O操作;•hTemplateFile:对串口而言该参数必须置为NULL;同步I/O方式打开串口的示例代码:HANDLE hCom; //全局变量,串口句柄hCom=CreateFile("COM1",//COM1口GENERIC_READ|GENERIC_WRITE, //允许读和写0, //独占方式NULL,OPEN_EXISTING, //打开而不是创建0, //同步方式NULL);if(hCom==(HANDLE)-1){AfxMessageBox("打开COM失败!");return FALSE;}return TRUE;重叠I/O打开串口的示例代码:HANDLE hCom; //全局变量,串口句柄hCom =CreateFile("COM1", //COM1口GENERIC_READ|GENERIC_WRITE, //允许读和写0, //独占方式NULL,OPEN_EXISTING, //打开而不是创建FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //重叠方式NULL);if(hCom ==INVALID_HANDLE_VALUE){AfxMessageBox("打开COM失败!");return FALSE;}return TRUE;(2)、配置串口在打开通讯设备句柄后,常常需要对串口进行一些初始化配置工作。
VC 串口编程基础之如何用VC 打开串口和关闭串口在对串口进行操作之前都需要先打开串口,VC 串口编程方法分为利用VC 串口控件(或VC 串口类)和直接调用Windows底层API函数(我称之为VC API 串口编程)两种方法,不管哪种方法,其实质都是利用底层API函数对串口进行操作,这里我们来看怎么利用API函数来用VC 打开串口。
在Windows 32位以上操作系统(Win98以上)中,将串口(包括其它通信设备)作为文件来处理,所以串口的打开、读写和关闭所用API函数与文件操作函数一样。
所以打开串口用CreateFile,读串口用ReadFile,写串口用WriteFile,关闭串口用CloseHandle。
一、用VC 打开串口、关闭串口的API函数1、打开串口用CreateFile,其声明如下:1HANDLE CreateFile(2LPCTSTR lpFileName, // file name3DWORD dwDesiredAccess, // access mode4DWORD dwShareMode, // sha re mode5LPSECURITY_ATTRIBUTES lpSecurityAttributes, // SD6DWORD dwCreationDisposition, // how to create7DWORD dwFlagsAndAttributes, // file attributes8HANDLE hTemplateFile // handle to template file9);部分参数解释如下:●lpFileNam e:指定要打开的串口逻辑名,用字符串表示,如“COM1”和“COM2”分别表示串口1和串口2,若要知道您的电脑有哪此串口,可以打开设备管理器查看,如下图所示,或用丁丁串口调试助手,这个工具启动后会枚举系统当前存在的串口。
●dwDesiredAccess:访问类型,有读(dwDesiredAccess=GENERIC_READ)、写(dwDesiredAccess=GENERIC_WRITE)或两者兼有((dwDesiredAccess=GENERIC_READ | GENERIC_WRITE)。
1.添加C++类 CCESeries下面是CCESeries.h 文件的内容:#pragma once//定义串口接收数据函数类型//这是一个回调函数,执行该函数时,表示串口接收到了数据。
typedef void (CALLBACK* ONSERIESREAD)(void * pOwner /*父对象指针*/ ,BYTE* buf /*接收到的缓冲区*/,DWORD dwBufLen /*接收到的缓冲区长度*/);class CCESeries{public:CCESeries(void); //CCESeries类的构造函数~CCESeries(void); //CCESeries类的析构函数public://打开串口BOOL OpenPort(void* pOwner,/*指向父指针*/UINT portNo = 1, /*串口号*/UINT baud = 9600, /*波特率*/UINT parity = NOPARITY, /*奇偶校验*/UINT databits = 8, /*数据位*/UINT stopbits = 0 /*停止位*/);//关闭串口void ClosePort();//同步写入数据BOOL WriteSyncPort(const BYTE*buf , DWORD bufLen);//设置串口读取、写入超时BOOL SetSeriesTimeouts(COMMTIMEOUTS CommTimeOuts);//得到串口是否打开BOOL GetComOpened();private://串口读线程函数,该函数被定义成私有静态。
static DWORD WINAPI ReadThreadFunc(LPVOID lparam);private://关闭读线程,当使用完串口后,便调用这个函数退出串口数据接收线程。
void CloseReadThread();private://已打开的串口句柄// HANDLE m_hComm;//读线程句柄HANDLE m_hReadThread;//读线程ID标识DWORD m_dwReadThreadID;//读线程退出事件HANDLE m_hReadCloseEvent;BOOL m_bOpened; //串口是否打开void * m_pOwner; //指定父对象指针public:ONSERIESREAD m_OnSeriesRead; //串口读取回调函数HANDLE m_hComm;};2.下面是CCESeries.cpp文件的内容:#include "StdAfx.h"#include "CESeries.h"//构造函数,将m_hComm初始化为无效的句柄CCESeries::CCESeries(){//初始化内部变量m_hComm = INVALID_HANDLE_VALUE;m_OnSeriesRead = NULL;m_bOpened = 0;}//析构函数,检测如果串口是打开的,则关闭串口CCESeries::~CCESeries(){if (m_bOpened){//关闭串口ClosePort();}}//串口读线程函数,该线程用于异步接收串口数据。
V C串口编程A P I详解集团企业公司编码:(LL3698-KKI1269-TM2483-LUI12689-ITT289-V C++串口编程主要A P I详解该文档是本人在刚刚接触到VC++下的串口编程时,总结归纳的一些主要的API函数,可以帮助初学者更好的理解串口编程的方法。
1.打开串口HANDLECreateFile(LPCTSTRlpFileName, DWORDdwDesiredAccess,DWORDdwShareMode,LPSECURITY_ATTRIBUTESlpSecurityAttributes,DWORDdwCreationDistribution,DWORDdwFlagsAndAttributes,HANDLEhTemplateFile);参数:lpFileName:将要打开的串口逻辑名,如“COM1”;dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列;dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0;lpSecurityAttributes:引用安全性属性结构,缺省值为NULL;dwCreationDistribution:创建标志,对串口操作该参数必须置为OPEN_EXISTING;dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O操作,本工程采用异步方式;hTemplateFile:对串口而言该参数必须置为NULL;2.获取串口设备控制块DCBBOOLGetCommState(HANDLEhFile, //标识通讯端口的句柄,由CreateFile()函数返回的句柄LPDCBlpDCB //指向一个设备控制块(DCB结构)的指针);3.设置串口设备控制块DCBBOOLSetCommState(HANDLEhFile,//标识通讯端口的句柄,由CreateFile()函数返回的句柄LPDCBlpDCB//指向一个设备控制块(DCB结构)的指针);4.设置串口输入输出缓冲区大小BOOLSetupComm(HANDLEhFile, //通信设备的句柄DWORDdwInQueue, //输入缓冲区的大小(字节数)DWORDdwOutQueue //输出缓冲区的大小(字节数));5.清空读写缓冲区内容BOOLPurgeComm(HANDLEhFile, //串口句柄DWORDdwFlags //需要完成的操作);参数dwFlags指定要完成的操作,可以是下列值的组合:PURGE_TXABORT 中断所有写操作并立即返回,即使写操作还没有完成。
PURGE_RXABORT 中断所有读操作并立即返回,即使读操作还没有完成。
PURGE_TXCLEAR 清除输出缓冲区PURGE_RXCLEAR 清除输入缓冲区6.超时时间获取与设置BOOLGetCommTimeouts( //获取串口超时设置HANDLEhFile, //标识通信设备,CreateFile()函数返回该句柄;LPCOMMTIMEOUTSlpCommTimeouts //指向COMMTIMEOUTS结构。
);BOOLSetCommTimeouts(//设置串口超时时间HANDLEhFile, //标识通信设备,CreateFile()函数返回该句柄;LPCOMMTIMEOUTSlpCommTimeouts //指向COMMTIMEOUTS结构。
);COMMTIMEOUTS结构的定义为:typedefstruct_COMMTIMEOUTS{DWORDReadIntervalTimeout;//读间隔超时,单位ms DWORDReadTotalTimeoutMultiplier;//读时间系数,单位ms DWORDReadTotalTimeoutConstant;//读时间常量,单位ms DWORDWriteTotalTimeoutMultiplier;//写时间系数,单位ms DWORDWriteTotalTimeoutConstant;//写时间常量,单位ms}COMMTIMEOUTS,*LPCOMMTIMEOUTS;参数详解:·ReadIntervalTimeout:以ms为单位指定通信线路上两个字符到达之间的最大时间间隔。
在ReadFile()操作期间,从接收到第一个字符时开始计时。
如果任意两个字符到达之间的时间间隔超过这个最大值,则ReadFile()操作完成,并返回缓冲数据。
如果被置为0,则表示不使用间隔超时。
Windows使用下面的式子计算总超时时间:ReadTotalTimeout=(ReadTotalTimeoutMultiplier*bytes_to_read)+Rea dTotalTimeoutConstant;WriteTotalTimeout=(WriteTotalTimeoutMultiplier*bytes_to_write)+ WriteTotalTimeoutConstant;超时有两种类型。
第一种类型叫区间超时(intervaltimeout),它仅适应于从端口读取数据它指定在读取两个字符之间要经历多长时间。
接收一个字符时,Windows 就启动一个内部计时器。
在下一个字符到达之前,如果定时器超过了区间超时设定时间,读函数就会放弃。
第二种类型的超时叫做总超时(totaltimeout),它适于读和写端口。
当读或写特定字节数需要的总时间超过某一阈值时,该超时即被触发。
当超时的常数和系数都设置为0,则没有总超时时间。
如果读间隔超时被设置成MAXDWORD并且读时间系数和读时间常量都为0,那么在读一次输入缓冲区的内容后读操作就立即返回而不管是否读入了要求的字符。
在用异步方式读写串口时,虽然ReadFile和WriteFile在完成操作以前就可能返回,但超时仍然是起作用的。
在这种情况下,超时规定的是操作的完成时间,而不是ReadFile和WriteFile的返回时间。
7.关闭串口BOOLCloseHandle(HANDLEhObject;//串口句柄);8.读写串口BOOLReadFile(HANDLEhFile, //串口的句柄LPVOIDlpBuffer, //读入的数据存储的地址,DWORDnNumberOfBytesToRead, //要读入的数据的字节数LPDWORDlpNumberOfBytesRead,//指向一个DWORD数值,该数值返回读操作实际读入的字节数LPOVERLAPPEDlpOverlapped //异步操作时,该参数指向一个OVERLAPPED结构,同步操作时,该参数为NULL。
);BOOLWriteFile(HANDLEhFile, //串口的句柄LPCVOIDlpBuffer, //写入的数据存储的地址,DWORDnNumberOfBytesToWrite, //要写入的数据的字节数LPDWORDlpNumberOfBytesWritten,//指向指向一个DWORD数值,该数值返回实际写入的字节数LPOVERLAPPEDlpOverlapped //重叠操作时,该参数指向一个OVERLAPPED结构,同步操作时,该参数为NULL。
);在同步执行时,函数直到操作完成后才返回。
这意味着同步执行时线程会被阻塞,从而导致效率下降。
在异步执行时,即使操作还未完成,这两个函数也会立即返回,费时的I/O操作在后台进行。
如果操作成功,这两个函数都返回TRUE。
需要注意的是,当ReadFile和WriteFile返回FALSE时,不一定就是操作失败,应该调用GetLastError函数分析返回的结果。
例如,在异步操作时如果操作还未完成函数就返回,那么函数就返回FALSE,而且GetLastError函数返回ERROR_IO_PENDING。
这说明异步操作还未完成。
9.清除错误BOOLClearCommError(HANDLEhFile, //串口句柄LPDWORDlpErrors, //指向接收错误码的变量LPCOMSTATlpStat //指向通讯状态缓冲区);该函数获得通信错误并报告串口的当前状态,同时,该函数清除串口的错误标志以便继续输入、输出操作。
在使用ReadFile函数进行读操作前,应先使用ClearCommError函数清除错误。
参数lpStat指向一个COMSTAT结构,该结构返回串口状态信息。
COMSTAT结构COMSTAT结构包含串口的信息,结构定义如下:typedefstruct_COMSTAT{//cstDWORDfCtsHold:1;//TxwaitingforCTSsignal DWORDfDsrHold:1;//TxwaitingforDSRsignal DWORDfRlsdHold:1;//TxwaitingforRLSDsignal DWORDfXoffHold:1;//Txwaiting,XOFFcharrec''d DWORDfXoffSent:1;//Txwaiting,XOFFcharsentDWORDfEof:1;//EOFcharactersentDWORDfTxim:1;//characterwaitingforTx DWORDfReserved:25;//reservedDWORDcbInQue;//bytesininputbufferDWORDcbOutQue;//bytesinoutputbuffer}COMSTAT,*LPCOMSTAT;10.设置通讯端口监听事件BOOLSetCommMask(HANDLEhFile,//标识通信端口的句柄DWORDdwEvtMask//能够使能的通信事件);通讯端口的事件由dwEvtMask变量来设置,其可取如下值:EV_BREAK 检测到输入为止EV_CTSCTS (清除发送)信号改变状态EV_DSRDSR (数据设置就绪)信号改变状态EV_ERR发生了线路状态错误.线路状态错误为:CE_FRAME(帧错误)CE_OVERRUN(接收缓冲区超限)CE_RXPARITY(奇偶校验错误)EV_RING检测到振铃EV_RLSDRLSD(接收线路信号检测)信号改变状态EV_RXCHAR接收到一个字符,并放入输入缓冲区EV_RXFLAG使用SetCommState()函数设置的DCB结构中的等待字符已被传入输入缓冲区中。
EV_TXEMPTY输出缓冲区中最后一个字符发送出去在用SetCommMask指定了有用的事件后,应用程序可调用WaitCommEvent()来等待事件发生。