您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > Windows API在串口通信中的应用
1引言在很多情况下,远程监控和工业自动化领域系统经常采用串并口通信编程,其中串行接口被广泛地应用于工程实践的长距离通信中。运用Windows通信API可以在Windows环境下进行串口编程,不用对硬件直接进行操作,并通过VC、VB和Delphi等语言进行调用,大大方便了对数据的处理。本文对和串口通信相关的32位WindowsAPI函数进行了介绍,并给出了相应的程序实例。2WindowsAPI简介Win32API作为Microsoft32位平台(包括:Windows9x,WindowsNT3.1/4.0/5.0,WindowsCE)的应用程序编程接口,它是构筑所有32位Windows平台的基石,所有在Windows平台上运行的应用程序都可以调用这些函数。API是windows的核心,从事Windows应用程序开发,离不开对Win32API函数的调用。只有充分理解和利用API函数,才能深入到Windows的内部,充分挖掘系统提供的强大功能和灵活性。3WindowsAPI相关串口通信函数介绍在32位的Windows系统中,串口通信是作为文件处理的,串口操作一般为的打开、关闭、读取、写入等操作,相应的WindowsAPI函数如下:3.1打开和关闭串口1打开串口在Windows系统中串口通信会话以调用CreateFile()函数开始。CreateFile()函数可以读写访问串口,并返回一个句柄,并在以后的端口操作中使用。1.CreateFile()函数声明如下:2.HANDLECreateFile(3.LPCTSTRlpszNAME,//指定要打开的串口逻辑名4.DWORDfdwAccess,//指定串口访问的类型5.DWORDfdwShareMode,//指定端口的共享属性6.LPSECURITY_ATTRIBUTESlpsa,//引用安全属性结构SECURITY_ATTRIBUTES7.DWORDfdwCreate,//指定CreateFile()正在被已有的文件调用时应采取的措施8.DWORDfdwAttrsAndFlags,//描述端口的各种属性9.HANDLEhTemolateFile//指向模板文件的句柄10.)11.其中安全属性结构SECURITY_ATTRIBUTES结构声明如下:12.typedefstruct_SECURITY_ATTRIBUTES{13.DWORDnLength;//指明该结构的长度14.LPVOIDlpSecurityDescriptor;//指向一个安全描述字符15.BOOLbInheritHandle;//表明句柄是否能被继承16.}SECURITY_ATTRIBUTES;17.调用CreateFile()函数打开COM1串口操作如下所示:18.HANDLEhCOM;19.DWORDDWeRROR;20.hCom=Creatfile(“COM1”,//对串口1进行操作21.GENERIC_READ|GENERIC_WRITE,//允许读和写22.0,//独占方式23.NULL,24.OPEN_EXISTING,25.FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,//重叠方式26.NULL27.);28.if(hCOM==INVALID_HANDLE_VALUE)29.{30.dwError=GetLastError();//处理错误31.}一旦串口处于打开状态,就可以分配一个发送缓冲区和接收缓冲区,并且通过调用SetupComm()函数实现其他初始化工作。1.SetupComm()函数声明如下:2.BOOLSetupComm(3.HANDLEHfile,//由CreatFile()返回的指向已打开端口的句柄句柄4.DWORDdwInQueue,//输入缓冲区大小5.DWORDdwOutQueue//输出缓冲区大小6.);2关闭串口关闭串口通过调用CloseHandle()函数关闭由CreatHandle()函数返回的句柄来完成。1.CloseHandle()函数声明如下:2.BOOLCloseHandle(3.HANDLEhObject//需关闭的设备句柄4.);3.2串口配置和串口属性在用CreatFile()函数打开串口后,系统将根据上次打开串口时设置的值来初始化串口,可以集成上次打开操作后的数值,包括设备控制块(DCB)和超时控制结构(COMMTIMEOUTS)。如果是首次打开串口,Windows会使用缺省配置。1串口配置Windows2000中使用GetCommState()函数获取串口的当前配置,使用SetCommState()函数重新分配串口资源的各个参数。1.GetCommState()函数声明如下:2.BOOLGetCommState(3.HANDLEhFile,//由CreatFile()函数返回的指向已打开的串口的句柄4.LPDCBlpDCB//指向device-controlblockstructure的指针5.);6.其中DCB的结构声明如下:7.typedefstruct_DCB{8.DWORDDCBlength;//DCB块大小9.DWORDBaudRate;//数据传输率10.DWORDfBinary:1;//二进制模式,不检验EOF11.DWORDfParity:1;//允许奇偶校验12.DWORDfOutCtsFlow:1;//CTS输出流控制13.DWORDfOutDsrFlow:1;//DSR输出流控制14.DWORDfDtrContorl:2;//DTR流控制类型15.DWORDfDsrSensitivity:1;//对DTR信号线是否敏感16.DWORDfTXContinueOnOxff:1;//XOFFcontinueTx17.DWORDfOutX:1;//XON/XOFF输出流控制18.DWORDfInX:1;//XON/XOFF输入流控制19.DWORDfErrorChar:1;//错误替换20.DWORDfNull:1;//是否丢弃接收到的NULL字符21.DWORDfRtsControl:2;//RTS流控制22.DWORDfAbortOnError:1;//发送错误,指定是否终止读、写操作23.DWORDfDummy2:17;//保留24.WORDwReserved;//现在不用25.WORDXonLim;//XOFF字符发送之前接收到缓冲区中可允许的最小字节数26.WORDXoffLim;//XOFF字符发送之前缓冲区中可允许的最小可用字节数27.BYTEByteSize;//端口当前使用的数据位数28.BYTEParity;//当前使用的奇偶校验法29.BYTEStopBits;//当前使用的停止位数30.charXonChar;//发送和接收的XON字符值31.charXoffChar;//发送和接收的XOFF字符值32.charErrorChar;//用来替代接收到的奇偶校验发生错误的字符33.charEofChar;//表示数据的结束34.charEvtChar;//事件字符35.WORDwReserved1;//保留的位36.}DCB;如果GetCommState()函数调用成功,则返回值不为零。若函数调用失败,则返回值为零,可以调用GetLastError()函数来获取进一步的错误信息。GetLastError()也是WindowsAPI函数,函数声明如下:DWORDGetLastError(VOID);如果应用程序需要修改配置,可以通过调用GetCommState()函数获得当前的DCB结构,然后更改DCB结构中的参数,调用SetCommState()函数配置修改过的DCB来配置端口。1.SetCommState()函数声明如下:2.BOOLSetCommState(3.HANDLEhFile,//由CreatFile()函数返回的已打开的串口的句柄4.LPDCBlpDCB//指向DCB结构的指针5.);2串口属性串口的属性通过GetCommProperties()函数获得,GetCommProperties()函数声明如下:1.BOOLGetCommProperties(2.HANDLEhFile,//返回句柄3.LPCOMMPROPlpCommProp//指向COMMPROP的结构4.);其中lpCommProp指向一个COMMPROP的结构,串口的性能从COMMPROP中返回。3通信设备配置WindowsAPI提供了CommConfigDialog()函数对通信设备进行配置,从中改变数据传输速率、数据位、奇偶校验方法、停止位和流控制方法。1.CommConfigDialog()函数的声明如下:2.BOOLCommConfigDialog(3.LPTSTRlpszName,//要配置的端口名4.HWNDhWnd,//拥有对话框的窗口句柄5.LPCOMMCONFIGlpCC//指向一个COMMCONFIG结构6.);当CommConfigDialog()函数返回时,选定的设置在COMMFIG的DCB参数中返回,对已打开的串口,对端口设置进行更改通过SetCommState()函数来改变。3.3读写串口1读串口操作一般在程序中使用Win32APIReadFile()函数从串口中读取数据。ReadFile()函数声明如下:1.BOOLReadFile(2.HANDLEhFILE,//指向由CreatFile()函数产生的句柄3.LPVOIDlpbuffer,//指向一个缓冲区4.DWORDnNumberOfBytesToRead,//读取的字节数5.LPDWORDlpNumberOfBytesToRead,//指向调用该函数读出的字节数6.LPOVERLAPPEDlpOverlapped//一个OVERLAPPED结构7.);2写串口操作一般在程序中使用Win32APIWriteFile()函数向串口中写数据。WriteFile()函数声明如下:1.BOOLWriteFile(2.HANDLEhFILE,//指向由CreatFile()函数产生的句柄3.LPVOIDlpbuffer,//指向一个缓冲区4.DWORDnNumberOfBytesToWrite,//向串口设备写入的字节数5.LPDWORDlpNumberOfBytesToWritten,//指向调用该函数已写入的字节数6.LPOVERLAPPEDlpOverlapped//一个OVERLAPPED结构7.);3异步I/O操作读、写串口操作中的OVERLAPPED结构用于在Windows中进行异步I/O操作,使应用程序可以在前台、后台同时执行不同的任务,并由GetOverLappedResult()函数获取结果。OVERLAPPED结构类型声明如下:1.Typedefstruct_OVERLAPPED{2.DWORDInternal;//指出一个和系统相关的状态3.DWORDInternalHigh;//指出发送或接收的数据长度4.DWORDOffset;5.DWORDOffsetHigh;//Offset和OffsetHigh指明文件传送的开始位置和字节偏移量6.HANDLEhEvent;//指定一个I/O操作完成后出发的事件7.}OVERLAPPED;8.异步I/O操作可以由GetOverLappedResult()函数来获取结果。9.GetOverLappedResult()函数声明如下:10.BOOLGetOverLappedResult(11.HANDLEhFILE,//标识通信句柄,开始调用重叠结构ReadFile、WriteFile12.LPOVERLAPPEDlpOverlapped,//启动异步操作时指定的OVERLAPPED结构13.LPDWORDlpNumberOfBytesTransferred,//接收读、写操作实际传递的字节数14.BOOLbWait//指定函数是否等待挂起的异步操
本文标题:Windows API在串口通信中的应用
链接地址:https://www.777doc.com/doc-310336 .html