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

📄 serialport.cpp

📁 串口通信程序,适用于手机的软件更新
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		return 0;
	}

	DWORD dwLen = 0;
	COMSTAT ComStat;
	DWORD dwErrorFlags;
	
	ClearCommError(m_hCom, &dwErrorFlags, &ComStat);
	dwLen = min(dwLength, ComStat.cbInQue);
	ReadFile(m_hCom, pszBuff, dwLen, &dwLen, &m_osRead);

	return dwLen;
}

/********************************************************************/
/**	功能:	向串口写一个字符										*/
/**	参数:															*/
/**		chOut--要写的字符											*/
/**	返回值:															*/
/**		TRUE--成功													*/
/**		FALSE--失败													*/
/********************************************************************/
BOOL CSerialPort::WriteCom(char chOut)
{
	if(!m_bInitComOk)
	{
		return FALSE;
	}

	BOOL bState;
	DWORD dwLen = 1;
	COMSTAT ComStat;
	DWORD dwErrorFlags;
	char chValue = chOut;
	
	ClearCommError(m_hCom, &dwErrorFlags, &ComStat);
	PurgeComm(m_hCom, PURGE_TXCLEAR);
	bState = WriteFile(m_hCom, &chValue, dwLen, &dwLen, &m_osWrite);
	
	if(!bState)
	{
		if(GetLastError() == ERROR_IO_PENDING)
		{
			GetOverlappedResult(m_hCom, &m_osWrite, &dwLen, TRUE);// 等待
		}
		else
		{
			dwLen = 0;
		}
	}
	
	if(dwLen == 1)
	{
		return TRUE;
	}

	return FALSE;
}

/********************************************************************/
/**	功能:	向串口写一个字											*/
/**	参数:															*/
/**		wOut--要写的字												*/
/**	返回值:															*/
/**		TRUE--成功													*/
/**		FALSE--失败													*/
/********************************************************************/
BOOL CSerialPort::WriteCom(WORD wOut)
{
	if(!m_bInitComOk)
	{
		return FALSE;
	}

	BOOL bState;
	DWORD dwLen = 1;
	COMSTAT ComStat;
	DWORD dwErrorFlags;
	WORD wValue = wOut;
	
	ClearCommError(m_hCom, &dwErrorFlags, &ComStat);
	PurgeComm(m_hCom, PURGE_TXCLEAR);
	bState = WriteFile(m_hCom, &wValue, dwLen, &dwLen, &m_osWrite);
	
	if(!bState)
	{
		if(GetLastError() == ERROR_IO_PENDING)
		{
			GetOverlappedResult(m_hCom, &m_osWrite, &dwLen, TRUE);// 等待
		}
		else
		{
			dwLen = 0;
		}
	}
	
	if(dwLen == 1)
	{
		return TRUE;
	}

	return FALSE;
}

/********************************************************************/
/**	功能:	向串口读取指定长度的字符								*/
/**	参数:															*/
/**		szBuff--要写的字符串										*/
/**		dwLength--要写的字符串的长度								*/
/**	返回值:															*/
/**		DWORD型--实际写的长度										*/
/********************************************************************/
DWORD CSerialPort::WriteCom(char *pszBuff, DWORD dwLength)
{
	if(!m_bInitComOk)
	{
		return 0;
	}

	BOOL bState;
	DWORD dwLen = dwLength;
	COMSTAT ComStat;
	DWORD dwErrorFlags;
	
	if(dwLen == -1)
	{
		dwLen = strlen(pszBuff);
	}

	ClearCommError(m_hCom, &dwErrorFlags, &ComStat);
	PurgeComm(m_hCom, PURGE_TXCLEAR);
	bState = WriteFile(m_hCom, pszBuff, dwLen, &dwLen, &m_osWrite);
	
	if(!bState)
	{
		if(GetLastError() == ERROR_IO_PENDING)
		{
			GetOverlappedResult(m_hCom, &m_osWrite, &dwLen, TRUE);// 等待
		}
		else
		{
			dwLen = 0;
		}
	}
	
	return dwLen;
}

/********************************************************************/
/**	功能:	结束工作者线程,关闭串行口								*/
/**	参数:	无														*/
/**	返回值:	无														*/
/********************************************************************/
void CSerialPort::CloseCom()
{
	StopMonitor();

	if(m_hCom != NULL)
	{
		PurgeComm(m_hCom, PURGE_TXCLEAR);
		PurgeComm(m_hCom, PURGE_RXCLEAR);
		CloseHandle(m_hCom);
		m_hCom = NULL;
	}

	ClearBuff();
}

/********************************************************************/
/**	功能:	配置串行口												*/
/**	参数:	无														*/
/**		TRUE--成功													*/
/**		FALSE--失败													*/
/********************************************************************/
/*BOOL ConfigCom(const int nBaudRate = 115200,
				   const int nByteSize = 8,
				   const int nStopBits = 1,
				   const int nParity = 0
				  )
{
	DCB dcb;
	BOOL bRet = FALSE;
	
	if(!GetCommState(m_hCom, &dcb))
	{
		return FALSE;
	}
	
	dcb.fBinary = TRUE;
	dcb.BaudRate = nBaudRate; // 波特率
	dcb.ByteSize = nByteSize; // 每字节位数
	dcb.fParity = TRUE;
	
	switch(nParity)
	{//校验设置
	case PARITYNONE:
		dcb.Parity = NOPARITY;
		break;
	case PARITYODD:
		dcb.Parity = ODDPARITY;
		break;
	case PARITYEVEN:
		dcb.Parity = EVENPARITY;
		break;
	case PARITYMARK:
		dcb.Parity = MARKPARITY;
		break;
	case PARITYSPACE:
		dcb.Parity = SPACEPARITY;
		break;
	default:
		break;
	}
	
	switch(nStopBits)
	{//停止位
	case STOPBITONE: 
		dcb.StopBits = ONESTOPBIT;
		break;
	case STOPBITONE5: 
		dcb.StopBits = ONE5STOPBITS;
		break;
	case STOPBITTWO: 
		dcb.StopBits = TWOSTOPBITS;
		break;
	default:
		break;
	}

	return SetCommState(m_hCom, &dcb);}*/
BOOL CSerialPort::ConfigCom()
{
	DCB dcb;
	BOOL bRet = FALSE;
	
	if(!GetCommState(m_hCom, &dcb))
	{
		return FALSE;
	}
	//////////////////////////////////////////////////////////////
		//dcb.BaudRate=115200;          
		//dcb.ByteSize;          
		//dcb.DCBlength;         
	dcb.EofChar=0;           
	dcb.ErrorChar=0;         
	dcb.EvtChar=0;           
	dcb.fAbortOnError=0;     
	dcb.fBinary=1;           
	dcb.fDsrSensitivity=0;   
	dcb.fDtrControl=1;       
		//dcb.fDummy2=0;           
	dcb.fErrorChar=0;        
	dcb.fInX=0;              
	dcb.fNull=0;             
	dcb.fOutX=0;             
	dcb.fOutxCtsFlow=0;      
	dcb.fOutxDsrFlow=0;      
	dcb.fParity=0;           
	dcb.fRtsControl=1;       
	dcb.fTXContinueOnXoff=0; 
	dcb.Parity=2;            
	dcb.StopBits=0;          
	//	//dcb.wReserved=0;         
	//	//dcb.wReserved1=0;        
	dcb.XoffChar=0x13;          
	//dcb.XoffLim=13107;           
	dcb.XonChar=0x11;           
	//dcb.XonLim=13107;
	//////////////////////////////////////////////////////////////
	dcb.fBinary = TRUE;
	dcb.BaudRate = m_nBaudRate; // 波特率
	dcb.ByteSize = m_nByteSize; // 每字节位数
	dcb.fParity = TRUE;
	
	switch(m_nParity)
	{//校验设置
	case PARITYNONE:
		dcb.Parity = NOPARITY;
		break;
	case PARITYODD:
		dcb.Parity = ODDPARITY;
		break;
	case PARITYEVEN:
		dcb.Parity = EVENPARITY;
		break;
	case PARITYMARK:
		dcb.Parity = MARKPARITY;
		break;
	case PARITYSPACE:
		dcb.Parity = SPACEPARITY;
		break;
	default:
		break;
	}
	
	switch(m_nStopBits)
	{//停止位
	case STOPBITONE: 
		dcb.StopBits = ONESTOPBIT;
		break;
	case STOPBITONE5: 
		dcb.StopBits = ONE5STOPBITS;
		break;
	case STOPBITTWO: 
		dcb.StopBits = TWOSTOPBITS;
		break;
	default:
		break;
	}

	int sjjstase=SetCommState(m_hCom, &dcb);
	SetupComm(m_hCom, 13107, 13107);
		
	PurgeComm(m_hCom, PURGE_TXCLEAR);
	PurgeComm(m_hCom, PURGE_RXCLEAR);
	EscapeCommFunction(m_hCom,CLRDTR);
	EscapeCommFunction(m_hCom,SETDTR);
	return sjjstase;
}
/********************************************************************/
/**	功能:	清空缓冲区												*/
/**	参数:	无														*/
/**	返回值:	无														*/
/********************************************************************/
void CSerialPort::ClearBuff()
{
	EnterCriticalSection(&m_csComSync);
	m_CharList.RemoveAll();
	LeaveCriticalSection(&m_csComSync);
}
/********************************************************************/
/**	功能:	读取字符												*/
/**	参数:	无														*/
/**		TRUE--成功													*/
/**		FALSE--失败													*/
/********************************************************************/
BOOL CSerialPort::RecvChar()
{
	if(!m_bInitComOk)
	{
		return FALSE;
	}
	char *cChb,*cCha;
	char cCh;
	int nLength,wh,sj,n;
	UCHAR TempData[10000];
	//zero=0;
	if(!m_bMonitoring)
	{
		//允许读取下一个数据
		SetEvent(m_hCanReadEvent); 
		
		return FALSE;
	}
	
	nLength = ReadCom(&cCh, 1);
	////////////////////SELF
	COMMTIMEOUTS timeouts = { MAXDWORD, 0, 0, 0, 1102 };
	COMMTIMEOUTS timeouts0 = { MAXDWORD, 0, 0, 0, 0 };
		   
	cChb=&cCh;
	cCha=cChb;
	//m_File00.Seek(CFile::begin,CFile::begin);
	//m_File00.Read(TempData,16);
	for(int sjj=0;sjj<nLength;sjj++)
	{ 
	/*	for(int n=1;n<2;n++)
		{	
			MessageBox(NULL,"串口","PHILIPS",MB_OK);
			
			for(int x=10;x<1000;x++){

				WriteCom((char*)yaya,2);

				//if(n>100000)
				//	n=2;

				for(int m=1;m<800000;m++)
				{
					for(int j=1;j<400000;j++)
					;
				}
			}
				
		}
		*/


		if((*cCha==0x49)&&(stase==1))
		{
			
			WriteCom((char*)yaya,1);
			EscapeCommFunction(m_hCom,CLRDTR);   
			//timeouts = {MAXDWORD, 0, 0, 0, 0 };
			SetCommTimeouts( m_hCom, &timeouts0 );
			
			stase=2;
			break;
		}
		else if(  ((*cCha==0x14) ||(*cCha==0x54) ||(*cCha==0x10) || (*cCha==0xffffffc6) || (*cCha==0xffffffc4)|| (*cCha==0x0d)|| (*cCha==0xffffffc6))  && stase==2)//&&(stase==1))
		{
			COMMTIMEOUTS timeouts1 ={MAXDWORD, 0, 0, 0, 3};
			SetCommTimeouts( m_hCom, &timeouts1);
			//m_File00.Seek(16,CFile::begin);
			
				if(bb==1)
				{
					for(n=0;n<100;n++)
					command[n]=command_Z[n];			
				}
				if(bb==0)
				{
					for(n=0;n<100;n++)
					command[n]=command_O[n];				
				}
			
			//m_File00.Read(TempData,59);
			WriteCom((char*)(command),1);//e0
			stase=3;
			break;
		}
		else if((*cCha==0xffffffc0) && stase==3)//0xffffffa0))// && (*(cCha+1)==0x3) && (*(cCha+2)==0x60) && (*(cCha+3)==0xffffffc2) && (*(cCha+4)==0x20) && (*(cCha+5)==0x10) )
		{			//////  check return:0xa0 0x03 0x60 0xc2 0x20 0x10
			SetCommTimeouts( m_hCom, &timeouts0); 
			if(band_select==1)

⌨️ 快捷键说明

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