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

📄 comm.cpp

📁 磁卡读写测试程序
💻 CPP
字号:
#include "stdafx.h"
#include "comm.h"

LPCOMMINFO BuildComm(
	LPCOMMINFO info,
    long DCBlength,				     // sizeof(DCB) .
    long BaudRate,					// current baud rate .
    BOOL fBinary,							// binary mode, no EOF check 
    BOOL fParity,							// enable parity checking 
    int fOutxCtsFlow,						// CTS output flow control 
    int fOutxDsrFlow,						// DSR output flow control 
    int fDtrControl,		// DTR flow control type 
    int fOutX,								// XON/XOFF out flow control 
    int fInX,								// XON/XOFF in flow control 
    int fRtsControl,		// RTS flow control 
    int fAbortOnError,						// abort reads/writes on error 
    int XonLim,							// transmit XON threshold 
    int XoffLim,							// transmit XOFF threshold 
    int ByteSize,							// number of bits/byte, 4-8 .
    int Parity,						// 0-4=no,odd,even,mark,space .
    int StopBits					// 0,1,2 = 1, 1.5, 2 
	)
	{
		return info;	
	}

BOOL  InitComm( LPCOMMINFO m_info, const char* strCom)
{
	if ( strcmp(strCom,"com1") != 0 )
		if ( strcmp(strCom ,"Com2" ) != 0)
			return FALSE;

	DCB m_initDCB;
	memset(&m_initDCB,0,sizeof(DCB));
	m_initDCB.DCBlength=sizeof(DCB);				// sizeof(DCB) .
    m_initDCB.BaudRate=CBR_9600;					// current baud rate .
    m_initDCB.fBinary=1;							// binary mode, no EOF check 
    m_initDCB.fParity=1;							// enable parity checking 
    m_initDCB.fOutxCtsFlow=0;						// CTS output flow control 
    m_initDCB.fOutxDsrFlow=0;						// DSR output flow control 
    m_initDCB.fDtrControl=DTR_CONTROL_ENABLE;		// DTR flow control type 
    m_initDCB.fOutX=1;								// XON/XOFF out flow control 
    m_initDCB.fInX=1;								// XON/XOFF in flow control 
    m_initDCB.fRtsControl=RTS_CONTROL_ENABLE;		// RTS flow control 
    m_initDCB.fAbortOnError=1;						// abort reads/writes on error 
    m_initDCB.XonLim=100;							// transmit XON threshold 
    m_initDCB.XoffLim=100;							// transmit XOFF threshold 
    m_initDCB.ByteSize=8;							// number of bits/byte, 4-8 .
    m_initDCB.Parity=NOPARITY;						// 0-4=no,odd,even,mark,space .
    m_initDCB.StopBits=ONESTOPBIT;					// 0,1,2 = 1, 1.5, 2 


	//创建COM文件
	m_info->hComm=CreateFile(strCom,
							GENERIC_READ | GENERIC_WRITE,
							0,
							NULL,
							OPEN_EXISTING,
							FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
							NULL);

	if (m_info->hComm==INVALID_HANDLE_VALUE)
	{
		return FALSE;
	}

	//设定掩码
	BOOL bRet=SetCommMask(m_info->hComm, EV_RXCHAR|EV_BREAK|EV_CTS|EV_DSR|EV_ERR|EV_RING|EV_RLSD|EV_RXFLAG|EV_TXEMPTY);
					//|EV_BREAK|EV_CTS|EV_DSR|EV_ERR|EV_RING|EV_RLSD|EV_RXFLAG|EV_TXEMPTY);
	if (!bRet)
	{
		CloseHandle(m_info->hComm);
		return FALSE;
	}

	//设定输入流缓存和输出流缓存长度
	bRet=SetupComm(m_info->hComm, BUFFLEN, BUFFLEN);
	if (!bRet)
	{
		CloseHandle(m_info->hComm);
		return FALSE;
	}

	//清空输入流缓存和输出流缓存
	bRet=PurgeComm(m_info->hComm, PURGE_TXABORT 
								| PURGE_RXABORT 
								| PURGE_TXCLEAR 
								| PURGE_RXCLEAR);

	if (!bRet)
	{
		CloseHandle(m_info->hComm);
		return FALSE;
	}

	//设定读写超时结构
	m_info->cto.ReadIntervalTimeout = 6000;//6000;//0xFFFFFFFF;
	m_info->cto.ReadTotalTimeoutMultiplier = 100;///1;
	m_info->cto.ReadTotalTimeoutConstant = 100;//1;//1000;
	m_info->cto.WriteTotalTimeoutMultiplier = 0;
	m_info->cto.WriteTotalTimeoutConstant = 1;//1;
	bRet=SetCommTimeouts(m_info->hComm, &m_info->cto);
	if (!bRet)
	{
		CloseHandle(m_info->hComm);
		return FALSE;
	}

	m_info->dcb.DCBlength=sizeof(DCB);

	//取COM通讯口状态
	bRet=GetCommState(m_info->hComm, &m_info->dcb);
	if (!bRet)
	{
		CloseHandle(m_info->hComm);
		return FALSE;
	}

	m_info->dcb.BaudRate=m_initDCB.BaudRate;
	m_info->dcb.ByteSize=m_initDCB.ByteSize;
	m_info->dcb.Parity=m_initDCB.Parity;
	m_info->dcb.StopBits=m_initDCB.StopBits;
	m_info->dcb.fOutxDsrFlow=m_initDCB.fOutxDsrFlow;
	m_info->dcb.fDtrControl=m_initDCB.fDtrControl;
	m_info->dcb.fOutxCtsFlow=m_initDCB.fOutxCtsFlow;
	m_info->dcb.fRtsControl=m_initDCB.fRtsControl;
	m_info->dcb.fInX=m_initDCB.fInX;
	m_info->dcb.fOutX=m_initDCB.fOutX;
	m_info->dcb.XonChar=m_initDCB.XonChar;
	m_info->dcb.XoffChar=m_initDCB.XoffChar;
	m_info->dcb.XonLim=m_initDCB.XonLim;
	m_info->dcb.XoffLim=m_initDCB.XoffLim;
	m_info->dcb.fBinary=m_initDCB.fBinary;
	m_info->dcb.fParity=m_initDCB.fParity;

	//设定COM通讯口状态
	bRet=SetCommState(m_info->hComm, &m_info->dcb);
	if (!bRet)
	{
		CloseHandle(m_info->hComm);
		return FALSE;
	}

	//创建事件
	m_info->hEvent=CreateEvent(NULL,    // no security
							TRUE,    // explicit reset req
							FALSE,   // initial event reset
							NULL ) ; // no name
	if (m_info->hEvent == NULL)
	{
		CloseHandle(m_info->hComm);
		return NULL;
	}

	m_info->osWait.hEvent=m_info->hEvent;
	m_info->osWait.Offset=0;
	m_info->osWait.OffsetHigh=0;
	m_info->osRead.hEvent=m_info->hEvent;
	m_info->osRead.Offset=0;
	m_info->osRead.OffsetHigh=0;
	m_info->osWrite.hEvent=m_info->hEvent;
	m_info->osWrite.Offset=0;
	m_info->osWrite.OffsetHigh=0;

	//指定COM通讯口执行扩展功能
	bRet=EscapeCommFunction(m_info->hComm, SETDTR);
	if (!bRet)
	{
		CloseHandle(m_info->hComm);
		return FALSE;
	}
	return TRUE;

}
BOOL  DestroyComm(LPCOMMINFO m_info)
{
	if ( m_info->hComm == 0 || INVALID_HANDLE_VALUE ==m_info->hComm)
		return FALSE;
	BOOL ret =  CloseHandle(m_info->hComm);
	m_info->hComm  = INVALID_HANDLE_VALUE;
	return ret;
}
 DWORD   Read(LPCOMMINFO m_info,BYTE * pBuffer)
{
	DWORD dwlen;
	DWORD dwEventMask;
	DWORD dwpos;
	BYTE vData[MAXBLOCKLEN+1];

	dwlen=0;
	dwpos=0;
	dwEventMask=0;
	//WaitCommEvent(m_info->hComm, &dwEventMask, NULL);
//	if ((dwEventMask & EV_RXCHAR) != EV_RXCHAR)
//		return dwlen;

	do
	{
		dwlen=ReadBlock(m_info,vData, MAXBLOCKLEN);
		if (dwlen>0)
		{
			memcpy(pBuffer+dwpos, vData, dwlen);
			dwpos=dwpos+dwlen;
		}
	}while(dwlen>0);

	return dwpos;
}

//读数据块
//lpData      存放数据的内存块指针
//dxMaxLen    内存块长度
 DWORD  ReadBlock(LPCOMMINFO m_info,void * lpData, DWORD dwMaxLen)
{
	DWORD dwlen;
	COMSTAT ComStat;
	DWORD dwErrorFlags;
	DWORD dwError;
	BOOL bRet;

	//请空错误码标志
	ClearCommError(m_info->hComm, &dwErrorFlags, &ComStat);
	dwlen=min(dwMaxLen, ComStat.cbInQue);

	if (dwlen==0)
		return dwlen;//return 0

	//读COM口
	bRet=ReadFile(m_info->hComm, lpData,
					dwlen, &dwlen, &(m_info->osRead));

	if (bRet)
		return dwlen;

	if (GetLastError()==ERROR_IO_PENDING)
	{
		//取操作结果
		while (!GetOverlappedResult(m_info->hComm, &(m_info->osRead),
									&dwlen, TRUE))
		{
			dwError=GetLastError();
			if (dwError==ERROR_IO_INCOMPLETE)
				continue;
			else
			{
				ClearCommError(m_info->hComm, &dwErrorFlags, &ComStat);
				break;
			}
		}
	}
	else
	{
		dwlen=0;
		ClearCommError(m_info->hComm, &dwErrorFlags, &ComStat);
	}

	return dwlen;
}

//写数据块
//lpData      存放数据的内存块指针
//dxMaxLen    内存块长度
BOOL WriteBlock(LPCOMMINFO m_info,void * lpData, DWORD dwlen)
{
	BOOL bRet;
	DWORD dwWrite;
	DWORD dwError;
	DWORD dwBytesSent=0;
	DWORD dwErrorFlags;
	COMSTAT ComStat;

	//写COM口
	bRet=WriteFile(m_info->hComm, lpData, dwlen, &dwWrite, &(m_info->osWrite));

	if (bRet)
		return TRUE;

	if(GetLastError()==ERROR_IO_PENDING)
	{
		while(!GetOverlappedResult(m_info->hComm, &(m_info->osWrite),
									&dwWrite, TRUE))
		{
			dwError=GetLastError();
			if(dwError==ERROR_IO_INCOMPLETE)
			{
				dwBytesSent+=dwWrite;
				continue;
			}
			else
			{
				ClearCommError(m_info->hComm, &dwErrorFlags, &ComStat);
				break;
			}
		}
		dwBytesSent+=dwWrite;

		if (dwBytesSent!=dwlen)
		{
			return FALSE;
		}
	}
	else
	{
		ClearCommError(m_info->hComm, &dwErrorFlags, &ComStat);
		return FALSE;
	}

	return TRUE;
}

⌨️ 快捷键说明

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