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

📄 scomm.cpp

📁 一款不错的关于串口升级硬件的软件
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	if(m_hComDev==INVALID_HANDLE_VALUE)return FALSE;
	SetCommMask(m_hComDev,EV_RXCHAR);
	if(m_bUseOverlapped)
	{
		if(!WaitCommEvent(m_hComDev,&dwEventMask,&m_OverlappedStatus))
		{
			if(WaitForSingleObject(m_OverlappedStatus.hEvent,INFINITE)==WAIT_OBJECT_0)
				return TRUE;
			else
				return FALSE;
		}
		else
			return TRUE;
	}
	
	if(WaitCommEvent(m_hComDev,&dwEventMask,NULL) && (dwEventMask & EV_RXCHAR))
		return TRUE;
	else
		return FALSE;
}

/*void CSerial::SetDatasViewp(CMyRichEdit * pView)
{
	m_pcView=pView;
}*/

void CSerial::ShowString(unsigned char *p,DWORD num)
{
		CString str,str1;
//	static line;
//	line+=num;
//	if(m_pcView==NULL || m_bShow==FALSE) return ;
	if(m_bShow == FALSE) return;
	for(DWORD i=0;i<num;i++)
	{
		str1.Format("%02X ",*(p+i));
		str+=str1;
	}

//	m_pcView->ReplaceSel(LPCTSTR(str));
//	m_pcView->ReplaceSel("\r\n");
//	m_pcView->LineScroll(1);
}

void CSerial::GetDefaultDcb()
{
	
	char *buffer1=NULL;
	char buffer[80];

	GetPrivateProfileString("DCB","length","4294967295",buffer,80,szIniFileName);
	m_dcb.DCBlength=strtoul(buffer,&buffer1,10);

	GetPrivateProfileString("DCB","baud rate","10416",buffer,80,szIniFileName);
	m_dcb.BaudRate=strtoul(buffer,&buffer1,10);

	m_dcb.ByteSize=GetPrivateProfileInt("DCB","byte size",8,szIniFileName);
	
	m_dcb.StopBits=GetPrivateProfileInt("DCB","stop bits",0,szIniFileName);
	
	m_dcb.Parity=GetPrivateProfileInt("DCB","parity",0,szIniFileName);
		
}

void CSerial::GetDefaultTimeOuts()
{
	
	char *buffer1=NULL;
	char buffer[80];

	GetPrivateProfileString("CommTimeOuts","ReadIntervalTimeout","4294967295",buffer,80,szIniFileName);
	m_CommTimeOuts.ReadIntervalTimeout = strtoul(buffer,&buffer1,10);
	
	GetPrivateProfileString("CommTimeOuts","ReadTotalTimeoutMultiplier","1",buffer,80,szIniFileName);
	m_CommTimeOuts.ReadTotalTimeoutMultiplier = strtoul(buffer,&buffer1,10);

	GetPrivateProfileString("CommTimeOuts","ReadTotalTimeoutConstant","40",buffer,80,szIniFileName);
	m_CommTimeOuts.ReadTotalTimeoutConstant = strtoul(buffer,&buffer1,10);

	GetPrivateProfileString("CommTimeOuts","WriteTotalTimeoutMultiplier","1",buffer,80,szIniFileName);
	m_CommTimeOuts.WriteTotalTimeoutMultiplier = strtoul(buffer,&buffer1,10);

	GetPrivateProfileString("CommTimeOuts","WriteTotalTimeoutConstant","40",buffer,80,szIniFileName);
	m_CommTimeOuts.WriteTotalTimeoutConstant = strtoul(buffer,&buffer1,10);

}

BOOL CSerial::AutoSetTimeOuts()
{
	m_CommTimeOuts.ReadIntervalTimeout=MAXDWORD;
	if(bIsHostWinNT)
	{
		m_CommTimeOuts.ReadTotalTimeoutConstant =0;
		m_CommTimeOuts.ReadTotalTimeoutMultiplier=0;
		m_CommTimeOuts.WriteTotalTimeoutConstant =0;
		m_CommTimeOuts.WriteTotalTimeoutMultiplier =0;
	}
	else
	{
		m_CommTimeOuts.ReadTotalTimeoutConstant =40;
		m_CommTimeOuts.ReadTotalTimeoutMultiplier=11*1000/m_dcb.BaudRate+1;
		m_CommTimeOuts.WriteTotalTimeoutConstant =40;
		m_CommTimeOuts.WriteTotalTimeoutMultiplier =11*1000/m_dcb.BaudRate+1;		
	}
	
	if(m_hComDev!=INVALID_HANDLE_VALUE) SetCommTimeouts(m_hComDev,&m_CommTimeOuts);
	//if(!SetCommTimeouts(m_hComDev,&m_CommTimeOuts)) return FALSE;
	//Because Win95 & Win98

	return TRUE;	
}

void CSerial::ShowString(BYTE *p, DWORD num, CString szHead, BOOL bAns)
{
	CString str,str1;
//	if(m_pcView==NULL || m_bShow==FALSE) return;
	if(m_bShow == FALSE) return;

	if(bAns)
	{
//		m_pcView->SetCharColor(m_crAH);
//		m_pcView->ReplaceSel(LPCTSTR(szHead));
//		m_pcView->SetCharColor(m_crAD);
		str.Empty();
		for(DWORD i=0;i<num;i++)
		{
			str1.Format("%02X ",*(p+i));
			str+=str1;
		}
		str+=CString("\r\n");
//		m_pcView->ReplaceSel(LPCTSTR(str));
	}
	else
	{
//		m_pcView->SetCharColor(m_crRH);
//		m_pcView->ReplaceSel(LPCTSTR(szHead));
//		m_pcView->SetCharColor(m_crRD);
		str.Empty();
		for(DWORD i=0;i<num;i++)
		{
			str1.Format("%02X ",*(p+i));
			str+=str1;
		}
		str+=CString("\r\n");
//		m_pcView->ReplaceSel(LPCTSTR(str));
	}
//	m_pcView->LineScroll(1);
}

BOOL CSerial::SetBaudRate(DWORD dwNewValue)
{
	m_dcb.BaudRate=dwNewValue;
	if(m_hComDev==INVALID_HANDLE_VALUE) return FALSE;
	SetCommState( m_hComDev, &m_dcb );
//Windows 95 and Windows 98: Because SetLastError is a 32-bit function only, Win32 functions that are actually implemented in 16-bit code do not set the last-error code. You should ignore the last-error code when you call these functions. They include window management functions, GDI functions, and Multimedia functions
		//if(!SetCommState( m_hComDev, &m_dcb )) return FALSE;
	return TRUE;	
}

void CSerial::SetColor(COLORREF crAD, COLORREF crAH, COLORREF crRD, COLORREF crRH)
{
	m_crAD=crAD;
	m_crAH=crAH;
	m_crRD=crRD;
	m_crRH=crRH;
}



/*CFrameData * CSerial::GetDatap()
{
	return m_pData;
}*/

/*void CSerial::SetDatap(CFrameData *pCmdData)
{
	m_pData=pCmdData;
}*/


BOOL CSerial::ClearBuffer()
{
	return PurgeComm(m_hComDev,PURGE_TXCLEAR | PURGE_RXCLEAR|PURGE_RXABORT|PURGE_TXABORT);
}

void CSerial::SetShow(BOOL bShow)
{
	m_bShow=bShow;
}


DWORD CSerial::ReadDataNOWait(BYTE *buffer, DWORD dwBytesToRead)
{
	if( !m_bOpened || m_hComDev == INVALID_HANDLE_VALUE ) return 0;
	
	BOOL bReadStatus;
	DWORD dwErrorFlags;
	DWORD dwEventFlags;
	DWORD dwBytesRead;
	//	DWORD dwEventMask;
	COMSTAT ComStat;
	ClearCommError( m_hComDev, &dwErrorFlags, &ComStat );
	//if(dwErrorFlags) ::AfxMessageBox("Read Datas Error!");
	if( !ComStat.cbInQue ) return 0;
	DWORD dwCount = min(dwBytesToRead,(DWORD) ComStat.cbInQue);
	if(m_bUseOverlapped)
	{
		bReadStatus = ReadFile( m_hComDev, buffer, dwCount, &dwBytesRead, &m_OverlappedRead );
		if( !bReadStatus )
		{
			if(GetLastError() == ERROR_IO_PENDING )//ERROR_IO_INCOMPLETE
			{
				dwEventFlags=WaitForSingleObject( m_OverlappedRead.hEvent, 2000 );
				if(dwEventFlags==WAIT_OBJECT_0||dwEventFlags==WAIT_TIMEOUT)
				{
					GetOverlappedResult(m_hComDev,&m_OverlappedRead,&dwBytesRead,FALSE);
					return dwBytesRead;
				}
				return 0;	
			}	
			return 0;	
		}
	}
	else
	{
		bReadStatus = ReadFile( m_hComDev, buffer, dwCount, &dwBytesRead, NULL );
		if(!bReadStatus) return 0;
	}
	return dwBytesRead;
}

void CSerial::SetRunning(BOOL bRun)
{
	m_bGoAhead=bRun;
}

BOOL CSerial::IsRunning()
{
	return(m_bGoAhead);
}

BOOL CSerial::RecvOneByteReturnOneRevByte(BYTE *ch)
{
	if(ReadData(ch,1)==1)
	{
		BYTE ucTemp;
		ucTemp=~(*ch);
		Sleep(10);
		if(SendData(&ucTemp,1)==1 )
		{
			Sleep(10);
			if(ReadData(&ucTemp,1)>0) return TRUE;
		}
	}
	return FALSE;
}

BOOL CSerial::SendOneByteRecvOneRevByte(BYTE *ch)
{
	BYTE pBuffer[4];
	if(SendData(ch,1)>0 )
	{
		Sleep(10);
		if(ReadData(pBuffer,2)==2 && pBuffer[1]==0xFF-(*ch))
		{
			TRACE("%2X,%2X\n",pBuffer[0],pBuffer[1]);
			return TRUE;
		}	
		return FALSE;
	}	
	return FALSE;
}

void CSerial::SetOverlapped(BOOL bTrue)
{
	m_bUseOverlapped=bTrue;
}

int CSerial::ReceiveBoschFrame(BYTE *pBuffer)
{
	int i=0,iLen;
	if(RecvOneByteReturnOneRevByte(pBuffer+i))
	{	
		iLen=pBuffer[0]+1;
		Sleep(10);
		for(i=1;i<iLen-1;i++)
		{
			if(RecvOneByteReturnOneRevByte(pBuffer+i)==FALSE) return -1;
			Sleep(10);
		} 
		if(ReadData(pBuffer+i,1)!=1) return -1;
		return iLen;
	}
	return -1;
}


/*int CSerial::ReadCanData(BYTE *pBuffer)
{
	int iRet=0;
	BYTE ch;
	

	iRet=ReadData(pBuffer,20);
	return iRet;
}*/

int CSerial::ReadCanData(BYTE *pBuffer)
{
	int iRet=0;
	BYTE ch;
	
	ReadData(&ch,1);
	if(ch!=0x55) iRet=-1;
	ReadData(&ch,1);
	if(ch!=0xAA) iRet=-1;
	ReadData(&ch,1);
	iRet=ReadData(pBuffer,ch+1);
	if(iRet!=ch+1) 
		iRet=-1;
	if(iRet!=-1) 
		iRet=ch;
	else 
		pBuffer[2]=3;
	
	return iRet;
}

/*int CSerial::SendCanData(BYTE *pSendBuffer,int count)
{
	int i;
	unsigned int izyz = 0; 
	BYTE ch,pucBuffer[30]={0x55,0xAA,0x0F,0x61,0xFF};
 	BYTE TempBuff[64]={0};

	
	memcpy(TempBuff,pSendBuffer,count);
	if((TempBuff[0]&0x80)==0x80)
	{
		izyz = 0;
		izyz = ((TempBuff[1]*0x01000000+TempBuff[2]*0x010000+TempBuff[3]*0x0100+TempBuff[4])<<3);
		//izyz = (izyz&0x1fffffff);
		TempBuff[4] = (BYTE)(izyz&0xff);
		TempBuff[3] = (BYTE)((izyz>>8)&0xff);
		TempBuff[2] = (BYTE)((izyz>>16)&0xff);
		TempBuff[1] = (BYTE)((izyz>>24)&0xff);
	}
	
	memcpy(pucBuffer+5,TempBuff,count);
	//check check sum
	ch=pucBuffer[2];
	pucBuffer[pucBuffer[2]+3]=0x00;
	for(i=3; i<count+5; i++) 
		ch^=pucBuffer[i];
    pucBuffer[count+5]=ch;
	
	i=SendData(pucBuffer,6+count);
	return i;
}*/

int CSerial::SendCanData(BYTE *pSendBuffer)
{
	int i;
	BYTE ucLen,pucBuffer[20]={0x55,0xAA,0x00,0x61,0x00};

	ucLen=pSendBuffer[0]&0x0F;
	if(ucLen>8) ucLen=8;
	if(ucStandardCAN) 
	{
		pucBuffer[4]=0x00;
		pucBuffer[2]=ucLen+5;
	}
	else 
	{
		pucBuffer[4]=0xFF;
		pucBuffer[2]=ucLen+7;
	}
	memcpy(pucBuffer+5,pSendBuffer,pucBuffer[2]-2);
	//check check sum
	pucBuffer[pucBuffer[2]+3]=0x00;
	for(i=0; i<=pucBuffer[2]; i++) 
		pucBuffer[pucBuffer[2]+3]^=pucBuffer[i+2];
	
	i=SendData(pucBuffer,pucBuffer[2]+4);
	return i;
}


int CSerial::SendCanData(BYTE *pSendBuffer,int count)
{
	int i;
	unsigned int izyz = 0; 
	BYTE ch,pucBuffer[30]={0x55,0xAA,0x0F,0x61,0xFF};
 	BYTE TempBuff[64]={0};
/*	ucLen=pSendBuffer[0]&0x0F;
	if(ucLen>8) ucLen=8;
	if(ucStandardCAN) 
	{
		pucBuffer[4]=0x00;
		pucBuffer[2]=ucLen+5;
	}
	else 
	{
		pucBuffer[4]=0xFF;
		pucBuffer[2]=ucLen+7;
	}
	*/
	
	memcpy(TempBuff,pSendBuffer,count);
	if((TempBuff[0]&0x80)==0x80)
	{
		izyz = 0;
		izyz = ((TempBuff[1]*0x01000000+TempBuff[2]*0x010000+TempBuff[3]*0x0100+TempBuff[4])<<3);
		//izyz = (izyz&0x1fffffff);
		TempBuff[4] = (BYTE)(izyz&0xff);
		TempBuff[3] = (BYTE)((izyz>>8)&0xff);
		TempBuff[2] = (BYTE)((izyz>>16)&0xff);
		TempBuff[1] = (BYTE)((izyz>>24)&0xff);
	}
	
	memcpy(pucBuffer+5,TempBuff,count);
	//check check sum
	ch=pucBuffer[2];
	pucBuffer[pucBuffer[2]+3]=0x00;
	for(i=3; i<count+5; i++) 
		ch^=pucBuffer[i];
    pucBuffer[count+5]=ch;
	
	i=SendData(pucBuffer,6+count);
	return i;
}


//DEL BOOL CSerial::iAuto()
//DEL {
//DEL 
//DEL }

⌨️ 快捷键说明

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