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

📄 pcsccom.cpp

📁 主要是配合avr单片机的一个测试程序,里面有串口通讯,和listiew潜入控件
💻 CPP
字号:
//pcsccom.cpp

#include "stdafx.h"
#include "pcsccom.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <direct.h>
#include <windows.h>

#pragma data_seg ("PortData")
PCSCCOM_STRUCT g_STUPortArray[256];
#pragma data_seg ("PortData")

DCB dcb;
UINT nPortNum =0;
UINT nTimeOut =1;
UINT nCycNum =50;

void GetExePath(CString &strExePath)
{
	CString strPath(_T(""));
	GetModuleFileName(NULL,strPath.GetBuffer(MAX_PATH+1),MAX_PATH);
	strPath.ReleaseBuffer();
	strExePath = strPath.Left(strPath.ReverseFind('\\')+1 );
}
void LoadDCBFromIni( void )
{
	//GetDLLPath(strDLLPath);
	CString strExePath=_T("");
	GetExePath(strExePath);
	strExePath +=_T("DCB.ini");


	nPortNum = GetPrivateProfileInt(_T("Port"),_T("PortNum"),0,strExePath);
	dcb.BaudRate = GetPrivateProfileInt(_T("BaudRate"),_T("BaudRate"),9600,strExePath);
	dcb.Parity =(BYTE)GetPrivateProfileInt(_T("Parity"),_T("Parity"),0,strExePath);
	dcb.ByteSize = (BYTE)GetPrivateProfileInt(_T("ByteSize"),_T("ByteSize"),8,strExePath);
	dcb.StopBits = (BYTE)GetPrivateProfileInt(_T("StopBits"),_T("StopBits"),ONESTOPBIT,strExePath);
	nTimeOut = GetPrivateProfileInt(_T("TimeOut"),_T("nTimeOut"),1,strExePath);
	nCycNum = GetPrivateProfileInt(_T("CycleNum"),_T("nCycNum"),50,strExePath);
	
}

BOOL bOpenPort(void)
{	
	BOOL bRtn(FALSE);
	CFileException ex;
	CHAR szPortName[32];
	TCHAR szError[1024];
	//int Result;
    LoadDCBFromIni( );

	if(g_STUPortArray[nPortNum].bOpen != FALSE)
		return FALSE;

	sprintf(szPortName,"\\\\.\\COM%d",nPortNum+1);	
	g_STUPortArray[nPortNum].hPortFile = CreateFile(szPortName, GENERIC_READ | GENERIC_WRITE, 0, NULL,
		OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL); // 
	if(g_STUPortArray[nPortNum].hPortFile == INVALID_HANDLE_VALUE){
		FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,0,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),szError,1024,NULL);
		return FALSE;
	}
	
	//set comm property
	//DCB dcb;
	bRtn = GetCommState(g_STUPortArray[nPortNum].hPortFile,&dcb);
	if(! bRtn){
		FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,0,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),szError,1024,NULL);
		return bRtn;
	}
	LoadDCBFromIni( ); //Ini DCB

	//dcb.BaudRate = CBR_19200;
	//dcb.wReserved = 0;
	//dcb.fParity = TRUE;
	//dcb.Parity = NOPARITY;
	//dcb.ByteSize = 8;
	//dcb.StopBits = ONESTOPBIT;
	//dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
	//dcb.fRtsControl = RTS_CONTROL_TOGGLE;
	//dcb.fRtsControl = RTS_CONTROL_ENABLE;
	//dcb.fDtrControl = DTR_CONTROL_DISABLE;
	//dcb.fDtrControl = RTS_CONTROL_ENABLE;
	//dcb.fAbortOnError = FALSE;
	bRtn = SetCommState(g_STUPortArray[nPortNum].hPortFile,&dcb);
	if(! bRtn){
		FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,0,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),szError,1024,NULL);
		
		return bRtn;
	}	

	// set event mask
	bRtn = SetCommMask(g_STUPortArray[nPortNum].hPortFile,EV_RXCHAR|EV_TXEMPTY|EV_RXFLAG);
	if(! bRtn){
		
		return bRtn;
	}
	//set size of input/output buffer
	SetupComm( g_STUPortArray[nPortNum].hPortFile, 1024,1024) ; 
	//clear up input/output buffer
	PurgeComm( g_STUPortArray[nPortNum].hPortFile, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ); 

	//set comm timeout
	COMMTIMEOUTS CommTimeout;
	bRtn = GetCommTimeouts(g_STUPortArray[nPortNum].hPortFile,&CommTimeout);
	if(! bRtn){
		FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,0,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),szError,1024,NULL);
		sprintf(szError,"%s%s","Failed to get timeout configuration of current port:",szError);
		
		return bRtn;
	}
	CommTimeout.ReadIntervalTimeout =1;
	CommTimeout.ReadTotalTimeoutConstant = 0;
	CommTimeout.ReadTotalTimeoutMultiplier = 0;
	CommTimeout.WriteTotalTimeoutConstant = 0;
	CommTimeout.WriteTotalTimeoutMultiplier = 0;
	bRtn = SetCommTimeouts(g_STUPortArray[nPortNum].hPortFile,&CommTimeout);
	if(! bRtn){
		FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,0,GetLastError(),MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),szError,1024,NULL);
		sprintf(szError,"%s%s","Failed to configure timeout of current port:",szError);
		
		return bRtn;
	}/**/

	// init ProcessCompletionEvent
	g_STUPortArray[nPortNum].ReceiveEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
	g_STUPortArray[nPortNum].ROverlapped.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );

	g_STUPortArray[nPortNum].hCardChangedMutex = CreateMutex( NULL, FALSE, NULL );
	
	// reset reader
	EscapeCommFunction( g_STUPortArray[nPortNum].hPortFile, SETDTR );
	EscapeCommFunction( g_STUPortArray[nPortNum].hPortFile, SETRTS );

	Sleep( 100 );

	//init other variable
	g_STUPortArray[nPortNum].bOpen = TRUE;
	g_STUPortArray[nPortNum].fReadReady = FALSE;
	g_STUPortArray[nPortNum].fAPDUHead = FALSE;
	g_STUPortArray[nPortNum].fConnect  = FALSE;
	g_STUPortArray[nPortNum].nTryConnect = 0;

	return TRUE;
}

void  ClosePort(void)
{
	if(INVALID_HANDLE_VALUE == g_STUPortArray[nPortNum].hPortFile)
		return ;
	if(FALSE == g_STUPortArray[nPortNum].bOpen)
		return ;

	g_STUPortArray[nPortNum].nTryConnect = 0;
	CloseHandle( g_STUPortArray[nPortNum].ReceiveEvent );
	CloseHandle(g_STUPortArray[nPortNum].ROverlapped.hEvent);
	CloseHandle(g_STUPortArray[nPortNum].hCardChangedMutex);
	PurgeComm(g_STUPortArray[nPortNum].hPortFile, PURGE_TXABORT | PURGE_RXABORT);	
	CloseHandle( g_STUPortArray[nPortNum].hPortFile );
	g_STUPortArray[nPortNum].bOpen = FALSE;
}

///////assisant function
BYTE   cSumParityByte(BYTE *pInData, UINT nInDataLen)
{
	BYTE ch(0);
	UINT i;
	for(i=0;i<nInDataLen;i++)
		ch = ch^pInData[i];
	return ch;
}

BOOL   bCheckParityByte(BYTE *pInData, UINT nInDataLen, BYTE cCheckParityByte)
{
	if( cSumParityByte(pInData,nInDataLen) != cCheckParityByte)
		return FALSE;
	return TRUE;
}

BOOL   nPackHexToByte(BYTE *pInData, UINT nInDataLen, BYTE *pOutData, UINT *nOutDataLen)
{
	UINT i;
	BYTE ch1,ch2;
	if(nInDataLen%2) 
		return FALSE;
	for(i=0;i<nInDataLen/2;i++){
		//if((pInData[2*i] > '9') && (pInData[2*i] < '0'))
			ch1 = (BYTE)toupper(pInData[2*i]);
		//if((pInData[2*i+1] > '9') && (pInData[2*i+1] < '0'))
			ch2 = (BYTE)toupper(pInData[2*i+1]);
		if((ch1 >= 'A') && (ch1 <= 'F'))
			ch1 = ch1 - 'A' + 10;
		else
			ch1 = ch1 - '0';
		////
		if((ch2 >= 'A') && (ch2 <= 'F'))
			ch2 = ch2 - 'A' + 10;
		else
			ch2 = ch2 - '0';
		pOutData[i] = 16 * ch1 + ch2;
		*nOutDataLen = nInDataLen/2;
	}
	return TRUE;
}



DWORD  PortThreadProc( void)
{
	DWORD CommEvent;
	
	DWORD NOBTransfered;
	char Buffer[ 560 ];

	//UINT nPortNum;
	BOOL fReadStatus(FALSE);
	CHAR *pStartCode,*pStopCode;

	DWORD dwErrorFlags;
	UINT nTryNUm=0;

	COMSTAT ComStat;
	DWORD dwLength;
	//nPortNum = atoi((char*)lpParam);
    g_STUPortArray[nPortNum].LastReceivedLength = 0;
	memset(g_STUPortArray[nPortNum].LastReceivedBuffer, 0, RECEIVE_BUFFER_SIZE);
	while ( 1 ){
		WaitForSingleObject( g_STUPortArray[nPortNum].ReceiveEvent, nTimeOut);
		nTryNUm++;
		if(nTryNUm > nCycNum)
			break;
		ResetEvent( g_STUPortArray[nPortNum].ROverlapped.hEvent );
		//BOOL b = 
			WaitCommEvent( g_STUPortArray[nPortNum].hPortFile, &CommEvent, &(g_STUPortArray[nPortNum].ROverlapped) );

		if (CommEvent & EV_RXCHAR){
			ClearCommError(g_STUPortArray[nPortNum].hPortFile, &dwErrorFlags, &ComStat ) ;
			dwLength = ComStat.cbInQue ; //how many data in input buffer
			
			if(dwLength > 0){
				pStartCode = pStopCode = NULL;
				NOBTransfered = 0;
				fReadStatus = ReadFile( g_STUPortArray[nPortNum].hPortFile, Buffer, dwLength, &NOBTransfered, &(g_STUPortArray[nPortNum].ROverlapped) );
				if(! fReadStatus){
					if(GetLastError() == ERROR_IO_PENDING){
						while(! GetOverlappedResult( g_STUPortArray[nPortNum].hPortFile, &(g_STUPortArray[nPortNum].ROverlapped), &NOBTransfered, FALSE )){
							if(GetLastError() != ERROR_IO_PENDING)
								break;							
						}					
					}					
				}
				if ( NOBTransfered > 0){//succeed in reading data from port
					memcpy(g_STUPortArray[nPortNum].LastReceivedBuffer+g_STUPortArray[nPortNum].LastReceivedLength, Buffer, NOBTransfered);
					g_STUPortArray[nPortNum].LastReceivedLength += NOBTransfered;//handle reading data					
					g_STUPortArray[nPortNum].fReadReady = TRUE;
					SetEvent( g_STUPortArray[nPortNum].ReceiveEvent );
					return 0;
				}
			}
		}		
	} 
	return 0;
}
//////////////////////////////////////
//incoming
BOOL  bReadData( BYTE *pReadBuf, UINT *nReadDataLen)
{
	g_STUPortArray[nPortNum].fReadReady = FALSE;
	PortThreadProc();//read data from com port
	
	if(g_STUPortArray[nPortNum].LastReceivedLength > 0){
		*nReadDataLen = g_STUPortArray[nPortNum].LastReceivedLength;

		memcpy(pReadBuf,g_STUPortArray[nPortNum].LastReceivedBuffer,*nReadDataLen);
#ifdef WRITELOG
		FILE *fp;
		CHAR LogFile[32];	
		g_STUPortArray[nPortNum].LastReceivedBuffer[*nReadDataLen] = '\0';
		
#endif
	}
	else{	
		return FALSE;
	}
	return TRUE;
}
//////////////////////////////////////////
//outgoing
BOOL  bWriteData(char *pWriteBuf, UINT nWriteDataLen)
{
	BOOL fState;	
	//COMSTAT ComStat;
	//DWORD dwErrorFlags;
 
	DWORD length;
	CHAR szBuffer[560];

	//clear up input buffer
	g_STUPortArray[nPortNum].fReadReady = FALSE;
	g_STUPortArray[nPortNum].LastReceivedLength = 0;
	memset(g_STUPortArray[nPortNum].LastReceivedBuffer,0,560);
	ResetEvent( g_STUPortArray[nPortNum].ReceiveEvent );

	length = nWriteDataLen;
	memcpy(szBuffer,pWriteBuf,nWriteDataLen);
	//ClearCommError(g_STUPortArray[nPortNum].hPortFile,&dwErrorFlags,&ComStat);
	fState=WriteFile(g_STUPortArray[nPortNum].hPortFile,szBuffer,length,&length,&(g_STUPortArray[nPortNum].WOverlapped));
/*
	if(!fState){
		if(GetLastError()==ERROR_IO_PENDING){
			while(! GetOverlappedResult(g_STUPortArray[nPortNum].hPortFile,&(g_STUPortArray[nPortNum].WOverlapped),&length,TRUE)){
				if(GetLastError() != ERROR_IO_PENDING)
					break;
			}
		}
	}
*/
	return TRUE;
}

⌨️ 快捷键说明

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