文档库 最新最全的文档下载
当前位置:文档库 › VC串口通信资料汇集整理(PDF)

VC串口通信资料汇集整理(PDF)

VC串口通信资料汇集整理(PDF)
VC串口通信资料汇集整理(PDF)

用MFC实现串口编程

龚建伟评论:本文既写了在Windows中怎样用VC控件MSComm,又说明了API 技术编程方法,在写用MSComm控件时,数据类型的转换说得不是太明白,初次涉猎串口编程的朋友恐怕看了还是编不出来;直接从底层编写的部分值得一读,说得较为详细,但你得先从VC教本上看一看什么是线程。

一.串行通信的基本原理

二.串口信号线的接法

三.16位串口应用程序的简单回顾

四.在MFC下的32位串口应用程序

㈠使用ActiveX控件

㈡使用32位的API通信函数

本文详细介绍了串行通信的基本原理,以及在Windows NT、Win98环境下用MFC实现串口(COM)通信的方法:使用ActiveX控件或Win API.并给出用Visual C++6.0编写的相应MFC32位应用程序。关键词:串行通信、VC++6.0、ActiveX控件、Win API、MFC32位应用程序、事件驱动、非阻塞通信、多线程.

在Windows应用程序的开发中,我们常常需要面临与外围数据源设备通信的问题。计算机和单片机(如MCS-51)都具有串行通信口,可以设计相应的串口通信程序,完成二者之间的数据通信任务。

实际工作中利用串口完成通信任务的时候非常之多。已有一些文章介绍串口编程的文章在计算机杂志上发表。但总的感觉说来不太全面,特别是介绍32位下编程的更少,且很不详细。笔者在实际工作中积累了较多经验,结合硬件、软件,重点提及比较新的技术,及需要注意的要点作一番探讨。希望对各位需要编写串口通信程序的朋友有一些帮助。

一.串行通信的基本原理

串行端口的本质功能是作为CPU和串行设备间的编码转换器。当数据从CPU 经过串行端口发送出去时,字节数据转换为串行的位。在接收数据时,串行的位被转换为字节数据。

在Windows环境(Windows NT、Win98、Windows2000)下,串口是系统资源的一部分。

应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。

二.串口信号线的接法

一个完整的RS-232C接口有22根线,采用标准的25芯插头座(或者9芯插头座)。25芯和9芯的主要信号线相同。以下的介绍是以25芯的RS-232C为例。

①主要信号线定义:

2脚:发送数据TXD;3脚:接收数据RXD;4脚:请求发送RTS;5脚:清除发送CTS;6脚:数据设备就绪DSR;20脚:数据终端就绪DTR;8脚:数据载波检测DCD;1脚:保护地;7脚:信号地。

②电气特性:

数据传输速率最大可到20K bps,最大距离仅15m.

注:看了微软的MSDN 6.0,其Windows API中关于串行通讯设备(不一定都是串口RS-232C或RS-422或RS-449)速率的设置,最大可支持到

RS_256000,即256K bps!也不知道到底是什么串行通讯设备?但不管怎样,一般主机和单片机的串口通讯大多都在9600bps,可以满足通讯需求。

③接口的典型应用:

大多数计算机应用系统与智能单元之间只需使用3到5根信号线即可工作。这时,除了TXD、RXD以外,还需使用RTS、CTS、DCD、DTR、DSR等信号线。(当然,在程序中也需要对相应的信号线进行设置。)

以上接法,在设计程序时,直接进行数据的接收和发送就可以了,不需要对信号线的状态进行判断或设置。(如果应用的场合需要使用握手信号等,需要对相应的信号线的状态进行监测或设置。)

三.16位串口应用程序的简单回顾

16位串口应用程序中,使用的16位的Windows API通信函数:

①OpenComm()打开串口资源,并指定输入、输出缓冲区的大小(字节);CloseComm()关闭串口;

例:int idComDev;

idComDev=OpenComm("COM1",1024,128);

CloseComm(idComDev);

②BuildCommDCB()、setCommState()填写设备控制块DCB,然后对已打开的串口进行参数配置;

例:DCB dcb;

BuildCommDCB("COM1:2400,n,8,1",&dcb);

SetCommState(&dcb);

③ReadComm、WriteComm()对串口进行读写操作,即数据的接收和发送.

例:char*m_pRecieve;int count;

ReadComm(idComDev,m_pRecieve,count);

Char wr[30];int count2;

WriteComm(idComDev,wr,count2);

16位下的串口通信程序最大的特点就在于:串口等外部设备的操作有自己

特有的API函数;而32位程序则把串口操作(以及并口等)和文件操作统一起

来了,使用类似的操作。

四.在MFC下的32位串口应用程序

32位下串口通信程序可以用两种方法实现:利用ActiveX控件;使用API

通信函数。

使用ActiveX控件,程序实现非常简单,结构清晰,缺点是欠灵活;使用API通信函数的优缺点则基本上相反。

以下介绍的都是在单文档(SDI)应用程序中加入串口通信能力的程序。

㈠使用ActiveX控件:

VC++ 6.0提供的MSComm控件通过串行端口发送和接收数据,为应用程序提供串行通信功能。使用非常方便,但可惜的是,很少有介绍MSComm控件的资

料。

⑴.在当前的Workspace中插入MSComm控件。

Project菜单------>Add to Project---->Components and Controls-----

>Registered ActiveX Controls--->选择Components:Microsoft Communications Control,version 6.0插入到当前的Workspace中。结果添加

了类CMSComm(及相应文件:mscomm.h和mscomm.cpp)。

⑵.在MainFrm.h中加入MSComm控件。

protected:

CMSComm m_ComPort;

在Mainfrm.cpp::OnCreare()中:

DWORD style=WS_VISIBLE|WS_CHILD;

if(!m_ComPort.Create(NULL,style,CRect(0,0,0,0),this,ID_COMMCTRL)){ TRACE0("Failed to create OLE Communications Control\n");

return-1;//fail to create

}

⑶.初始化串口

m_ComPort.SetCommPort(1);//选择COM1

m_ComPort.SetInBufferSize(1024);//设置输入缓冲区的大小,Bytes m_ComPort.SetOutBufferSize(512);//设置输入缓冲区的大小,Bytes// if(!m_ComPort.GetPortOpen())//打开串口

m_ComPort.SetPortOpen(TRUE);

m_ComPort.SetInputMode(1);//设置输入方式为二进制方式

m_ComPort.SetSettings("9600,n,8,1");//设置波特率等参数

m_ComPort.SetRThreshold(1);//为1表示有一个字符引发一个事件

m_ComPort.SetInputLen(0);

⑷.捕捉串口事项。

MSComm控件可以采用轮询或事件驱动的方法从端口获取数据。我们介绍比较使用的事件驱动方法:有事件(如接收到数据)时通知程序。在程序中需要捕获并处理这些通讯事件。

在MainFrm.h中:

protected:

afx_msg void OnCommMscomm();

DECLARE_EVENTSINK_MAP()

在MainFrm.cpp中:

BEGIN_EVENTSINK_MAP(CMainFrame,CFrameWnd)

ON_EVENT(CMainFrame,ID_COMMCTRL,1,OnCommMscomm,VTS_NONE)//映射ActiveX控件事件

END_EVENTSINK_MAP()

⑸.串口读写.

完成读写的函数的确很简单,GetInput()和SetOutput()就可。两个函数的原型是:

VARIANT GetInput();及void SetOutput(const VARIANT&newValue);都要使用VARIANT类型(所有Idispatch::Invoke的参数和返回值在内部都是作为VARIANT对象处理的)。

无论是在PC机读取上传数据时还是在PC机发送下行命令时,我们都习惯于使用字符串的形式(也可以说是数组形式)。查阅VARIANT文档知道,可以用BSTR表示字符串,但遗憾的是所有的BSTR都是包含宽字符,即使我们没有定义_UNICODE_UNICODE也是这样!WinNT支持宽字符,而Win95并不支持。为解决上述问题,我们在实际工作中使用CbyteArray,给出相应的部分程序如下:

void CMainFrame::OnCommMscomm(){

VARIANT vResponse;int k;

if(m_commCtrl.GetCommEvent()==2){

k=m_commCtrl.GetInBufferCount();//接收到的字符数目

if(k>0){

vResponse=m_commCtrl.GetInput();//read

SaveData(k,(unsigned char*)vResponse.parray->pvData);

}//接收到字符,MSComm控件发送事件}

。。。。。//处理其他MSComm控件

}

void CMainFrame::OnCommSend(){

。。。。。。。。//准备需要发送的命令,放在TxData[]中

CByteArray array;

array.RemoveAll();

array.SetSize(Count);

for(i=0;i

array.SetAt(i,TxData[i]);

m_ComPort.SetOutput(COleVariant(array));//发送数据}

请大家认真关注第⑷、⑸中内容,在实际工作中是重点、难点所在。

㈡使用32位的API通信函数:

可能很多朋友会觉得奇怪:用32位API函数编写串口通信程序,不就是把16位的API换成32位吗?16位的串口通信程序可是多年之前就有很多人研讨过了……

此文主要想介绍一下在API串口通信中如何结合非阻塞通信、多线程等手段,编写出高质量的通信程序。特别是在CPU处理任务比较繁重、与外围设备中有大量的通信数据时,更有实际意义。

⑴.在中MainFrm.cpp定义全局变量

HANDLE hCom;//准备打开的串口的句柄

HANDLE hCommWatchThread;//辅助线程的全局函数

⑵.打开串口,设置串口

hCom=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,//允许读写

0,//此项必须为0

NULL,//no security attrs

OPEN_EXISTING,//设置产生方式

FILE_FLAG_OVERLAPPED,//我们准备使用异步通信

NULL);

请大家注意,我们使用了FILE_FLAG_OVERLAPPED结构。这正是使用API实现非阻塞通信的关键所在。

ASSERT(hCom!=INVALID_HANDLE_VALUE);//检测打开串口操作是否成功

SetCommMask(hCom,EV_RXCHAR|EV_TXEMPTY);//设置事件驱动的类型

SetupComm(hCom,1024,512);//设置输入、输出缓冲区的大小

PurgeComm(hCom,PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR

|PURGE_RXCLEAR);//清干净输入、输出缓冲区

COMMTIMEOUTS CommTimeOuts;//定义超时结构,并填写该结构

…………

SetCommTimeouts(hCom,&CommTimeOuts);//设置读写操作所允许的超时

DCB dcb;//定义数据控制块结构

GetCommState(hCom,&dcb);//读串口原来的参数设置

dcb.BaudRate=9600;dcb.ByteSize=8;dcb.Parity=NOPARITY;

dcb.StopBits=ONESTOPBIT;dcb.fBinary=TRUE;dcb.fParity=FALSE;

SetCommState(hCom,&dcb);//串口参数配置

上述的COMMTIMEOUTS结构和DCB都很重要,实际工作中需要仔细选择参数。

⑶启动一个辅助线程,用于串口事件的处理。

Windows提供了两种线程,辅助线程和用户界面线程。区别在于:辅助线程没

有窗口,所以它没有自己的消息循环。但是辅助线程很容易编程,通常也很有

用。

在次,我们使用辅助线程。主要用它来监视串口状态,看有无数据到达、通信

有无错误;而主线程则可专心进行数据处理、提供友好的用户界面等重要的工

作。

hCommWatchThread=

CreateThread((LPSECURITY_ATTRIBUTES)NULL,//安全属性

0,//初始化线程栈的大小,缺省为与主线程大小相同

(LPTHREAD_START_ROUTINE)CommWatchProc,//线程的全局函数

GetSafeHwnd(),//此处传入了主框架的句柄

0,&dwThreadID);

ASSERT(hCommWatchThread!=NULL);

⑷为辅助线程写一个全局函数,主要完成数据接收的工作。

请注意OVERLAPPED结构的使用,以及怎样实现了非阻塞通信。

UINT CommWatchProc(HWND hSendWnd){

DWORD dwEvtMask=0;

SetCommMask(hCom,EV_RXCHAR|EV_TXEMPTY);//有哪些串口事件需要监视?

WaitCommEvent(hCom,&dwEvtMask,os);//等待串口通信事件的发生

检测返回的dwEvtMask,知道发生了什么串口事件:

if((dwEvtMask&EV_RXCHAR)==EV_RXCHAR){//缓冲区中有数据到达

COMSTAT ComStat;DWORD dwLength;

ClearCommError(hCom,&dwErrorFlags,&ComStat);

dwLength=ComStat.cbInQue;//输入缓冲区有多少数据?

if(dwLength>0){

BOOL fReadStat;

fReadStat=ReadFile(hCom,lpBuffer,dwLength,&dwBytesRead,

&READ_OS(npTTYInfo));//读数据

注:我们在CreareFile()时使用了FILE_FLAG_OVERLAPPED,现在ReadFile()也必

须使用LPOVERLAPPED结构.否则,函数会不正确地报告读操作已完成了.

使用LPOVERLAPPED结构,ReadFile()立即返回,不必等待读操作完成,

实现非阻塞通信.此时,ReadFile()返回FALSE,GetLastError()返回ERROR_IO_PENDING.

if(!fReadStat){

if(GetLastError()==ERROR_IO_PENDING){

while(!GetOverlappedResult(hCom,

&READ_OS(npTTYInfo),&dwBytesRead,TRUE)){

dwError=GetLastError();

if(dwError==ERROR_IO_INCOMPLETE)continue;

//缓冲区数据没有读完,继续

…………

::PostMessage((HWND)hSendWnd,WM_NOTIFYPROCESS,0,0);//通知主线

程,串口收到数据}

所谓的非阻塞通信,也即异步通信。是指在进行需要花费大量时间的数据

读写操作(不仅仅是指串行通信操作)时,一旦调用ReadFile()、

WriteFile(),就能立即返回,而让实际的读写操作在后台运行;相反,如使用

阻塞通信,则必须在读或写操作全部完成后才能返回。由于操作可能需要任意

长的时间才能完成,于是问题就出现了。

非常阻塞操作还允许读、写操作能同时进行(即重叠操作?),在实际工作中非

常有用。

要使用非阻塞通信,首先在CreateFile()时必须使用FILE_FLAG_OVERLAPPED;

然后在ReadFile()时lpOverlapped参数一定不能为NULL,接着检查函数调用

的返回值,调用GetLastError(),看是否返回ERROR_IO_PENDING。如是,最

后调用GetOverlappedResult()返回重叠操作(overlapped operation)的结

果;WriteFile()的使用类似。

⑸.在主线程中发送下行命令。

BOOL fWriteStat;char szBuffer[count];

…………//准备好发送的数据,放在szBuffer[]中

fWriteStat=WriteFile(hCom,szBuffer,dwBytesToWrite,

&dwBytesWritten,&WRITE_OS(npTTYInfo));//写数据

注:我们在CreareFile()时使用了FILE_FLAG_OVERLAPPED,现在WriteFile()也

必须使用LPOVERLAPPED结构.否则,函数会不正确地报告写操作已完成了.

使用LPOVERLAPPED结构,WriteFile()立即返回,不必等待写操作完成,实

现非阻塞通信.此时,WriteFile()返回FALSE,GetLastError()返回

ERROR_IO_PENDING.

int err=GetLastError();

if(!fWriteStat){

if(GetLastError()==ERROR_IO_PENDING){

while(!GetOverlappedResult(hCom,&WRITE_OS(npTTYInfo),

&dwBytesWritten,TRUE)){

dwError=GetLastError();

if(dwError==ERROR_IO_INCOMPLETE){

//normal result if not finished

dwBytesSent+=dwBytesWritten;continue;}

综上,我们使用了多线程技术,在辅助线程中监视串口,有数据到达时依靠事件驱动,读入数据并向主线程报告(发送数据在主线程中,相对说来,下行命令的数据总是少得多);并且,WaitCommEvent()、ReadFile()、WriteFile()都使用了非阻塞通信技术,依靠重叠(overlapped)读写操作,让串口读写操作在后台运行。

依托vc6.0丰富的功能,结合我们提及的技术,写出有强大控制能力的串口通信应用程序。就个人而言,我更偏爱API技术,因为控制手段要灵活的多,功能也要强大得多。

Serial Communications in Win32

Allen Denver

Microsoft Windows Developer Support

December11,1995

Allen seldom eats breakfast,but if he had to pick a favorite,Win32 serial communications would be the top choice.

Abstract

Serial communications in Microsoft Win32is significantly different from serial communications in16-bit Microsoft Windows?Those

familiar with16-bit serial communications functions will have to relearn many parts of the system to program serial communications properly.This article will help to accomplish this.Those unfamiliar with serial communications will find this article a helpful foundation for development efforts.

This article assumes the reader is familiar with the fundamentals of multiple threading and synchronization in Win32.In addition,a basic familiarity of the Win32heap functions is useful to fully comprehend the memory management methods used by the sample,MTTTY,included with this article.For more information regarding these functions, consult the Platform SDK documentation,the Microsoft Win32SDK Knowledge Base,or the Microsoft Developer Network Library. Application programming interfaces(APIs)that control user interface features of windows and dialog boxes,though not discussed here,are useful to know in order to fully comprehend the sample provided with this article.Readers unfamiliar with general Windows programming practices should learn some of the fundamentals of general Windows programming before taking on serial communications.In other words, get your feet wet before diving in head first.

Introduction

The focus of this article is on application programming interfaces (APIs)and methods that are compatible with Microsoft?Windows NT?and Windows95;therefore,APIs supported on both platforms are the only ones discussed.Windows95supports the Win32?Telephony API(TAPI) and Windows NT 3.x does not;therefore,this discussion will not include TAPI.TAPI does deserve mention,however,in that it very nicely implements modem interfacing and call controlling.A production application that works with modems and makes telephone calls should implement these features using the TAPI interface.This will allow seamless integration with the other TAPI-enabled applications that a user may have.Furthermore,this article does not discuss some of the configuration functions in Win32,such as GetCommProperties.

The article is broken into the following sections:Opening a port, reading and writing(nonoverlapped and overlapped),serial status (events and errors),and serial settings(DCB,flow control,and communications time-outs).

The sample included with this article,MTTTY:Multithreaded TTY, implements many of the features discussed here.It uses three threads in its implementation:a user interface thread that does memory management,a writer thread that controls all writing,and a

reader/status thread that reads data and handles status changes on the port.The sample employs a few different data heaps for memory management.It also makes extensive use of synchronization methods to facilitate communication between threads.

Opening a Port

The CreateFile function opens a communications port.There are two ways to call CreateFile to open the communications port:overlapped and nonoverlapped.The following is the proper way to open a communications resource for overlapped operation:

HANDLE hComm;

hComm=CreateFile(gszPort,

GENERIC_READ|GENERIC_WRITE,

0,

0,

OPEN_EXISTING,

FILE_FLAG_OVERLAPPED,

0);

if(hComm==INVALID_HANDLE_VALUE)

//error opening port;abort

Removal of the FILE_FLAG_OVERLAPPED flag from the call to CreateFile specifies nonoverlapped operation.The next section discusses overlapped and nonoverlapped operations.

The Platform SDK documentation states that when opening a communications port,the call to CreateFile has the following requirements:

?fdwShareMode must be https://www.wendangku.net/doc/e48131207.html,munications ports cannot be shared in the same manner that files are shared.Applications using TAPI can use the TAPI functions to facilitate

sharing resources between applications.For Win32applications not using TAPI,handle

inheritance or duplication is necessary to share the communications port.Handle

duplication is beyond the scope of this article;please refer to the Platform SDK

documentation for more information.

?fdwCreate must specify the OPEN_EXISTING flag.

?hTemplateFile parameter must be NULL.

One thing to note about port names is that traditionally they have been COM1,COM2,COM3,or COM4.The Win32API does not provide any mechanism for determining what ports exist on a system.Windows NT

and Windows95keep track of installed ports differently from one another,so any one method would not be portable across all Win32 platforms.Some systems even have more ports than the traditional maximum of four.Hardware vendors and serial-device-driver writers

are free to name the ports anything they like.For this reason,it is best that users have the ability to specify the port name they want

to use.If a port does not exist,an error will occur

(ERROR_FILE_NOT_FOUND)after attempting to open the port,and the

user should be notified that the port isn’t available.

Reading and Writing

Reading from and writing to communications ports in Win32is very similar to file input/output(I/O)in Win32.In fact,the functions that accomplish file I/O are the same functions used for serial I/O. I/O in Win32can be done either of two ways:overlapped or nonoverlapped.The Platform SDK documentation uses the terms asynchronous and synchronous to connote these types of I/O operations. This article,however,uses the terms overlapped and nonoverlapped.

Nonoverlapped I/O is familiar to most developers because this is the traditional form of I/O,where an operation is requested and is assumed to be complete when the function returns.In the case of overlapped I/O,the system may return to the caller immediately even when an operation is not finished and will signal the caller when the operation completes.The program may use the time between the I/O request and its completion to perform some“background?work.

Reading and writing in Win32is significantly different from reading and writing serial communications ports in16-bit Windows.16-bit Windows only has the ReadComm and WriteComm functions.Win32reading and writing can involve many more functions and choices.These issues are discussed below.

Nonoverlapped I/O

Nonoverlapped I/O is very straightforward,though it has limitations. An operation takes place while the calling thread is blocked.Once the operation is complete,the function returns and the thread can continue its work.This type of I/O is useful for multithreaded applications because while one thread is blocked on an I/O operation, other threads can still perform work.It is the responsibility of the application to serialize access to the port correctly.If one thread is blocked waiting for its I/O operation to complete,all other threads that subsequently call a communications API will be blocked until the original operation completes.For instance,if one thread were waiting for a ReadFile function to return,any other thread that issued a WriteFile function would be blocked.

One of the many factors to consider when choosing between nonoverlapped and overlapped operations is portability.Overlapped operation is not a good choice because most operating systems do not support it.Most operating systems support some form of multithreading,however,so multithreaded nonoverlapped I/O may be the best choice for portability reasons.

Overlapped I/O

Overlapped I/O is not as straightforward as nonoverlapped I/O,but allows more flexibility and efficiency.A port open for overlapped operations allows multiple threads to do I/O operations at the same time and perform other work while the operations are pending. Furthermore,the behavior of overlapped operations allows a single

thread to issue many different requests and do work in the background while the operations are pending.

In both single-threaded and multithreaded applications,some synchronization must take place between issuing requests and processing the results.One thread will have to be blocked until the result of an operation is available.The advantage is that overlapped I/O allows a thread to do some work between the time of the request and its completion.If no work can be done,then the only case for overlapped I/O is that it allows for better user responsiveness.

Overlapped I/O is the type of operation that the MTTTY sample uses. It creates a thread that is responsible for reading the port’s data and reading the port’s status.It also performs periodic background work.The program creates another thread exclusively for writing data out the port.

Note Applications sometimes abuse multithreading systems by creating too many threads.Although using multiple threads can resolve many difficult problems,creating excessive threads is not the most efficient use of them in an application.Threads are less a strain on the system than processes but still require system resources such as CPU time and memory.An application that creates excessive threads may adversely affect the performance of the entire system.A better use of threads is to create a different request queue for each type of job and to have a worker thread issue an I/O request for each entry in the request queue.This method is used by the MTTTY sample provided with this article.

An overlapped I/O operation has two parts:the creation of the operation and the detection of its completion.Creating the operation entails setting up an OVERLAPPED structure,creating a manual-reset event for synchronization,and calling the appropriate function (ReadFile or WriteFile).The I/O operation may or may not be completed immediately.It is an error for an application to assume that a request for an overlapped operation always yields an overlapped operation.If an operation is completed immediately,an application needs to be ready to continue processing normally.The second part of an overlapped operation is to detect its completion. Detecting completion of the operation involves waiting for the event handle,checking the overlapped result,and then handling the data. The reason that there is more work involved with an overlapped operation is that there are more points of failure.If a nonoverlapped operation fails,the function just returns an error-return result.If an overlapped operation fails,it can fail in the

creation of the operation or while the operation is pending.You may also have a time-out of the operation or a time-out waiting for the signal that the operation is complete.

Reading

The ReadFile function issues a read operation.ReadFileEx also issues a read operation,but since it is not available on Windows95,it is not discussed in this article.Here is a code snippet that details how to issue a read request.Notice that the function calls a

function to process the data if the ReadFile returns TRUE.This is

the same function called if the operation becomes overlapped.Note

the fWaitingOnRead flag that is defined by the code;it indicates whether or not a read operation is overlapped.It is used to prevent the creation of a new read operation if one is outstanding.

DWORD dwRead;

BOOL fWaitingOnRead=FALSE;

OVERLAPPED osReader={0};

//Create the overlapped event.Must be closed before exiting

//to avoid a handle leak.

osReader.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

if(osReader.hEvent==NULL)

//Error creating overlapped event;abort.

if(!fWaitingOnRead){

//Issue read operation.

if(!ReadFile(hComm,lpBuf,READ_BUF_SIZE,&dwRead,&osReader)){ if(GetLastError()!=ERROR_IO_PENDING)//read not delayed?

//Error in communications;report it.

else

fWaitingOnRead=TRUE;

}

else{

//read completed immediately

HandleASuccessfulRead(lpBuf,dwRead);

}

}

The second part of the overlapped operation is the detection of its completion.The event handle in the OVERLAPPED structure is passed to the WaitForSingleObject function,which will wait until the object is

signaled.Once the event is signaled,the operation is complete.This does not mean that it was completed successfully,just that it was completed.The GetOverlappedResult function reports the result of the operation.If an error occurred,GetOverlappedResult returns FALSE and GetLastError returns the error code.If the operation was completed successfully,GetOverlappedResult will return TRUE.

Note GetOverlappedResult can detect completion of the operation,as well as return the operation’s failure status.GetOverlappedResult returns FALSE and GetLastError returns ERROR_IO_INCOMPLETE when the operation is not completed.In addition,GetOverlappedResult can be made to block until the operation completes.This effectively turns the overlapped operation into a nonoverlapped operation and is accomplished by passing TRUE as the bWait parameter.

Here is a code snippet that shows one way to detect the completion of an overlapped read operation.Note that the code calls the same function to process the data that was called when the operation completed immediately.Also note the use of the fWaitingOnRead flag. Here it controls entry into the detection code,since it should be called only when an operation is outstanding.

#define READ_TIMEOUT500//milliseconds

DWORD dwRes;

if(fWaitingOnRead){

dwRes=WaitForSingleObject(osReader.hEvent,READ_TIMEOUT);

switch(dwRes)

{

//Read completed.

case WAIT_OBJECT_0:

if(!GetOverlappedResult(hComm,&osReader,&dwRead,FALSE)) //Error in communications;report it.

else

//Read completed successfully.

HandleASuccessfulRead(lpBuf,dwRead);

//Reset flag so that another opertion can be issued.

fWaitingOnRead=FALSE;

break;

case WAIT_TIMEOUT:

//Operation isn't complete yet.fWaitingOnRead flag isn't

//changed since I'll loop back around,and I don't want

//to issue another read until the first one finishes.

//

//This is a good time to do some background work.

break;

default:

//Error in the WaitForSingleObject;abort.

//This indicates a problem with the OVERLAPPED structure's

//event handle.

break;

}

}

Writing

Transmitting data out the communications port is very similar to reading in that it uses a lot of the same APIs.The code snippet below demonstrates how to issue and wait for a write operation to be completed.

BOOL WriteABuffer(char*lpBuf,DWORD dwToWrite)

{

OVERLAPPED osWrite={0};

DWORD dwWritten;

DWORD dwRes;

BOOL fRes;

//Create this write operation's OVERLAPPED structure's hEvent.

osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

if(osWrite.hEvent==NULL)

//error creating overlapped event handle

return FALSE;

//Issue write.

if(!WriteFile(hComm,lpBuf,dwToWrite,&dwWritten,&osWrite)){ if(GetLastError()!=ERROR_IO_PENDING){

//WriteFile failed,but isn't delayed.Report error and abort.

fRes=FALSE;

}

else

//Write is pending.

dwRes=WaitForSingleObject(osWrite.hEvent,INFINITE);

switch(dwRes)

{

//OVERLAPPED structure's event has been signaled.

case WAIT_OBJECT_0:

if(!GetOverlappedResult(hComm,&osWrite,&dwWritten, FALSE))

fRes=FALSE;

else

//Write operation completed successfully.

fRes=TRUE;

break;

default:

//An error has occurred in WaitForSingleObject.

//This usually indicates a problem with the

//OVERLAPPED structure's event handle.

fRes=FALSE;

break;

}

}

}

else

//WriteFile completed immediately.

fRes=TRUE;

CloseHandle(osWrite.hEvent);

return fRes;

}

Notice that the code above uses the WaitForSingleObject function with a time-out value of INFINITE.This causes the WaitForSingleObject function to wait forever until the operation is completed;this may make the thread or program appear to be“hung?when,in fact,the

write operation is simply taking a long time to complete or flow control has blocked the transmission.Status checking,discussed later,can detect this condition,but doesn’t cause the WaitForSingleObject to return.Three things can alleviate this condition:

?Place the code in a separate thread.This allows other threads to execute any functions they desire while our writer thread waits for the write to be completed.This is what the

MTTTY sample does.

?Use COMMTIMEOUTS to cause the write to be completed after a time-out period has passed.This is discussed more fully in the“Communications Time-outs?section later in

this article.This is also what the MTTTY sample allows.

?Change the WaitForSingleObject call to include a real time-out value.This causes more problems because if the program issues another operation while an older operation is still

pending,new OVERLAPPED structures and overlapped events need to be allocated.This type of recordkeeping is difficult,particularly when compared to using a“job

queue?design for the operations.The“job queue?method is used in the MTTTY sample.

Note:The time-out values in synchronization functions are not

communications time-outs.Synchronization time-outs cause

WaitForSingleObject or WaitForMultipleObjects to return

WAIT_TIMEOUT.This is not the same as a read or write operation timing https://www.wendangku.net/doc/e48131207.html,munications time-outs are described later in

this article.

Because the WaitForSingleObject function in the above code snippet uses an INFINITE time-out,it is equivalent to using GetOverlappedResult with TRUE for the fWait parameter.Here is equivalent code in a much simplified form:

BOOL WriteABuffer(char*lpBuf,DWORD dwToWrite)

{

OVERLAPPED osWrite={0};

DWORD dwWritten;

BOOL fRes;

//Create this writes OVERLAPPED structure hEvent.

osWrite.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

if(osWrite.hEvent==NULL)

//Error creating overlapped event handle.

return FALSE;

//Issue write.

if(!WriteFile(hComm,lpBuf,dwToWrite,&dwWritten,&osWrite)){ if(GetLastError()!=ERROR_IO_PENDING){

//WriteFile failed,but it isn't delayed.Report error and abort.

fRes=FALSE;

}

else{

//Write is pending.

if(!GetOverlappedResult(hComm,&osWrite,&dwWritten,TRUE)) fRes=FALSE;

else

//Write operation completed successfully.

fRes=TRUE;

}

VC与c51串口通讯程序

跟着步骤学习 1.建立项目:打开VC++6.0,建立一个基于对话框的MFC应用程序SCommTest 2.在项目中插入MSComm控件选择Project菜单下Add To Project子菜单中的 Components and Controls…选项,在弹出的对话框中双击Registered ActiveX Controls项(稍等一会,这个过程较慢),则所有注册过的ActiveX控件出现在列表框中。选择Microsoft Communications Control, version 6.0,,单击Insert按钮将它插入到我们的Project中来,接受缺省的选项。(如果你在控件列表中看不到Microsoft Communications Control, version 6.0,那可能是你在安装VC6时没有把ActiveX一项选上,重新安装VC6,选上ActiveX就可以了), 这时在ClassView视窗中就可以看到CMSComm类了,(注意:此类在ClassWizard中看不到,重构clw 文件也一样),并且在控件工具栏Controls中出现了电话图标(如图1所示),现在要做的是用鼠标 将此图标拖到对话框中,程序运行后,这个图标是看不到的。 3.利用ClassWizard定义CMSComm类控制对象打开ClassWizard ->Member Viariables选项卡,选择CSCommTestDlg类,为IDC_MSCOMM1 添加控制变量:m_ctrlComm,这时你可以看一看,在对话框头文件中自动 加入了//{{AFX_INCLUDES() #include "mscomm.h" //}}AFX_INCLUDES (这时运行程序,如果有错,那就再从头开始)。 4.在对话框中添加控件向主对话框中添加两个编辑框,一个用于接收显 示数据ID为IDC_EDIT_RXDATA,另一个用于输入发送数据,ID为 IDC_EDIT_TXDATA,再添加一个按钮,功能是按一次就把发送编辑框中的内 容发送一次,将其ID设为IDC_BUTTON_MANUALSEND。别忘记了将接收编辑 框的Properties->Styles中把Miltiline和Vertical Scroll属性选上,发送编辑框若你想输入多行文字,也可选上Miltiline。 再打开ClassWizard->Member Viariables选项卡,选择CSCommTestDlg类,为IDC_EDIT_RXDATA 添加CString变量m_strRXData,为IDC_EDIT_TXDATA添加CString变量m_strTXData。说明: m_strRXData和m_strTXData分别用来放入接收和发送的字符数据。 5.添加串口事件消息处理函数OnComm()打开ClassWizard->Message Maps,选择类CSCommTestDlg,选择IDC_MSCOMM1,双击消息OnComm,将弹出的对话框中将函数名改为OnComm,(好记而已)OK。 这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接收数据缓冲区中有字符的消息事件,我们刚才添加的函数就会执行,我们在OnComm()函数加入相应的处理代码就能实现自已想要的功能了。请你在函数中加入如下代码: void CSCommTestDlg::OnComm() { // TODO: Add your control notification handler code here VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed. CString strtemp; if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符 { ////////以下你可以根据自己的通信协议加入处理代码 variant_inp=m_ctrlComm.GetInput(); //读缓冲区 safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量 len=safearray_inp.GetOneDimSize(); //得到有效数据长度 for(k=0;k

VC6.0MFC串口通信编写全过程(DOC)

其于MFC 的串口调试助手编辑过程 一、新建 打开 VC6.0 文件 新建 工程 MFC AppWiard(exe) 位置(选择保存工程位置) 工程名称(输入工程名XXXX ) 确定 选择基本对话框 下一步 下一步 下一步 选择(CXXXXDlg ) 完成 确定 在生成的基本对话框内将不需要按钮及提示框(自动生成的“确定”“取消” 及提示框)删除或修改使用,至此基本框架完成如下图: 二、往生成的基本框架中添加控件 1、因为控件列表框内没有串口通信用到的通信控件,所以要先添加到控件列表框内再将控件添加到基本框内使用,步骤如下: 菜单栏 工程 添加到工程 Components and controls … Registered ActiveX Controls 选择“Microsoft Communications Control, version 6.0” Insert 确定 OK 关闭此子窗口完成添加操作标志如上图所示。 2、将刚才添加添加到控件列表框内的串口控件添加到基本框架内 点击控件列表框内的串口控件,此时光标变为“十”形,在基本框架内随意划取一矩 形区域,即可以添加串口控件,不需要修改此控件的大小及位置,因为程编译运行后此控件是看不到的,步骤结果如下图:

3、继续往基本框架内添加用于编辑发送数据的输入编辑框及输出编辑框,同理选择控件列表框内的“编辑框控件”,以相同的操作即可添加两个编辑窗口及一个按纽控件如下图所示: 这两个窗口需要修改大小及位置,因为程序运行后将会显示而串口通信控件则不显示,上图是运行后的效果。 4、对以上四个控件编程步骤如下: a 、右击串口通信控件 建立类向导 Member variables Control IDS 中选择IDC_MSCOMM1 add variable … Member variable name 中输入控件变量名m_ctrlComm (变量名可以随意选取,但程序中应与所取变量名一致) OK 确定

VC++_串口上位机编程实例

VC++串口上位机简单例程(源码及详细步骤) (4.33MB) VC++编写简单串口上位机程序 2010年4月13日10:23:40 串口通信,MCU跟PC通信经常用到的一种通信方式,做界面、写上位机程序的编程语言、编译环境等不少,VB、C#、LABVIEW等等,我会的语言很少,C语言用得比较多,但是还没有找到如何用C语言来写串口通信上位机程序的资料,在图书管理找到了用VC++编写串口上位机的资料,参考书籍,用自己相当蹩脚的C++写出了一个简单的串口上位机程序,分享一下,体验一下单片机和PC通信的乐趣。 编译环境:VC++6.0 操作系统:VMWare虚拟出来的Windows XP 程序实现功能: 1、PC初始化COM1口,使用n81方式,波特率57600与单片机通信。PC的COM口编号可以通过如下方式修改: 当然也可以通过上位机软件编写,通过按钮来选择COM端口号,但是此次仅仅是简单的例程,就没有弄那么复杂了。COM1口可用的话,会提示串口初始化完毕。否则会提示串口已经打开Port already open,表示串口已经打开,被占用了。 2、点击开始转换,串口会向单片机发送0xaa,单片机串口中断接收到0xaa后启动ADC转

换一次,并把转换结果ADCL、ADCH共两个字节的结果发送至PC,PC进行数值转换后在窗口里显示。(见文章末尾图) 3、为防止串口被一只占用,点击关闭串口可以关闭COM1,供其它程序使用,点击后按钮变为打开串口,点击可重新打开COM1。 程序的编写: 1、打开VC++6.0建立基于对话框的MFC应用程序Test,

2、在项目中插入MSComm控件:工程->增加到工程->Components and Controls->双击Registered ActiveX Controls->选择Microsoft Communications Control,version6.0->Insert,按

(完整版)VC6.0MFC串口通信编写全过程

其于MFC的串口调试助手编辑过程 一、新建 打开VC6.0 文件新建工程MFC AppWiard(exe) 位置(选择保存工程位置)工程名称(输入工程名XXXX)确定选择基本对话框下一步下一步下一步选择(CXXXXDlg)完成确定在生成的基本对话框内将不需要按钮及提示框(自动生成的“确定”“取消”及提示框)删除或修改使用,至此基本框架完成如下图: 二、往生成的基本框架中添加控件 1、因为控件列表框内没有串口通信用到的通信控件,所以要先添加到控件列表框内再 将控件添加到基本框内使用,步骤如下: 菜单栏工程添加到工程Components and controls…Registered ActiveX Controls 选择“Microsoft Communications Control, version 6.0”Insert 确定OK 关闭此子窗口完成添加操作标志如上图所示。 2、将刚才添加添加到控件列表框内的串口控件添加到基本框架内 点击控件列表框内的串口控件,此时光标变为“十”形,在基本框架内随意划取一矩形区域,即可以添加串口控件,不需要修改此控件的大小及位置,因为程编译运行后此控件是看不到的,步骤结果如下图:此控件(标志)是下面步骤添加进来的串口控件 基本框架

3、继续往基本框架内添加用于编辑发送数据的输入编辑框及输出编辑框,同理选择控 件列表框内的“编辑框控件”,以相同的操作即可添加两个编辑窗口及一个按纽控件如 下图所示: 选择其中任 意一个作为 输入编辑框 及输出编辑 框 这两个窗口需要修改大小及位置,因为程序运行后将会显示而串口通信控件则不显示, 上图是运行后的效果。 4、对以上四个控件编程步骤如下: a、右击串口通信控件建立类向导Member variables Control IDS中选 择IDC_MSCOMM1 add variable…Member variable name中输入控件变量名 m_ctrlComm(变量名可以随意选取,但程序中应与所取变量名一致)OK 确 定

项目工程竣工验收全套材料资料

工程竣工验收是指建设工程依照国家有关法律、法规及工程建设规范、标准的规定完成工程设计文件要求和合同约定的各项内容,建设单位已取得政府有关主管部门(或其委托机构)出具的工程施工质量、消防、规划、环保、城建等验收文件或准许使用文件后,组织工程竣工验收并编制完成《建设工程竣工验收报告》。 验收备案表(封面) 由建设单位在提交备案文件资料前按实填写。 备案目录(表一) 由备案部门填写。 工程概况(表二) 1.其中备案日期:由备案部门填写。 2.竣工验收日期:与《竣工验收证明书》竣工验收日期一致。 建设工程规划许可证(复印件)(原件提交验证) 建设工程施工许可证(复印件)(原件提交验证) 建筑工程施工图设计审查报告 单位工程验收通知书(表三) 由建设单位加盖公章,市建设工程质量监督站项目主监员签名,并要求详细填写参建各方验收人员名单,其中包括建设(监理)单位、施工单位、勘察设计单位人员。 单位工程竣工验收证明书(表四) 1.由建设单位交施工单位填写,并经各负责主体(建设、监理、勘测、设计、施工单位)签字加盖法人单位公章后,送质监站审核通过后,提交一份至备案部门。 2.验收意见一栏,须说明内容包括:该工程是否已按设计和合同要求施工完毕,各系统的使用功能是否已运行正常,并符合有关规定的要求;施工过程中出现的质量问题是否均已处理完毕,现场是否发现结构和使用功能方面的隐患,参验人员是否一致同意验收,工程技术档案、资料是否齐全等情况进行简明扼要的阐述。 整改通知书(表五) 上面要求记录质量监督站责令整改问题的书面整改记录,系指工程是否存有不涉及结构安全和主要使用功能的其他一般质量问题,是否已整改完毕。 整改完成报告书(表六) 要求详细记录整改完成情况,并由建设方签字加盖公章、主监员确认整改完成情况,若在工程验收过程中,未有整改内容,也需要业主(监理)单位、签字盖章确认。 工程质量监理评估报告(表七) 1.监理单位在工程竣工预验收后,施工单位整改完毕,由总监理工程师填写。 2.质量评估意见一栏: (a).项目监理部是否已严格按照《建设工程监理规范》、监理合同、监理规划及监理实施细则对该工程进行了全面监理。 (b).地基及基础工程施工质量是否符合设计及规范要求; (c).主体工程(含网架、幕墙、干挂石材、地下结构、钢结构等)施工质量是否符合设计及相关规范要求; (d).水、电、暖通等安装工程施工质量是否符合设计及规范要求是否满足使用功能要求。 3.明确评定工程质量等级。 质量站出具的工程竣工验收内部函件

VCMSComm串口发送与接收上位机制做总结

VC++MSComm串口发送与接收上位机本设计用VC编写的一个简单的上位机软件,实现功能为:简单的串口数据发送与接收。 具体步骤如下: 一.建立应用程序工程“串口通信_韩季方01” 1.打开VC++6.0—》建立对话框MFC应用程序:串口通信_韩季方01—》 添加基本控件如图1.0。 图1.0 2.添加MSComm控件:Add To Project—》Components and Controls…打开如图1.1,双击“Registered ActiveX Contronls”项—》出现如图1.2—》选择“Microsoft Communications Control,version 6.0”控件—》点击“Insert”—》提示“…”确认即可—》弹出图1.3—》点击“OK”—》再点击“Close”。 下一步,将对话框资源控件中的电话状控件托到对话框中即可,如图1.4。

图1.1 图1.2

图1.3 图1.4 3.编辑控件及其属性设置:如表1.0

4.添加变量及其类型方法如图1.5 图1.5 二.初始化串口:设置MSComm控件属性 打开Class Wizard—》Member Variables—》选IDC_MSCOMM1—》点击“Add Varialbe…”—》添加变量m_ctrlComm。如图1.5。 之后,在工作空间打开文件如图2.0—》在函数OnInitDialog中添加代码如图2.1。

图2.0

图2.1 三.添加串口事件消息处理函数OnComm() 打开Class Wizard—》Member Maps—》Class Name中选择C_01Dlg—》在Object Ids中选择IDC_MSCOMM1—》在Message中选中OnComm—》单击“Add Function”按钮—》将函数名改为OnComm(好记而已)—》单击OK,完成后如图3.0 同理在函数OnComm()中添加代码如图3.1

如何用VC++实现串口通信

用VC 6.0实现串行通信的三种方法 中国科学院王颖 ---- 摘要:本文介绍了在Windows平台下串行通信的实现机制,讨论了根据不同的条件用Visual C++ 设计串行通信程序的三种方法,并结合实际,实现对温度数据的接收监控。 ---- 在实验室和工业应用中,串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛。依据不同的条件实现对串口的灵活编程控制是我们所需要的。 ---- 在光学镜片镀膜工艺中,用单片机进行多路温度数据采集控制,采集结果以串行方式进入主机,每隔10S向主机发送一次采样数据,主机向单片机发送相关的控制命令,实现串行数据接收,处理,记录,显示,实时绘制曲线。串行通信程序开发环境为VC++ 6.0。 ---- Windows下串行通信 ---- 与以往DOS下串行通信程序不同的是,Windows不提倡应用程序直接控制硬件,而是通过Windows 操作系统提供的设备驱动程序来进行数据传递。串行口在Win 32中是作为文件来进行处理的,而不是直接对端口进行操作,对于串行通信,Win 32 提供了相应的文件I/O函数与通信函数,通过了解这些函数的使用,可以编制出符合不同需要的通信程序。与通信设备相关的结构有COMMCONFIG ,COMMPROP,COMMTIMEOUTS,COMSTAT,DCB,MODEMDEVCAPS,MODEMSETTINGS共7个,与通信有关的Windows API函数共有26个,详细说明可参考MSDN帮助文件。以下将结合实例,给出实现串行通信的三种方法。 ---- 实现串行通信的三种方法 ---- 方法一:使用VC++提供的串行通信控件MSComm 首先,在对话框中创建通信控件,若Control 工具栏中缺少该控件,可通过菜单Project --> Add to Project --> Components and Control插入即可,再将该控件从工具箱中拉到对话框中。此时,你只需要关心控件提供的对Windows 通讯驱动程序的API 函数的接口。换句话说,只需要设置和监视MSComm控件的属性和事件。 ---- 在ClassWizard中为新创建的通信控件定义成员对象(CMSComm m_Serial),通过该对象便可以对串口属性进行设置,MSComm 控件共有27个属性,这里只介绍其中几个常用属性: ---- CommPort 设置并返回通讯端口号,缺省为COM1。 ---- Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。 ---- PortOpen 设置并返回通讯端口的状态,也可以打开和关闭端口。 ---- Input 从接收缓冲区返回和删除字符。 ---- Output 向发送缓冲区写一个字符串。 ---- InputLen 设置每次Input读入的字符个数,缺省值为0,表明读取接收缓冲区中的全部内

VC串口通信实例 MSComm

VC串口通信实例 MSComm 计算机与外界的信息交换称为通信。基本的通信方式有并行通信和串行通信两种。串行通信是指一条信息额各位数据被逐位按顺序传送的通信方式。随着计算机技术的发展和推广,利用串口进行数据通讯在通讯领域中占有着重要的地位。串行通信的特点是:数据位传送,按位顺序进行,最少只需要一根传输线即可完成,成本低但传送速度慢。串行通信的距离可以从几米到几千米。利用串口进行数据通讯在通讯领域中占有着重要的地位,串口通讯在通讯软件中有着十分广泛的应用。如电话、传真、视频和各种控制等。串口通讯目前流行的方法大概有三种:一是利用Microsoft提供的CMSCOMM控件进行通讯,不过现在很多程序员都觉应该放弃这种方式。二是利用WINAPI函数进行编程,这种编程的难度高,要求掌握很多的API 函数。三是利用现在网络上面提供的一些串口通讯控件进行编写。这三种方法都没有同Windows服务联系起来。 串行接口输入输出过程描述 串行接口包括4个主要寄存器,即控制寄存器、状态寄存器、数据输入寄存器及数据输出寄存器。控制寄存器用来接收CPU送给此接口的各种控制信息,而控制信息决定接口的工作方式。状态寄存器的各位叫状态位,每一个状态位都可以用来指示传输过程中的某一种错误或当前传输状态。数据输入寄存器总是和串行输入/并行输出移位寄存器配对使用的。在输入过程中,数据一位一位从外部设备进入接口的寄存器,当接收完一个数据后,数据就从移位寄存器送到输入寄存器,再等待CPU来取走。输出的情况与输入过程类似,在输出过程中,数据输出寄存器与并行输入/串行输出移位寄存器配对使用。当CPU往数据输出寄存器中输出一个数据后,数据便传输到移位寄存器,然后一位一位地通过输出线送到外设。串行通信数据的收发方式分为异步通信方式与同步通信方式。

建设工程竣工验收全套表格

建设表1 天津市市政建设工程()验收通知书 监督站: 由写全称勘察,写全称设计, 写全称公司施工, 写全称监理的, 按图纸(路基、基础、主体、竣工)工程, 桩号写桩号或井号或具体构筑物,施工、勘察、设计、监理各责任主体在工程施工中按照有关法规、规章及强制性标准履行了各自的职责,完成了合同、设计文件要求,已具备验收要求。我方于年月日上午(下午) 点,组织工程验收。 验收地点: 联系人: 电话: 附:(路基、基础、主体、竣工)验收组成员名单 建设单位:(公章) 年月日 注:验收前七日通知监督单位。本表由建设单位填写。 基础包括排水管道基础、桥梁桩基础、道路路基。 主体包括桥梁上部结构,复土前的排水管道、道路基层。

( )分部工程验收组成员名单工程名称按图纸工程地址 建筑面积(长度) 长?m,宽?m,面积?㎡, 雨水?m污水?m。结构类型沥青混凝土、承插口砼管、绿 化园林 开工时间本分部工程开工时间,报竣工时间本分部工程完工时间,报竣工 验收时写竣工验收时间组织单位主持人 参加验收单位 验收组成员 姓名职务专业建设 单位 全称项目负责人写明写明 勘察 单位 全称项目负责人写明写明 设计 单位 全称项目负责人写明写明 施工单位全称必须是中标项 目经理 写明写明 监理单位全称必须是中标总 监 写明写明 其它 单位 可以写代建单位 建设单位(公章) 年月日

工程质量验收证明书工程名称:按图纸

建设表2-2工程名称(标段)按图纸。如:经一路(纬一二路—纬五路)道路排水工程 单位工程名称如:道路工程 部位(工序)名称如:石灰粉煤灰土、石灰粉煤灰碎石、水泥稳定碎石 验收范围(桩号) 质量验收意见勘察单位意见: 必须写明意见,不允许仅签字 设计项目负责人:本人签字年月日 勘察单位部门章施工单位意见: 必须写明意见,不允许仅签字 总工程师: 本人签字年月日项目经理: 本人签字年月日 施工企业质量部门章设计单位意见: 必须写明意见,不允许仅签字 设计项目负责人:本人签字年月日 设计单位部门章

工程竣工验收全套资料

工程竣工验收 工程竣工验收是指建设工程依照国家有关法律、法规及工程建设规、标准的规定完成工程设计文件要求和合同约定的各项容,建设单位已取得政府有关主管部门(或其委托机构)出具的工程施工质量、消防、规划、环保、城建等验收文件或准许使用文件后,组织工程竣工验收并编制完成《建设工程竣工验收报告》。 验收备案表(封面) 由建设单位在提交备案文件资料前按实填写。 备案目录(表一) 由备案部门填写。 工程概况(表二) 1.其中备案日期:由备案部门填写。 2.竣工验收日期:与《竣工验收证明书》竣工验收日期一致。 建设工程规划许可证(复印件)(原件提交验证) 建设工程施工许可证(复印件)(原件提交验证) 建筑工程施工图设计审查报告 单位工程验收通知书(表三) 由建设单位加盖公章,市建设工程质量监督站项目主监员签名,并要求详细填写参建各方验收人员,其中包括建设(监理)单位、施工单位、勘察设计单位人员。 单位工程竣工验收证明书(表四) 1.由建设单位交施工单位填写,并经各负责主体(建设、监理、勘测、设计、施工单位)签字加盖法人单位公章后,送质监站审核通过后,提交一份至备案部门。 2.验收意见一栏,须说明容包括:该工程是否已按设计和合同要求施工完毕,各系统的使用功能是否已运行正常,并符合有关规定的要求;施工过程中出现的质量问题是否均已处理完毕,现场是否发现结构和使用功能方面的隐患,参验人员是否一致同意验收,工程技术档案、资料是否齐全等情况进行简明扼要的阐述。 整改通知书(表五) 上面要求记录质量监督站责令整改问题的书面整改记录,系指工程是否存有不涉及结构安全和主要使用功能的其他一般质量问题,是否已整改完毕。 整改完成报告书(表六) 要求详细记录整改完成情况,并由建设方签字加盖公章、主监员确认整改完成情况,若在工程验收过程中,未有整改容,也需要业主(监理)单位、签字盖章确认。 工程质量监理评估报告(表七) 1.监理单位在工程竣工预验收后,施工单位整改完毕,由总监理工程师填写。 2.质量评估意见一栏: (a).项目监理部是否已严格按照《建设工程监理规》、监理合同、监理规划及监理实施细则对该工程进行了全面监理。 (b).地基及基础工程施工质量是否符合设计及规要求; (c).主体工程(含网架、幕墙、干挂石材、地下结构、钢结构等)施工质量是否符合设计及相关规要求; (d).水、电、暖通等安装工程施工质量是否符合设计及规要否满足使用功能要求。 3.明确评定工程质量等级。 质量站出具的工程竣工验收部函件

MFC串口通信编程详解解析

MFC串口通信编程介绍 主要介绍了用CreateFile(函数和WriteFile(函数读写串口的实例,以及设置串口属性的实例. 在工业控制中,工控机(一般都基于Windows平台经常需要与智能仪表通过串口 进行通信.串口通信方便易行,应用广泛. 一般情况下,工控机和各智能仪表通过RS485总线进行通信.RS485的通信方式是半双工的,只能由作为主节点的工控PC机依次轮询网络上的各智能控制单元子节点.每次通信都是由PC机通过串口向智能控制单元发布命令,智能控制单元在接收到正确的命令后作出应答. 在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序简单,但欠灵活.其二是调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活.下面只介绍API串口通信部分. 串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式.同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中, 虽然不会阻塞主线程,但是仍然会阻塞监听线程;而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞. 无论哪种操作方式,一般都通过四个步骤来完成: (1打开串口 (2配置串口 (3读写串口 (4关闭串口

一打开串口 Win32系统把文件的概念进行了扩展.无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的.该函数的原型为: HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile; ?lpFileName:将要打开的串口逻辑名,如“COM1”; ?dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列; ?dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0; ?lpSecurityAttributes:引用安全性属性结构,缺省值为NULL; ?dwCreationDistribution:创建标志,对串口操作该参数必须置为 OPEN_EXISTING; ?dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O操 作;

[全套]竣工验收资料目录房建项目

附件一从事监理工作期间资料发文 交大监理金竹人才公寓[2013] 1号签发人: 关于下发高层次人才公寓工程项目 《施工内业资料整理目录》的通知 中铁建设集团有限公司贵阳金竹高层次人才公寓工程项目部:根据《建筑工程质量验收规范》,为了确保工期,从开工阶段起加强内业资料管理,明确整个项目建设所需内业资料,现将整个项目建设阶段《施工内业资料整理归档目录》下发给你们,请予遵照执行。 特此通知 成都交大工程建设监理有限公司 贵阳金竹高层次人才公寓及一期项目监理部 二0一三年八月八日

附:全套《建筑工程施工内业资料整理归档目录》 附:《建筑工程施工内业资料整理目录》---按竣工资料排序 第一册单位(子单位)工程质量竣工验收资料 1.施工单位提出的《工程竣工验收报告》 2.勘查单位提出的《工程质量检查报告》 3.设计单位提出的《工程质量检查报告》 4.监理单位提出的《工程质量评估报告》 3.建设单位提交的《建筑工程竣工验收监督通知书》 4.公安消防部门出具的消防认可文件或准许使用文件 5.工程质量保修书 6.单位(子单位)工程质量管理核查记录 7.单位(子单位)工程质量控制资料核查记录 8.单位(子单位)工程安全和功能检验资料核查及主要功能抽查记录 9.单位(子单价)工程观感质量检查记录 10.单位(子单位)工程质量竣工验收记录 11.单位(子单位)工程质量竣工验收报告 第二册单位(子单位)工程施工质量管理资料 1.施工图设计文件审查报告及回复 2.施工许可证书 3.施工合同 4.工程开工报告 5.施工现场质量管理检查记录及施工项目管理机构审查记录表 6.图纸会审记录 7.施工现场设计变更文件及洽商记录 8.施工组织设计及项目管理实施规划 9.施工技术交底技术 10.工程定位、测量放线记录 11.工程质量事故调查处理记录 12.施工日志 13.地质勘查资料 14.竣工图 第三册土建工程质量控制资料与安全及功能检验资料及主要功能抽查记录 第一分册施工质量主控资料 1.材料进场汇总表及检查验收记录 2.原材料出厂质量证明文件、进场复检试验报告及见证记录 1)钢筋出厂质量证明文件,进场复检试验报告及见证记录

VC++串口通信编程

在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信。串口通信方便易行,应用广泛。 一般情况下,工控机和各智能仪表通过RS485总线进行通信。RS485的通信方式是半双工的,只能由作为主节点的工控PC机依次轮询网络上的各智能控制单元子节点。每次通信都是由PC机通过串口向智能控制单元发布命令,智能控制单元在接收到正确的命令后作出应答。 在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX 控件,这种方法程序简单,但欠灵活。其二是调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活。本文我们只介绍API串口通信部分。 串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式)。同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞。 无论那种操作方式,一般都通过四个步骤来完成: (1)打开串口 (2)配置串口 (3)读写串口 (4)关闭串口 (1)打开串口 Win32系统把文件的概念进行了扩展。无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的。该函数的原型为: HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); ?lpFileName:将要打开的串口逻辑名,如“COM1”; ?dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列; ?dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0; ?lpSecurityAttributes:引用安全性属性结构,缺省值为NULL; ?dwCreationDistribution:创建标志,对串口操作该参数必须置为OPEN_EXISTING; ?dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同 步I/O操作; ?hTemplateFile:对串口而言该参数必须置为NULL;

全套工程验收资料(XXX装饰装修工程完整填写范例版)

目录 目录 (1) 工程概况表 (8) 施工现场管理检查记录 (9) 装修部分 (10) 砖砌体报验申请表 (11) 砖砌体工程检验批质量验收记录表 (12) 一般抹灰报验申请表 (13) 一般抹灰工程检验批质量验收记录表 (14) 防锈漆喷涂报验申请表 (15) 防锈涂料涂装工程检验批质量验收记录表 (16) 钢结构桁架制作(安装)焊接报验申请表 (17) 钢结构制作(安装)焊接工程检验批质量验收记录表 (18) 钢结构桁架零件、部件加工报验申请表 (19) 钢结构零、部件加工工程检验批质量验收记录表 (20) 骨架隔墙报验申请表 (21) 隐蔽工程验收记录表 (22) 骨架隔墙工程检验批质量验收记录表 (23) 暗龙骨吊顶报验申请表 (24) 隐蔽工程验收记录表 (25) 暗龙骨吊顶工程检验批质量验收记录表 (26) 地面找平层报验申请表 (27) 找平层检验批质量验收记录表 (28) 防火涂料涂装工程报验申请表 (29) 隐蔽工程验收记录 (30) 防火涂料涂装工程检验批质量验收记录表 (31) 防腐涂料涂装工程报验申请表 (32) 隐蔽工程验收记录 (33) 防腐涂料涂装工程检验批质量验收记录表 (34) 门窗套制作与安装报验申请表 (35) 门窗套制作与安装工程检验批质量验收记录表 (36)

窗帘盒、窗台板和散热器罩制作与安装工程 (38) 涂料防水层报验申请表 (39) 防水工程试水检查记录 (40) 隐蔽工程验收记录 (41) 涂料防水层检验批质量验收记录表 (42) 卷材防水层报验申请表 (43) 防水工程试水检查记录 (44) 隐蔽工程验收记录 (45) 卷材防水层检验批质量验收记录表 (46) 大理石和花岗石面层报验申请表 (47) 大理石和花岗石面层检验批质量验收记录表 (48) 马赛克面层报验申请表 (49) 马赛克面层检验批质量验收记录表 (50) 基层清理报验申请表 (51) 隐蔽工程检查验收表 (52) 饰面板安装报验申请表 (53) 隐蔽工程验收记录 (54) 饰面板安装工程检验批质量验收记录表 (55) 装饰抹灰工程报验申请表 (56) 装饰抹灰工程检验批质量验收记录表 (57) 木门窗制作报验申请表 (58) 木门窗制作工程检验批质量验收记录表 (59) 木门窗安装报验申请表 (60) 隐蔽工程验收记录 (61) 木门窗安装工程检验批质量验收记录表 (62) 门窗玻璃安装报验申请表 (63) 门窗玻璃安装工程检验批质量验收记录表 (64) 溶剂型涂料涂饰报验申请表 (65) 溶剂型涂料涂饰工程检验批质量验收记录表 (66) 美术涂料涂饰报验申请表 (67) 美术涂料涂饰工程检验批质量验收记录表 (68) 水性涂料涂饰报验申请表 (69)

施工单位全套竣工资料(完整资料).doc

【最新整理,下载后即可编辑】 施工单位全套竣工资料 1 《工程施工管理工作报告》 主要包括以下几方面内容: (1) 工程概况。 (2) 工程投标。主要叙述投标过程、投标书编制原则等。 (3) 施工布置、进度和完成的主要工程量。主要叙述施工总体布置、进度及分段施工进度安排及主要项目施工过程情况。 (4) 主要施工方法。主要叙述施工中采用的主要施工方法及工艺等。 (5) 施工质量管理。主要叙述施工质量保证体系及实施情况,工程施工自检情况(质量数据、统计分析等)。 (6) 价款结算与财务管理。 (7) 结论与建议。 (8) 附件。包括: ①施工管理机构设置与人员; ②施工管理大事记。 2 单元工程质量评定资料 3 竣工图纸(包括渠道纵断面图) 4 产品出厂资料、测绘验收资料等 5 各种原材料、构件质量鉴定、检查测试资料(砂、石、水泥、砂浆、砼、土样等)

资料装订要求 1 第一册——综合卷 (1) 文件编制人员、审查、审定、签章。 (2) 资料目录。 (3) 施工报告(必须包括以下内容): ①工程开竣工时间、主要施工方法及工艺; ②施工质量管理,重大事故处理等; ③合同工程量、实际完成工程量(列表汇总); ④项目划分及质量评定结果(列表); ⑤竣工决算的价款(文字性叙述); ⑥施工大事记; ⑦结论与建议。 (4) 竣工图片(相片)。 (5) 竣工决算。包括: ①编制依据; ②决算表(以招投标报价模式编制)。 (6) 竣工图纸。 2 第二册——质量卷 (1) 质量自检报告。 (2) 单位工程质量评定表。 (3) 分部工程质量评定表。 (4) 单元工程质量评定表(含单元工程验收申报表)。 (5) 各种原材料检验报告(砂、石、水泥、配合比、试块汇总表及强度评定结果土样等)。

VC串口编程API详解

V C串口编程A P I详解集团企业公司编码:(LL3698-KKI1269-TM2483-LUI12689-ITT289-

V C++串口编程主要A P I详解该文档是本人在刚刚接触到VC++下的串口编程时,总结归纳的一些主要的API函数,可以帮助初学者更好的理解串口编程的方法。 1.打开串口 HANDLECreateFile(LPCTSTRlpFileName, DWORDdwDesiredAccess, DWORDdwShareMode, LPSECURITY_ATTRIBUTESlpSecurityAttributes, DWORDdwCreationDistribution, DWORDdwFlagsAndAttributes, HANDLEhTemplateFile); 参数: lpFileName:将要打开的串口逻辑名,如“COM1”;dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列; dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0;lpSecurityAttributes:引用安全性属性结构,缺省值为NULL;

dwCreationDistribution:创建标志,对串口操作该参数必须置为OPEN_EXISTING; dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O操作,本工程采用异步方式; hTemplateFile:对串口而言该参数必须置为NULL; 2.获取串口设备控制块DCB BOOLGetCommState( HANDLEhFile, //标识通讯端口的句柄,由CreateFile()函数返回的句柄 LPDCBlpDCB //指向一个设备控制块(DCB结构)的指针 ); 3.设置串口设备控制块DCB BOOLSetCommState( HANDLEhFile,//标识通讯端口的句柄,由CreateFile()函数返回的句柄LPDCBlpDCB//指向一个设备控制块(DCB结构)的指针 ); 4.设置串口输入输出缓冲区大小 BOOLSetupComm( HANDLEhFile, //通信设备的句柄DWORDdwInQueue, //输入缓冲区的大小(字节数)DWORDdwOutQueue //输出缓冲区的大小(字节数)

建筑工程开工到竣工验收资料及表格(全套)

建筑工程资料 第一章工程管理资料 工程概况表 工程开工报告 工程竣工报告 工程停工报告 工程复工报告 施工进度计划分析 项目大事记 施工日志 不合格项处置记录 建设工程质量事故报告书 第二章工程技术资料 工程技术文件报审表 技术交底记录 图纸会审记录 设计交底记录 设计变更\洽商记录 第三章工程测量记录 工程定位测量记录 地基验槽记录 楼层放线记录 沉降观测记录 单位工程垂直度观测记录 第四章工程施工记录 隐蔽工程记录表 预检工程记录表 施工通用记录表 中间检查交接记录表 地基处理记录 地基钎探记录 桩基施工记录 混凝土施工记录 混凝土养护测温记录 砂浆配合比申请单 混凝土配合比申请单 混凝土开盘鉴定 预应力张拉记录 预应力筋张拉记录 有粘接应力结构灌浆记录 建筑烟(风)道检查记录

第五章工程试验记录 施工试验记录(通用) 混凝土试块强度统计\评定记录 砂浆试块强度统计\评定记录 防水工程试验检查记录 设备单机试运转记录 调试报告 电气接地电阻测试记录 电气器具通电安全检查记录 电气照明、动力试运行记录 综合布线测试记录 电气绝缘电阻测试记录 光纤损耗测试记录 视频系统末端测试记录 管道灌水试验记录 管道强度严密性试验记录 管道通水记录 管道吹(冲0洗()脱脂试验记录 室内排水管道通球试验记录 伸缩器安装记录表 现场组装除尘器、空调机漏风检测记录 风管漏风检测记录 各房间室内风量测量记录 管网风量平衡记录 电梯主要功能检查记录表 第六章施工验收记录 分项工程质量验收记录 分部(子分部)工程质量验收记录 单位(子单位)工程质量控制资料核查记录 单位(子单位)工程安全和功能检验资料核查及主要功能抽查记录 单位(子单位)工程观感质量检查记录 施工现场质量管理检查记录 工程检验质量检查记录表(通用) 分部分项工程 共划分为:一、地基与基础工程;二、主体结构;三、建筑装饰装修;四、建筑屋面; 五、建筑给水、排水及采暖;六、建筑电气;七、智能建筑;八、通风与空调;九、电梯

竣工资料最完整的范本

第一部分开工前资料 1、中标通知书及施工许可证 2、施工合同 3、委托监理工程地监理合同 4、施工图审查批准书及施工图审查报告 5、质量监督登记书 6、质量监督交底要点及质量监督工作方案 7、岩土工程勘察报告 8、施工图会审记录 9、经监理、建设单位批准所施工组织设计或施工方案 10、开工报告 11、质量管理体系登记表 12、施工现场质量管理检查记录 13、质量安全技术交底记录 14、测量定位记录 第二部分质量验收资料 1、地基验槽记录 2、基桩工程质量验收报告 3、地基处理工程质量验收报告 4、地基与基础分部工程质量验收报告 5、主体结构分部工程质量验收报告 6、特殊分部工程质量验收报告 7、线路敷设验收报告 8、地基与基础分部及所含子分部、分项、检验批质量验收记录 9、主体结构分部及所含子分部、分项、检验批质量验收记录 10、装饰装修分部及所含子分部、分项、检验批质量验收记录 11、屋面分部及所含子分部、分项、检验批质量验收记录 12、给水、排水及采暖分部及所含子分部、分项、检验批质量验收记录 13、电气分部及所含子分部、分项、检验批质量验收记录 14、智能分部及所含子分部、分项、检验批质量验收记录 15、通风与空调分部及所含子分部、分项、检验批质量验收记录 16、电梯分部及所含子分部、分项、检验批质量验收记录 17、单位工程及所含子单位工程质量竣工验收记录 18、室外工程地分部(子分部)、分项、检验批质量验收记录 第三部分实验资料 1、水泥物理性能检验报告 2、砂、石检验报告 3、各强度等级混凝土配合比实验报告 4、混凝土试件强度统计表、评定表及实验报告 5、各强度等级砂浆配合比实验报告 6、砂浆试件强度统计表及实验报告 7、砖、石、砌块强度实验报告 8、钢材力学、弯曲性能检验报告及钢筋焊接接头拉伸、弯曲检验报告或钢筋机械连接接头检验报告

相关文档
相关文档 最新文档