已阅读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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学数学基础知识体系的构建与教学方法
- 2025年度个人教育贷款延期支付合同3篇
- 教育领域中工业互联网的安全培训与推广
- 2025年度个人住房贷款利率调整协议合同范本4篇
- 二零二五年度车辆借用及道路救援服务合同3篇
- 二零二五年度餐饮企业员工培训与职业发展合同6篇
- 江苏2025年江苏卫生健康职业学院博士专项招聘13人笔试历年参考题库附带答案详解
- 永州2025年湖南永州市零陵区引进急需紧缺专业人才66人笔试历年参考题库附带答案详解
- 楚雄2025年第一批云南楚雄南华县紧密型县域医共体招聘编制外工作人员笔试历年参考题库附带答案详解
- 探究式课堂中的教师角色与教学策略
- 健康指南如何正确护理蚕豆病学会这些技巧保持身体健康
- 苏教版五年级上册数学简便计算300题及答案
- 澳洲牛肉行业分析
- 老客户的开发与技巧课件
- 计算机江苏对口单招文化综合理论试卷
- 成人学士学位英语单词(史上全面)
- 26个英文字母书写(手写体)Word版
- KAPPA-实施方法课件
- GB/T 13813-2023煤矿用金属材料摩擦火花安全性试验方法和判定规则
- GB/T 33084-2016大型合金结构钢锻件技术条件
- 航道整治课程设计
评论
0/150
提交评论