⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msghdler.cpp

📁 用VC编写的设备通讯程序,里面有很多规约,自己下载
💻 CPP
字号:
//**************************************************************************
//
//  Filename   :  Msghdler.cpp
//
//  Subsystem  :
//
//  Description:  Protocol message handlers.
//
//**************************************************************************

/*
 * NT Definitions
 */
#include <windows.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

#include "gencmr.h"
#include "cmriosrv.h"
#include "locmsgdef.h"

#define  TIME_DRIFT   1
#define  TIME_LIMIT   300

VOID PollMarshall(REQUEST_MSGS* pReqMsg, CPio* pPio)
{
	BYTE *p_buf;

	/*
	 *  If we are starting a poll, the command setup device in polled mode.
	 */
	p_buf = GetPioWrtBuf(pPio);
	switch ( pReqMsg->FuncCode ) {
	case INIT_POLL:
		memset((char *)GetPioReadBuf(pPio), 0, 1);
		SetPioComState(pPio, TRUE);
		switch (GetRtuType(pReqMsg->pRtu)) {
		case TIMERWSTYPE:
			SetPioReadHeadCnt(pPio, MSGBUFLEN);
			SetPioReadCnt(pPio, MSGBUFLEN);
			break;
		case TIMESFSTYPE:
			SetPioReadHeadCnt(pPio, SFMSGBUFLEN);
			SetPioReadCnt(pPio, SFMSGBUFLEN);
			break;
		}

		break;

	case INFO_POLL:		// normal polling
		switch (GetRtuType(pReqMsg->pRtu)) {
		case TIMERWSTYPE:
			SetPioReadHeadCnt(pPio, MSGBUFLEN);
			SetPioReadCnt(pPio, MSGBUFLEN);
			break;
		case TIMESFSTYPE:
			SetPioReadHeadCnt(pPio, SFMSGBUFLEN);
			SetPioReadCnt(pPio, SFMSGBUFLEN);
			break;
		}
		break;

	default:
		printf( "PollMarshall(), Unexpected Cmd: %d\n", pReqMsg->FuncCode);
		break;
	}

	memcpy(GetPioUserDefMsg(pPio), pReqMsg, sizeof(REQUEST_MSGS) );

	SetPioWriteCnt(pPio, 0);
	SetPioWriteOffset(pPio, 0);

	SetPioReadOffset(pPio, 0);
	SetPioReadFixupCnt(pPio, 0);

}


BOOL PollUnmarshall(CPio *pPio, int ioStream)
{
	BYTE  *p_buf;
	char  *ptr = NULL;
	char  strbuf[8];
	UINT  value, timdelta;
	FILETIME   filtim, locfiltim;
	SYSTEMTIME sTime, locTime;
	REQUEST_MSGS *sendInfo = (REQUEST_MSGS*)GetPioUserDefMsg(pPio);

	p_buf = GetPioReadBuf(pPio);

	if ( GetPioRecvStatus(pPio) == PIO__SUCCESS ) {
		// write data to debug buffer if rtu in debug mode
		SetPioRtuDbgInMsg(pPio, sendInfo->pRtu);
		switch(GetRtuType(sendInfo->pRtu)) {
		case TIMERWSTYPE:	          	
	    	if (GetPioReadMsgCnt(pPio) == MSGBUFLEN &&
		    	p_buf[0]  == 'S') {
			    if (p_buf[1]  == 'T' &&
				    p_buf[16] == 'A') {	// get date & time message
				    memcpy(strbuf, &p_buf[12], 4);
				    strbuf[4] = '\0';
				    sTime.wYear = atoi(strbuf);
				    memcpy(strbuf, &p_buf[10], 2);
				    strbuf[2] = '\0';
			    	sTime.wMonth = atoi(strbuf);
				    memcpy(strbuf, &p_buf[8], 2);
				    strbuf[2] = '\0';
				    sTime.wDay = atoi(strbuf);
				    memcpy(strbuf, &p_buf[2], 2);
				    strbuf[2] = '\0';
				    sTime.wHour = atoi(strbuf);
				    memcpy(strbuf, &p_buf[4], 2);
				    strbuf[2] = '\0';
				    sTime.wMinute = atoi(strbuf);
				    memcpy(strbuf, &p_buf[6], 2);
				    strbuf[2] = '\0';
				    sTime.wSecond = atoi(strbuf);
				    sTime.wMilliseconds = 0;
				    SystemTimeToFileTime( &sTime, &filtim );
				    LocalFileTimeToFileTime( &filtim, &filtim );
				    // get local cpu's file time
				    GetSystemTimeAsFileTime( &locfiltim );
			     	// get time difference
				    if (CompareFileTime(&filtim,  &locfiltim ) > 0) {
					     timdelta = (UINT)((((ULARGE_INTEGER *)&filtim)->QuadPart - 
						  ((ULARGE_INTEGER *)&locfiltim)->QuadPart) / 10000000);
					}
			     	else {
					     timdelta = (UINT)((((ULARGE_INTEGER *)&locfiltim)->QuadPart - 
					    	((ULARGE_INTEGER *)&filtim)->QuadPart) / 10000000);
					}
			    	// correct local time if inside setting range
				    if (timdelta >= TIME_DRIFT && timdelta < TIME_LIMIT) {
				    	FileTimeToSystemTime( &filtim, &locTime );
					    SetOnlSysTime( &locTime );
					}
				}
				if (p_buf[17] == 'F' &&
					p_buf[28] == 'B') {	// get date & time message
					memcpy(strbuf, &p_buf[24], 4);
					strbuf[4] = '\0';
					value = atoi(strbuf);
					UpdRtuIntData(sendInfo->pRtu, 0, 0, value, 1);
				}
				// clear polling flag for next polling
				ClrRtuPollSts(sendInfo->pRtu);
				ClrPioRtuStream(ioStream);
				return TRUE;
			}
	    	SetPioRecvStatus(pPio, PIO__BYTECNT_MISMATCH);
		    break;

		 case TIMESFSTYPE: 
			if (GetPioReadMsgCnt(pPio) == SFMSGBUFLEN){
				if(p_buf[0] == 0x00 && p_buf[1] == 0xff 
					&& p_buf[2] == 0x81) {
				    sTime.wYear   = p_buf[3] + 2000;
			    	sTime.wMonth  = p_buf[4];
				    sTime.wDay    = p_buf[5];
				    sTime.wHour   = p_buf[6];
				    sTime.wMinute = p_buf[7];
				    sTime.wSecond = p_buf[8];
				    sTime.wMilliseconds = 0;
				    SystemTimeToFileTime( &sTime, &filtim );
				    LocalFileTimeToFileTime( &filtim, &filtim );
				    // get local cpu's file time
				    GetSystemTimeAsFileTime( &locfiltim );
			     	// get time difference
                    if (CompareFileTime(&filtim,  &locfiltim ) > 0) {
					     timdelta = (UINT)((((ULARGE_INTEGER *)&filtim)->QuadPart - 
						  ((ULARGE_INTEGER *)&locfiltim)->QuadPart) / 10000000);
					}
			     	else {
					     timdelta = (UINT)((((ULARGE_INTEGER *)&locfiltim)->QuadPart - 
					    	((ULARGE_INTEGER *)&filtim)->QuadPart) / 10000000);
					}
			    	// correct local time if inside setting range
				    if (timdelta >= TIME_DRIFT && timdelta < TIME_LIMIT) {
				    	FileTimeToSystemTime( &filtim, &locTime );
					    SetOnlSysTime( &locTime );
					}
				}
				// clear polling flag for next polling
				ClrRtuPollSts(sendInfo->pRtu);
				ClrPioRtuStream(ioStream);
				return TRUE;

			}
		    SetPioRecvStatus(pPio, PIO__BYTECNT_MISMATCH);           
		    default:
			   break;
		}
	}

	// clear polling flag for next polling
	ClrRtuPollSts(sendInfo->pRtu);
	ClrPioRtuStream(ioStream);
	SetPioComState(pPio, TRUE);
	return FALSE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -