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

📄 pserialport.cpp

📁 关于CE下 串口通讯的方法代码 关于CE下 串口通讯的方法代码
💻 CPP
字号:
// PSerialPort.cpp: implementation of the CPSerialPort class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SerialPort.h"
#include "PSerialPort.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CPSerialPort::CPSerialPort()
{
	m_hComm=INVALID_HANDLE_VALUE;
	m_hReadThread=NULL;
	m_bReceiving=FALSE;
	m_nBufferSize=256; //缓冲大小
}

CPSerialPort::~CPSerialPort()
{
	ClosePort();
}

DWORD WINAPI CPSerialPort::ReadPortThread(LPVOID lpParameter)
{
	CPSerialPort* m_pSerial;

	m_pSerial=(CPSerialPort*)lpParameter;

	BOOL fReadState;
	DWORD dwLength;
	
	char* buf=new char[m_pSerial->m_nBufferSize];

	while((m_pSerial->m_hComm!=INVALID_HANDLE_VALUE)&&(m_pSerial->m_bReceiving))
	{		
		fReadState=ReadFile(m_pSerial->m_hComm,buf,m_pSerial->m_nBufferSize,&dwLength,NULL);
		if(!fReadState)
		{
			//AfxMessageBox(_T("无法从串口读取数据!"));
		}
		else
		{
			if(dwLength!=0)
			{
				//回送数据
				if(m_pSerial->m_lpDataArriveProc!=NULL)
				{
					m_pSerial->m_lpDataArriveProc(buf,dwLength,m_pSerial->m_dwUserData);
					AfxMessageBox(_T("OK"));
				}
			}
		}		
	}

	delete[] buf;

	return 0;
}

BOOL CPSerialPort::OpenPort(LPCTSTR Port,int BaudRate,int DataBits,int StopBits,int Parity,LPDataArriveProc proc,DWORD userdata)
{
	m_lpDataArriveProc=proc;
	m_dwUserData=userdata;

	if(m_hComm==INVALID_HANDLE_VALUE)
	{
		m_hComm=CreateFile(Port,GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXISTING,0,0);
		if(m_hComm==INVALID_HANDLE_VALUE )
		{
			AfxMessageBox(_T("无法打开端口!请检查是否已被占用。"));
			return FALSE;
		}
		GetCommState(m_hComm,&dcb);
		dcb.BaudRate=BaudRate;
		dcb.ByteSize=DataBits;
		dcb.Parity=Parity;
		dcb.StopBits=StopBits;
		dcb.fParity=FALSE;
		dcb.fBinary=TRUE;
		dcb.fDtrControl=0;
		dcb.fRtsControl=0;
		dcb.fOutX=dcb.fInX=dcb.fTXContinueOnXoff=0;
		
		//设置状态参数
		SetCommMask(m_hComm,EV_RXCHAR);		
		SetupComm(m_hComm,16384,16384);		
		if(!SetCommState(m_hComm,&dcb))
		{
			AfxMessageBox(_T("无法按当前参数配置端口,请检查参数!"));
			PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
			ClosePort();
			return FALSE;
		}
		
		//设置超时参数
		GetCommTimeouts(m_hComm,&CommTimeOuts);		
		CommTimeOuts.ReadIntervalTimeout=100;
		CommTimeOuts.ReadTotalTimeoutMultiplier=1;
		CommTimeOuts.ReadTotalTimeoutConstant=100;
		CommTimeOuts.WriteTotalTimeoutMultiplier=0;
		CommTimeOuts.WriteTotalTimeoutConstant=0;		
		if(!SetCommTimeouts(m_hComm,&CommTimeOuts))
		{
			AfxMessageBox(_T("无法设置超时参数!"));
			PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
			ClosePort();
			return FALSE;
		}
		
		PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);		
		return TRUE;		
	}
	
	return FALSE;
}

BOOL CPSerialPort::ClosePort()
{
	Deactivate();
	if(m_hComm!=INVALID_HANDLE_VALUE)
	{
		SetCommMask(m_hComm,0);		
		PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
		CloseHandle(m_hComm);
		m_hComm=INVALID_HANDLE_VALUE;
		return TRUE;
	}
	
	return TRUE;	
}

BOOL CPSerialPort::Activate()
{
	if(m_hComm==INVALID_HANDLE_VALUE)
	{
		return FALSE;
	}

	if(!m_bReceiving)
	{
		//开始接收线程
		PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
		m_bReceiving=TRUE;
		m_hReadThread=CreateThread(NULL,0,ReadPortThread,this,0,NULL);
	}
	if(m_hReadThread!=NULL)
	{		
		return TRUE;
	}
	else
	{
		m_bReceiving=FALSE;
		return FALSE;
	}

	return FALSE;
}

BOOL CPSerialPort::Deactivate()
{
	if(m_hComm==INVALID_HANDLE_VALUE)
	{
		return FALSE;
	}

	//停止接收线程
	if(m_bReceiving)
	{
		m_bReceiving=FALSE;
		WaitForSingleObject(m_hReadThread,500);
		CloseHandle(m_hReadThread);
		m_hReadThread=NULL;
		return TRUE;
	}

	return FALSE;
}

BOOL CPSerialPort::IsActive()
{
	return m_bReceiving;
}

DWORD CPSerialPort::WritePort(char *data,int length)
{
	if(m_hComm==INVALID_HANDLE_VALUE)
	{
		return 0;
	}

	BOOL fWriteState;
	DWORD dwBytesWritten=0;

	fWriteState=WriteFile(m_hComm,data,length*sizeof(char),&dwBytesWritten,NULL);
	
	return dwBytesWritten;
}

DWORD CPSerialPort::ReadPort(char *data,int length)
{
	BOOL fReadState;
	DWORD dwLength,dwBytesRead;
	int TimeOutCount;

	dwBytesRead=0;
	TimeOutCount=0;
	
	while(m_hComm!=INVALID_HANDLE_VALUE)
	{
		char* buf=new char[length];
		fReadState=ReadFile(m_hComm,data,length,&dwLength,NULL);
		if(!fReadState)
		{
			break;
		}
		else
		{
			dwBytesRead+=dwLength;
			data+=dwLength;			
		}
		if(dwBytesRead==(DWORD)length)
		{
			break;
		}
		if(dwLength!=0)
		{
			TimeOutCount=0;
		}
		else
		{
			TimeOutCount++;
			Sleep(5);
		}
		if(TimeOutCount==5)
		{
			break;
		}
	}
	return dwBytesRead;
}

DWORD CPSerialPort::WriteFileToPort(LPCTSTR FileName)
{
	if(m_hComm==INVALID_HANDLE_VALUE)
	{
		return 0;
	}

	CFile cf;

	BOOL fWriteState;
	DWORD dwBytesWritten;
	DWORD dwCharToWrite;

	dwCharToWrite=0;

	if(!cf.Open(FileName,CFile::modeRead))
	{
		//AfxMessageBox(_T("无法打开Hex文件!"));
		return 0;
	}
	dwCharToWrite=(DWORD)cf.GetLength();
	cf.Seek(0,CFile::begin);
	dwBytesWritten=0;
	
	if(m_hComm!=INVALID_HANDLE_VALUE&&dwCharToWrite!=0)
	{
		char* buf=new char[dwCharToWrite];
		cf.Read(buf,dwCharToWrite);

		fWriteState=WriteFile(m_hComm,buf,dwCharToWrite*sizeof(char),&dwBytesWritten,NULL);
		if(!fWriteState)
		{
			//AfxMessageBox(_T("无法向端口写入数据!"));
		}
		delete[] buf;		
	}
	cf.Close();
	return dwBytesWritten;
}
/*
*********************************************************************************************************
* 函数名  : unsigned short CalculateCRC(unsigned char *data,unsigned short len,unsigned short initcrc)                                       
*
* 功能描述: Calculate CRC
*
* 入口参数: unsigned char  *data	--	data to be Calculate
*	    unsigned short  len	--	number of byte to be Calculate
*	    unsigned short  initcrc--initialize of crc
* 返回    : CRC
*
* 版本说明: V1.0
*
* 备注    :
*
*********************************************************************************************************
*/

unsigned short CPSerialPort::CalculateCRC(unsigned char *data,unsigned int len,unsigned short initcrc)
{
	unsigned short crc;
	unsigned char comb ,i;
	static  unsigned short my[256]={
		0X0000,0X1021,0X2042,0X3063,0X4084,0X50A5,0X60C6,0X70E7,
		0X8108,0X9129,0XA14A,0XB16B,0XC18C,0XD1AD,0XE1CE,0XF1EF,
		0X1231,0X0210,0X3273,0X2252,0X52B5,0X4294,0X72F7,0X62D6,
		0X9339,0X8318,0XB37B,0XA35A,0XD3BD,0XC39C,0XF3FF,0XE3DE,
		0X2462,0X3443,0X0420,0X1401,0X64E6,0X74C7,0X44A4,0X5485,
		0XA56A,0XB54B,0X8528,0X9509,0XE5EE,0XF5CF,0XC5AC,0XD58D,
		0X3653,0X2672,0X1611,0X0630,0X76D7,0X66F6,0X5695,0X46B4,
		0XB75B,0XA77A,0X9719,0X8738,0XF7DF,0XE7FE,0XD79D,0XC7BC,
		0X48C4,0X58E5,0X6886,0X78A7,0X0840,0X1861,0X2802,0X3823,
		0XC9CC,0XD9ED,0XE98E,0XF9AF,0X8948,0X9969,0XA90A,0XB92B,
		0X5AF5,0X4AD4,0X7AB7,0X6A96,0X1A71,0X0A50,0X3A33,0X2A12,
		0XDBFD,0XCBDC,0XFBBF,0XEB9E,0X9B79,0X8B58,0XBB3B,0XAB1A,
		0X6CA6,0X7C87,0X4CE4,0X5CC5,0X2C22,0X3C03,0X0C60,0X1C41,
		0XEDAE,0XFD8F,0XCDEC,0XDDCD,0XAD2A,0XBD0B,0X8D68,0X9D49,
		0X7E97,0X6EB6,0X5ED5,0X4EF4,0X3E13,0X2E32,0X1E51,0X0E70,
		0XFF9F,0XEFBE,0XDFDD,0XCFFC,0XBF1B,0XAF3A,0X9F59,0X8F78,
		0X9188,0X81A9,0XB1CA,0XA1EB,0XD10C,0XC12D,0XF14E,0XE16F,
		0X1080,0X00A1,0X30C2,0X20E3,0X5004,0X4025,0X7046,0X6067,
		0X83B9,0X9398,0XA3FB,0XB3DA,0XC33D,0XD31C,0XE37F,0XF35E,
		0X02B1,0X1290,0X22F3,0X32D2,0X4235,0X5214,0X6277,0X7256,
		0XB5EA,0XA5CB,0X95A8,0X8589,0XF56E,0XE54F,0XD52C,0XC50D,
		0X34E2,0X24C3,0X14A0,0X0481,0X7466,0X6447,0X5424,0X4405,
		0XA7DB,0XB7FA,0X8799,0X97B8,0XE75F,0XF77E,0XC71D,0XD73C,
		0X26D3,0X36F2,0X0691,0X16B0,0X6657,0X7676,0X4615,0X5634,
		0XD94C,0XC96D,0XF90E,0XE92F,0X99C8,0X89E9,0XB98A,0XA9AB,
		0X5844,0X4865,0X7806,0X6827,0X18C0,0X08E1,0X3882,0X28A3,
		0XCB7D,0XDB5C,0XEB3F,0XFB1E,0X8BF9,0X9BD8,0XABBB,0XBB9A,
		0X4A75,0X5A54,0X6A37,0X7A16,0X0AF1,0X1AD0,0X2AB3,0X3A92,
		0XFD2E,0XED0F,0XDD6C,0XCD4D,0XBDAA,0XAD8B,0X9DE8,0X8DC9,
		0X7C26,0X6C07,0X5C64,0X4C45,0X3CA2,0X2C83,0X1CE0,0X0CC1,
		0XEF1F,0XFF3E,0XCF5D,0XDF7C,0XAF9B,0XBFBA,0X8FD9,0X9FF8,
		0X6E17,0X7E36,0X4E55,0X5E74,0X2E93,0X3EB2,0X0ED1,0X1EF0
	};
	crc = initcrc ;
	
	for (i=0; i<len; i++)
	{
		comb=(crc>>8) ^ *data;
		crc= (crc<<8) ^ my[comb];
		data = data + 1 ;
	}
	return crc ;
}


int CPSerialPort::LoginCom(BOOL flag,unsigned char* ID/*=NULL*/,unsigned char* pow/*=NULL*/)
{
    char buf[]= {0x55,0x55,0x55,0x55,
		0x03,
		0x00,0x01,0x01,0x21,0x00,0x00,
        0x00,0x00,0x00,0x00,
		0x00,
		0x00,0x00,0x00,0x00,0x00,0x00,
		0x00,0x00,0x00,0x00,0x00,0x00,
		0x00,0x00,0x00,0x00,0x00,0x00,
		0x00,0x00,0x00,0x00,0x00,0x00,
        0x00,0x00,
		0xFF,0xFF,0xFF,0xFF};
    int buflen = sizeof(buf);
    unsigned short crc = 0;

    if(flag == TRUE)
    {
        buf[6]= 0x01;

    }
    else
    {
        buf[6] = 0x02;
    }

    if(pow!=NULL)
    {
        buf[15]=atoi((const char*)pow);
        buf[6] = 0x04; 
    }

    crc = CalculateCRC((unsigned char*)&buf[4],buflen-10,0);
    buf[buflen-6]= ((crc>>8)&0xFF);
    buf[buflen-5]= (crc&0xFF);
   // m_ComPort.Output(buf,buflen);
	if(WritePort(buf,buflen))
    {
		CString strshow;
	///	HexToString(buf,buflen,strshow);
        if(flag == TRUE)
		    strshow = "正在登录操作";// + strshow;
        else
            strshow = "取消登录操作";// + strshow;
	//	::SendMessage(m_parentHWND,WM_SHOW_TEXT,(WPARAM)strshow.GetBuffer(0),0);
	}
	return 0;
}

//return value:1读取成功,0读取不完全,-1读取异常 
int CPSerialPort::ReadCom(BOOL flag)
{
    char buf[]= {0x55,0x55,0x55,0x55,
	        	 0x03,0x01,0x01,0x01,
	        	 0x21,0x00,0x00,0x00,
                 0x00,0x00,0x00,0x00,
				 0x00,0x00,0x00,0x00,
				 0x00,0x00,0x00,0x00,
				 0x00,0x00,0x00,0x00,
				 0x00,0x00,0x00,0x00,
				 0x00,0x00,0x00,0x00,
				 0x00,0x00,0x00,0x00,
				 0x00,0x00,
	        	0xFF,0xFF,0xFF,0xFF};
    int buflen = sizeof(buf);
    unsigned short crc = 0;

    if(flag == TRUE)
    {
        buf[6]= 0x01;
    }
    else
    {
        buf[6] = 0x02;
    }

    crc = CalculateCRC((unsigned char*)&buf[4],buflen-10,0);
    buf[buflen-6]= ((crc>>8)&0xFF);
    buf[buflen-5]= (crc&0xFF);
    if(WritePort(buf,buflen))
    {
		CString strshow;
	//	HexToString(buf,buflen,strshow);
        if(flag == TRUE)
		    strshow = "正在读操作";//+ strshow;
        else
            strshow = "取消读操作";//+ strshow;
	//::SendMessage(m_parentHWND,WM_SHOW_TEXT,(WPARAM)strshow.GetBuffer(0),0);
	}



    char temtest[] = {0x02,0x00,0x01,0x01,0x07,0x11,0x11,0x11,0x11,0x11};
    int testcrc = CalculateCRC((unsigned char*)&temtest[0],sizeof(temtest),0);
	return 0;
}

⌨️ 快捷键说明

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