




已阅读5页,还剩3页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
用Win32API实现串行通信南京航空航天大学牛新庄-串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛。我们可以利用WindowsAPI提供的通信函数编写出高可移植性的串行通信程序。在Win16中,可以利用OpenComm、CloseComm和WriteComm等函数打开、关闭和读写串口。但在Win32中,串口和其他通信设备均被作为文件处理,串口的打开、关闭和读写等操作所用的API函数与操作文件的函数相同。可通过CreateFile函数打开串口,通过CloseFile函数关闭串口,通过CommProp、DCB结构、GetCommProperties、SetCommProperties、GetCommState及SetCommState等函数设置串口状态,通过函数ReadFile和WritFile读写串口。VC6.0是Windows应用程序开发的主流语言之一,它具有良好的图形设计界面并支持面向对象的程序设计方法。本文结合一个实例介绍在VC6.0下如何利用Win32API实现串行通信程序。实现原理本文的实例来自一个水泥发货系统,在系统中,需要将通过总量传感器采集到的仓重值传入到计算机中,以便系统做出相应的处理。这需要使用串行通信来完成采集数据的传递工作。对于串行通信设备,Win32API支持同步和异步两种I/O操作。同步操作方式的程序设计相对比较简单,但I/O操作函数在I/O操作结束前不能返回,这将挂起调用线程,直到I/O操作结束。异步操作方式相对要复杂一些,但它可让耗时的I/O操作在后台进行,不会挂起调用线程,这在大数据量通信的情况下对改善调用线程的响应速度是相当有效的。异步操作方式特别适合同时对多个串行设备进行I/O操作和同时对一个串行设备进行读/写操作。这两种操作方式的程序设计基本思想是相似的,本文将针对同步操作方式给出具体的通信程序设计,同时简单说明如何实现异步的I/O操作。串行设备的初始化串行设备的初始化是利用CreateFile函数实现的。该函数获得串行设备句柄并对其进行通信参数设置,包括设置输出/接收缓冲区大小、超时控制和事件监视等。/串行设备句柄;HANDLEhComDev=0;/串口打开标志;BOOLbOpen=FALSE;/线程同步事件句柄;HANDLEhEvent=0;BOOLSetupSynCom()DCBdcb;COMMTIMEOUTStimeouts;/设备已打开if(bOpen)returnFALSE;/打开COM1if(hComDev=CreateFile(“COM1”,GENERICREAD|GENERICWRITE,0,NULL,OPENEXISTING,FILEATTRIBUTENORMAL,NULL)=INVALIDHANDLEVALUE)returnFALSE;/设置超时控制SetCommTimeouts(hComDev,timeouts);/设置接收缓冲区和输出缓冲区的大小SetupComm(hComDev,1024,512);/获取缺省的DCB结构的值GetCommState(hComDev,dcb);/设定波特率为9600bpsdcb.BaudRate=CBR9600;/设定无奇偶校验dcb.fParity=NOPARITY;/设定数据位为8dcb.ByteSize=8;/设定一个停止位dcb.StopBits=ONESTOPBIT;/监视串口的错误和接收到字符两种事件SetCommMask(hComDev,EVERR|EVRXCHAR);/设置串行设备控制参数SetCommState(hComDev,dcb);/设备已打开bOpen=TRUE;/创建人工重设、未发信号的事件hEvent=CreateEvent(NULL,FALSE,FALSE,“WatchEvent”);/创建一个事件监视线程来监视串口事件AfxBeginThread(CommWatchProc,pParam);在设置串口DCB结构的参数时,不必设置每一个值。首先读出DCB缺省的参数设置,然后只修改必要的参数,其他参数都取缺省值。由于对串口进行的是同步I/O操作,所以除非指定进行监测的事件发生,否则WaitCommEvent函数不会返回。在串行设备初始化的最后要建立一个单独的监视线程来监视串口事件,以免挂起当前调用线程,其中pParam可以是一个对事件进行处理的窗口类指针。如果要进行异步I/O操作,打开设备句柄时,CreateFile的第6个参数应增加FILEFLAGOVERLAPPED标志。数据发送数据发送利用WriteFile函数实现。对于同步I/O操作,它的最后一个参数可为NULL;而对异步I/O操作,它的最后一个参数必需是一个指向OVERLAPPED结构的指针,通过OVERLAPPED结构来获得当前的操作状态。BOOLWriteComm(LPCVOIDlpSndBuffer,DWORDdwBytesToWrite)/lpSndBuffer为发送数据缓冲区指针,dwBytesToWrite为将要发送的字节长度/设备已打开BOOLbWriteState;/实际发送的字节数DWORDdwBytesWritten;/设备未打开if(!bOpen)returnFALSE;bWriteState=WriteFile(hComDev,lpSndBuffer,dwBytesToWrite,dwBytesWritten,NULL);if(!bWriteState|dwBytesToWrite!=dwBytesWritten)/发送失败returnFALSE;else/发送成功returnTRUE;数据接收接收数据的任务由ReadFile函数完成。该函数从串口接收缓冲区中读取数据,读取数据前,先用ClearCommError函数获得接收缓冲区中的字节数。接收数据时,同步和异步读取的差别同发送数据是一样的。DWORDReadComm(LPVOIDlpInBuffer,DWORDdwBytesToRead)/lpInBuffer为接收数据的缓冲区指针,dwBytesToRead为准备读取的数据长度(字节数)/串行设备状态结构COMSTATComStat;DWORDdwBytesRead,dwErrorFlags;/设备未打开if(!bOpen)return0;/读取串行设备的当前状态ClearCommError(hComDev,dwErrorFlags,ComStat);/应该读取的数据长度dwBytesRead=min(dwBytesToRead,ComStat.cbInQue);if(dwBytesRead0)/读取数据if(!ReadFile(hComDev,lpInBuffer,dwBytesRead,dwBytesRead,NULL)dwBytesRead=0;returndwBytesRead;事件监视线程事件监视线程对串口事件进行监视,当监视的事件发生时,监视线程可将这个事件发送(SendMessage)或登记(PostMessage)到对事件进行处理的窗口类(由pParam指定)中。UINTCommWatchProc(LPVOIDpParam)DWORDdwEventMask=0;/发生的事件;while(bOpen)/等待监视的事件发生WaitCommEvent(hComDev,dwEventMask,NULL);if(dwEventMaskEVRXCHAR)=EVRXCHAR)/接收到字符事件后,可以将此消息登记到由pParam有指定的窗口类中进行处理if(dwEventMaskEVERR)=EVERROR/发生错误时的处理SetEvent(hEvent);/发信号,指示监视线程结束return0;关闭串行设备在整个应用程序结束或不再使用串行设备时,应将串行设备关闭,包括取消事件监视,将设备打开标志bOpen置为FALSE以使事件监视线程结束,清除发送/接收缓冲区和关闭设备句柄。voidCloseSynComm()if(!bOpen)return;/结束事件监视线程bOpen=FALSE;SetCommMask(hComDev,0);/取消事件监视,此时监视线程中的WaitCommEvent将返回WaitForSingleObject(hEvent,INFINITE);/等待监视线程结束CloseHandle(hEvent);/关闭事件句柄/停止发送和接收数据,并清除发送和接收缓冲区PurgeComm(hComDev,PURGE-TXABORT|PURGE-RXABORT|PURGE-TXCLEAR|PURGE-RXCLEAR);/关闭设备句柄Clo
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年五年级数学上册 4 可能性第3课时 可能性的大小(2)说课稿 新人教版
- 幼儿园小班语言教案彩色的梦(2025-2026学年)
- 迪文琴佐亿元合同
- 第18课《毛主席在花山》说课稿-2024-2025学年统编版语文(五四学制)六年级上册
- 文化用品合同
- 2025商业空间设计合同协议
- 第15课 规划《中国的古桥》宣传册说课稿-2025-2026学年小学信息技术(信息科技)三年级第2册滇人版
- 2025农产品生产销售合同
- 2025室内设计工程合同
- 高中数学 第三章 三角恒等变换 3.3 二倍角的三角函数说课稿 北师大版必修4
- 学生视力档案表
- 《饲料学》粗饲料
- (实施)产万吨高吸水性树脂(SAP)技改项目环评
- 初中劳动课教案大全
- 软笔书法课程基础PPT课件(PPT 115页)
- T∕TAF 083-2022 移动终端融合快速充电技术规范
- 《红楼梦》中的服饰文化(PPT)
- 2022年3月公共英语一级真题及答案
- 中西医结合骨伤科学教学大纲
- 发展心理学第四节-智力发展
- 特殊过程控制程序
评论
0/150
提交评论