http://blog.163.com/zhaojun_xf/blog/static/30050580200872465739835/ 2008 刘树坤 刘金 摘 要:介绍利用Windows API 在VC++ 5.0下实现微机串行通信程序的设计方法,并给出主要的通信程序代码。 1 引言 Windows 下的串行通信可有多种实现方法,如利用VB的MSCOMM.OCX控件,或利用Windows API等。在某些情况下,VB的MSCOMM.OCX控件不适合我们的要求,这时我们可以用Windows API 提供的通信函数来实现,以编写出可移植性强的串行通信程序。自Windows95以来,Windows 提供了大量的API,这些API几乎可以帮助我们快速、方便地实现Windows应用程序的各种功能。VC++是Windows应用程序开发的主流语言之一,它具有良好的图形设计界面并支持面向对象的程序设计方法。本文结合一个实例介绍VC++5.0下利用Windows API 的串行通信程序设计。 2 通信程序设计 本文的实例是一台微机和多台单片机设备进行串行通信,通信协议为RS—485,微机和单片机组成一个总线式网络结构。由于采用这种总线式结构,为防止总线竞争(数据碰撞),只能由微机依次轮循总线上的各单片机设备来进行通信。 //串行设备句柄; BOOL bOpen=FALSE; //串口打开标志; HANDLE hEvent=0; //线程同步事件句柄; BOOL SetupSynCom() //设备已打开; if((hComDev=CreateFile("COM1",GENERIC—READ|GENERIC—WRITE,0,NULL,OPEN—EXISTING,FILE—ATTRIBUTE—NORMAL,NULL))==INVALID—HANDLE—VALUE) //打开COM1; return FALSE; //设置超时控制; SetupComm(hComDev,1024,512); //设置接收缓冲区和输出缓冲区的大小; GetCommState(hComDev,&dcb); //获取缺省的dcb结构的值 dcb.BaudRate=CBR—9600; //波特率为9600 bps; dcb.fParity=NOPARITY; //无奇偶校验; dcb.ByteSize=8; //数据位为8; dcb.StopBits=ONESTOPBIT; //一个停止位; SetCommMask(hComDev,EV—ERR|EV—RXCHAR); //监视串口的错误和接收到字符两种事件; SetCommState(hComDev,&dcb); //设置串口设备控制参数; bOpen=TRUE; //设备已打开; hEvent=CreateEvent(NULL,FALSE,FALSE,"WatchEvent"); //创建人工重设、未发信号的事件; AfxBeginThread(CommWatchProc,pParam); //创建一个事件监视线程来监视串口事件; } //发送结果; DWORD dwBytesWritten; //实际发送的字节数; if(!bOpen) return FALSE; //设备未打开; bWriteState=WriteFile(hComDev,lpSndBuffer,dwBytesToWrite,&dwBytesWritten,NULL); //发送失败; else //发送成功; } //串口设备状态结构; DWORD dwBytesRead,dwErrorFlags; //设备未打开; ClearCommError(hComDev,&dwErrorFlags,&ComStat); //读取串口设备的当前状态; dwBytesRead=min(dwBytesToRead,ComStat.cbInQue); //应该读取的数据长度; if(dwBytesRead>0) //读取数据; dwBytesRead=0; //发生的事件; while(bOpen) //等待监视的事件发生; if ((dwEventMask & EV—RXCHAR) == EV—RXCHAR) //发生错误事件,处理; } //发信号,指示监视线程结束; return 0; //结束事件监视线程; SetCommMask(hComDev,0); //取消事件监视,此时监视线程中的WaitCommEvent将返回; WaitForSingleObject(hEvent,INFINITE); //等待监视线程结束; CloseHandle(hEvent); //关闭事件句柄; //停止发送和接收数据,并清除发送和接收缓冲区; //关闭设备句柄; } 3 结束语 以上给出了用Windows API 设计串行通信的基本思想,对这个同步I/O操作的串行通信程序稍加改造就可进行异步I/O操作。在实际应用中,我们可以将这些串行通信函数和成员变量加到一个现成的CWnd类或其派生类中来实现串行通信,也可设计一个新的串行通信类来包含这些成员函数和成员变量。总之,利用WIN 3.2 API可以设计出灵活、能满足各种要求的串行通信程序。 作者简介:刘树坤 从事计算机网络通信和工业控制、检测的研究开发工作。 参考文献 [1] (美)Stefano Maruzzi.The Microsoft Windows 95开发人员指南[M].周靖,等译.北京:机械工业出版社,1997. |
|