Windows API在串口通信中的应用.doc

上传人:赵** 文档编号:50938900 上传时间:2022-10-16 格式:DOC 页数:6 大小:80.50KB
返回 下载 相关 举报
Windows API在串口通信中的应用.doc_第1页
第1页 / 共6页
Windows API在串口通信中的应用.doc_第2页
第2页 / 共6页
点击查看更多>>
资源描述

《Windows API在串口通信中的应用.doc》由会员分享,可在线阅读,更多相关《Windows API在串口通信中的应用.doc(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、1 引言 在很多情况下,远程监控和工业自动化领域系统经常采用串并口通信编程,其中串行接口被广泛地应用于工程实践的长距离通信中。运用Windows通信API可以在Windows环境下进行串口编程,不用对硬件直接进行操作,并通过VC、VB和Delphi等语言进行调用,大大方便了对数据的处理。本文对和串口通信相关的32位Windows API函数进行了介绍,并给出了相应的程序实例。 2 Windows API简介Win32 API作为 Microsoft 32位平台(包括:Windows 9x,Windows NT3.14.05.0,WindowsCE)的应用程序编程接口,它是构筑所有32位Wind

2、ows平台的基石,所有在Windows平台上运行的应用程序都可以调用这些函数。API是windows的核心,从事Windows应用程序开发,离不开对Win32 API函数的调用。只有充分理解和利用API函数,才能深入到Windows的内部,充分挖掘系统提供的强大功能和灵活性。 3 Windows API相关串口通信函数介绍 在32位的Windows系统中,串口通信是作为文件处理的,串口操作一般为的打开、关闭、读取、写入等操作,相应的Windows API 函数如下:3.1 打开和关闭串口1 打开串口在Windows系统中串口通信会话以调用CreateFile ( )函数开始。CreateFil

3、e ( )函数可以读写访问串口,并返回一个句柄,并在以后的端口操作中使用。1. CreateFile()函数声明如下: 2. HANDLECreateFile( 3. LPCTSTRlpszNAME,/指定要打开的串口逻辑名 4. DWORDfdwAccess,/指定串口访问的类型 5. DWORDfdwShareMode,/指定端口的共享属性 6. LPSECURITY_ATTRIBUTESlpsa,/引用安全属性结构SECURITY_ATTRIBUTES 7. DWORDfdwCreate,/指定CreateFile()正在被已有的文件调用时应采取的措施 8. DWORDfdwAttrsA

4、ndFlags,/描述端口的各种属性 9. HANDLEhTemolateFile/指向模板文件的句柄 10. ) 11. 其中安全属性结构SECURITY_ATTRIBUTES结构声明如下: 12. typedefstruct_SECURITY_ATTRIBUTES 13. DWORDnLength;/指明该结构的长度 14. LPVOIDlpSecurityDescriptor;/指向一个安全描述字符 15. BOOLbInheritHandle;/表明句柄是否能被继承 16. SECURITY_ATTRIBUTES; 17. 调用CreateFile()函数打开COM1串口操作如下所示:

5、 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. NULL 27. ); 28. if(hCOM=INVALID_HANDLE_VALUE) 29. 30. dwError=GetLastError();/处理错误 31. 一旦串口处于

6、打开状态,就可以分配一个发送缓冲区和接收缓冲区,并且通过调用SetupComm( )函数实现其他初始化工作。1. SetupComm()函数声明如下: 2. BOOLSetupComm( 3. HANDLEHfile,/由CreatFile()返回的指向已打开端口的句柄句柄 4. DWORDdwInQueue,/输入缓冲区大小 5. DWORDdwOutQueue/输出缓冲区大小 6. ); 2关闭串口关闭串口通过调用CloseHandle ( )函数关闭由CreatHandle ( )函数返回的句柄来完成。1. CloseHandle()函数声明如下: 2. BOOLCloseHandle(

7、 3. HANDLEhObject/需关闭的设备句柄 4. ); 3.2串口配置和串口属性在用CreatFile ( )函数打开串口后,系统将根据上次打开串口时设置的值来初始化串口,可以集成上次打开操作后的数值,包括设备控制块(DCB)和超时控制结构(COMMTIMEOUTS)。如果是首次打开串口,Windows会使用缺省配置。1串口配置Windows 2000 中使用GetCommState( )函数获取串口的当前配置,使用SetCommState ( )函数重新分配串口资源的各个参数。1. GetCommState()函数声明如下: 2. BOOLGetCommState( 3. HAND

8、LEhFile,/由CreatFile()函数返回的指向已打开的串口的句柄 4. LPDCBlpDCB/指向device-controlblockstructure的指针 5. ); 6. 其中DCB的结构声明如下: 7. typedefstruct_DCB 8. DWORDDCBlength;/DCB块大小 9. DWORDBaudRate;/数据传输率 10. DWORDfBinary:1;/二进制模式,不检验EOF 11. DWORDfParity:1;/允许奇偶校验 12. DWORDfOutCtsFlow:1;/CTS输出流控制 13. DWORDfOutDsrFlow:1;/DSR

9、输出流控制 14. DWORDfDtrContorl:2;/DTR流控制类型 15. DWORDfDsrSensitivity:1;/对DTR信号线是否敏感 16. DWORD fTXContinueOnOxff:1;/XOFFcontinueTx 17. DWORDfOutX:1;/XON/XOFF输出流控制 18. DWORDfInX:1;/XON/XOFF输入流控制 19. DWORDfErrorChar:1;/错误替换 20. DWORDfNull:1;/是否丢弃接收到的NULL字符 21. DWORDfRtsControl:2;/RTS流控制 22. DWORDfAbortOnErr

10、or:1;/发送错误,指定是否终止读、写操作 23. DWORDfDummy2:17;/保留 24. WORDwReserved;/现在不用 25. WORDXonLim;/XOFF字符发送之前接收到缓冲区中可允许的最小字节数 26. WORDXoffLim;/XOFF字符发送之前缓冲区中可允许的最小可用字节数 27. BYTEByteSize;/端口当前使用的数据位数 28. BYTEParity;/当前使用的奇偶校验法 29. BYTEStopBits;/当前使用的停止位数 30. charXonChar;/发送和接收的XON字符值 31. charXoffChar;/发送和接收的XOFF

11、字符值 32. charErrorChar;/用来替代接收到的奇偶校验发生错误的字符 33. charEofChar;/表示数据的结束 34. charEvtChar;/事件字符 35. WORDwReserved1;/保留的位 36. DCB; 如果GetCommState ( )函数调用成功,则返回值不为零。若函数调用失败,则返回值为零,可以调用GetLastError ( )函数来获取进一步的错误信息。GetLastError ( )也是Windows API函数,函数声明如下:DWORD GetLastError(VOID);如果应用程序需要修改配置,可以通过调用GetCommStat

12、e ( )函数获得当前的DCB结构,然后更改DCB结构中的参数,调用SetCommState ( )函数配置修改过的DCB来配置端口。1. SetCommState()函数声明如下: 2. BOOLSetCommState( 3. HANDLEhFile,/由CreatFile()函数返回的已打开的串口的句柄 4. LPDCBlpDCB/指向DCB结构的指针 5. ); 2 串口属性串口的属性通过GetCommProperties ( )函数获得,GetCommProperties ( )函数声明如下:1. BOOLGetCommProperties( 2. HANDLEhFile,/返回句柄

13、 3. LPCOMMPROPlpCommProp/指向COMMPROP的结构 4. ); 其中lpCommProp指向一个COMMPROP的结构,串口的性能从COMMPROP中返回。3 通信设备配置Windows API提供了CommConfigDialog ( )函数对通信设备进行配置,从中改变数据传输速率、数据位、奇偶校验方法、停止位和流控制方法。1. CommConfigDialog()函数的声明如下: 2. BOOLCommConfigDialog( 3. LPTSTRlpszName,/要配置的端口名 4. HWNDhWnd,/拥有对话框的窗口句柄 5. LPCOMMCONFIGlp

14、CC/指向一个COMMCONFIG结构 6. ); 当CommConfigDialog ( )函数返回时,选定的设置在COMMFIG的DCB参数中返回,对已打开的串口,对端口设置进行更改通过SetCommState ( )函数来改变。3.3 读写串口1 读串口操作一般在程序中使用Win32 API ReadFile ( )函数从串口中读取数据。ReadFile ( )函数声明如下:1. BOOLReadFile( 2. HANDLEhFILE,/指向由CreatFile()函数产生的句柄 3. LPVOIDlpbuffer,/指向一个缓冲区 4. DWORDnNumberOfBytesToRe

15、ad,/读取的字节数 5. LPDWORDlpNumberOfBytesToRead,/指向调用该函数读出的字节数 6. LPOVERLAPPEDlpOverlapped/一个OVERLAPPED结构 7. ); 2 写串口操作一般在程序中使用Win32 API WriteFile ( )函数向串口中写数据。WriteFile ( )函数声明如下:1. BOOLWriteFile( 2. HANDLEhFILE,/指向由CreatFile()函数产生的句柄 3. LPVOIDlpbuffer,/指向一个缓冲区 4. DWORDnNumberOfBytesToWrite,/向串口设备写入的字节数

16、 5. LPDWORDlpNumberOfBytesToWritten,/指向调用该函数已写入的字节数 6. LPOVERLAPPEDlpOverlapped/一个OVERLAPPED结构 7. ); 3 异步I/O操作 读、写串口操作中的OVERLAPPED结构用于在Windows中进行异步I/O操作,使应用程序可以在前台、后台同时执行不同的任务,并由GetOverLappedResult ( )函数获取结果。OVERLAPPED结构类型声明如下:1. Typedefstruct_OVERLAPPED 2. DWORDInternal;/指出一个和系统相关的状态 3. DWORDIntern

17、alHigh;/指出发送或接收的数据长度 4. DWORDOffset; 5. DWORDOffsetHigh;/Offset和OffsetHigh指明文件传送的开始位置和字节偏移量 6. HANDLEhEvent;/指定一个I/O操作完成后出发的事件 7. OVERLAPPED; 8. 异步I/O操作可以由GetOverLappedResult()函数来获取结果。 9. GetOverLappedResult()函数声明如下: 10. BOOLGetOverLappedResult( 11. HANDLEhFILE,/标识通信句柄,开始调用重叠结构ReadFile、WriteFile 12.

18、 LPOVERLAPPEDlpOverlapped,/启动异步操作时指定的OVERLAPPED结构 13. LPDWORDlpNumberOfBytesTransferred,/接收读、写操作实际传递的字节数 14. BOOLbWait/指定函数是否等待挂起的异步操作完成。 15. ); 4 超时设置 Windows 2000中读写串口引入了超时结构。超时结构直接影响读和写的操作行为,当事先设定的超时间隔消逝时,ReadFile ( )、WriteFile ( )操作将被无条件结束。超时结构定义如下1. typedefstruct_COMMTIMEOUTS 2. DWORDReadInterv

19、alTimeout; 3. DWORDReadTotalTimoutMultiplier; 4. DWORDReadTotalTimouConstant; 5. DWORDWriteTotalTimoutMultiplier; 6. DWORDWriteTotalTimoutConstant; 7. COMMTIMEOUTS,*LPCOMMTIMEOUTS; 其中:ReadIntervalTimeout以ms为单位指定通信线路上两个字符到达之间的最大时间间隔;ReadTotalTimoutMultiplier以ms为单位指定一个系数,该系数用来计算读操作的总超时时间;ReadTotalTimo

20、uConstant以ms为单位指定一个常数,该常数用来计算读操作的总超时时间;WriteTotalTimoutMultiplier以ms为单位指定一个系数,该系数用来计算写操作的总超时时间;WriteTotalTimoutConstant以ms为单位指定一个常数,该常数用来计算读写作的总超时时间。1. WindowsAPIGetCommTimeOuts()函数来获得当前超时参数。 2. GetCommTimeOuts()函数声明如下: 3. BOOLGetCommTimeOuts( 4. HANDLEhFILE,/标识通信设备,CreatFile()函数返回该句柄 5. LPCOMMTIMEO

21、UTSlpCommTimeouts/指向一个COMMTIMEOUTS结构,返回超 6. /时信息 7. ); 如果想获得进一步的错误信息,可以调用GetLastError ( )函数来获取。5 通信状态和通信错误 如果在串口通信中发生错误,如发生终端、奇偶错误等,I/O操作将会终止。如果程序要进一步执行I/O操作,必须调用ClearCommError ( )函数。ClearCommError ( )函数有两个作用,一是清除错误条件,一是确定串口通信状态。1. ClearCommError()函数声明如下: 2. BOOLClearCommError( 3. HANDLEhFILE,/由Crea

22、tFile()函数返回的句柄 4. LPDWORDlpErrors,/指向一个指明错误类型的掩码填充的32位变量 5. LPCOMSTATlpStat/指向一个COMSTAT结构接收设备的状态 6. ); 3.4 程序实例下面的程序为打开并初始化端口:1. HANDLEhCom; 2. DWORDdwError; 3. DCBdcb; 4. COMMTIMEOUTSTimeOuts; 5. hCom=CreateFile(“COM1”,/对串口1进行操作 6. GENERIC_READ|GENERIC_WRITE,/允许读和写 7. 0,/独占方式 8. NULL, 9. OPEN_EXIST

23、ING, 10. FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,/重叠方式 11. NULL 12. ); 13. if(hCom=INVALID_HANDLE_VALUE) 14. dwError=GetLastRrror(); 15. /错误处理 16. 17. SetupComm(hCom,1024,1024)/缓冲区的大小为1024 18. TimeOuts.ReadIntervalTimeout=1000; 19. TimeOuts.ReadTotalTimoutMultiplier=500; 20. TimeOuts.ReadTotalTim

24、ouConstant=5000; 21. TimeOuts.WriteTotalTimoutMultiplier=500; 22. TimeOuts.WriteTotalTimoutConstant=5000; 23. SetCommTimeouts(hCom,&TimeOuts);/设置超时 24. GetCommState(hCom,&dcb); 25. dcb.BaudRate=2400;/数据传输速率为2400 26. dcb.ByteSize=8;/每个字符为8位 27. dcb.Parity=NOPARITY;/无校验 28. dcb.StopBits=ONESTOPBIT;/一个停止位 29. SetCommState(hCom,&dcb); 4 结束语 Win32 API作为 Windows平台的应用程序编程接口,是windows的核心。通过充分理解和利用API函数,可以使我们深入到Windows的内部,充分挖掘系统提供的强大功能和灵活性,为我们在工程实践中进行串口通信编程提供方便。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁