📄 pcsccom.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 + -