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

📄 serialcomm.cpp

📁 串口收发工具
💻 CPP
字号:
// SerialComm.cpp: implementation of the CSerialComm class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SerialComm.h"
#include "manager.h"


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

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

CSerialComm::CSerialComm()
{
   ZeroMemory(m_ReceiveBuffer,sizeof(unsigned char)*MAX_REC_LENGTH);
   m_iReceivePtr =  0;
  
}

CSerialComm::~CSerialComm()
{
   sio_close(m_iCommNumber);
}

int CALLBACK CommRecFillWatcher(long recvlen, int buflen, char *buf, long flen)
{
	TRACE0("Receive \n");
	TRACE3("recvlen = %d,buflen = %d,flen = %d \n" ,recvlen,buflen,flen);
	TRACE1("%s \n" ,buf);
    return 0;
}

int CALLBACK CommSendFillWatcher(long xmitlen, int buflen, char *buf, long flen)
{
	TRACE0("send \n");
	TRACE3("xmitlen = %d,buflen = %d,flen = %d \n" ,xmitlen,buflen,flen);
	TRACE1("%s \n" ,buf);
	return 0;
}


void CALLBACK CommWatcher(int CommNumber)
{
    char TempBuffer[512];
	int  RecLength = sio_read(CommNumber,TempBuffer,512);
	if(RecLength <= 0)
		return ;
	
	CSerialComm* pComm = CManager::GetGlobalSerialComm();
	int TempPtr = pComm->GetReceivePtr();

	if(RecLength > 0)
	{
        if((TempPtr+RecLength) >= MAX_REC_LENGTH) 
		{
			RecLength = MAX_REC_LENGTH - TempPtr;
		}
		if(RecLength > 0 )
		pComm->AddToReceiveBuffer(TempBuffer,RecLength);
		
	}

 	if((CManager::GetNotifyWnd())&&(pComm->GetReceivePtr()))
		::SendMessage(CManager::GetNotifyWnd(),WM_COMMNOTIFY,0,0);
}

BOOL CSerialComm::Open(int CommNumber, int Baut, 
					   BYTE DataBit, BYTE StopBit, BYTE Parity, BYTE Flowcontrol)
{
	m_iCommNumber = CommNumber;
	Close();
    int Ret;

	Ret = sio_open(CommNumber);
	if(Ret != SIO_OK)
		return FALSE;
	
	Ret = sio_ioctl(CommNumber,Baut,DataBit|StopBit|Parity);
	if(Ret != SIO_OK)
		return FALSE;	
	
	Ret = sio_lctrl(CommNumber,0);
	if(Ret != SIO_OK)
		return FALSE;
/*	
	switch(Flowcontrol)
	{
	case 0:
		break;
	case 1:
		Ret = sio_flowctrl(CommNumber,0X3);
        if(Ret != SIO_OK)
		   return FALSE;
        Ret = sio_lctrl(CommNumber,C_DTR);
	    if(Ret != SIO_OK)
		    return FALSE;
		break;
	case 2:
		Ret = sio_flowctrl(CommNumber,0XC);
        if(Ret != SIO_OK)
		   return FALSE;
		Ret = sio_lctrl(CommNumber,C_DTR|C_RTS);
	    if(Ret != SIO_OK)
		   return FALSE;
		break;
    default:
		break;
	}
*/
	Ret = sio_flush(CommNumber,2);
	if(Ret != SIO_OK)
		return FALSE;
	Ret = sio_cnt_irq(CommNumber,CommWatcher,1);
	if(Ret != SIO_OK)
		return FALSE;

	bComOpened = true;
	return TRUE;
} 

void CSerialComm::AddToReceiveBuffer(char *Buffer, int Length)
{

    memcpy(&m_ReceiveBuffer[m_iReceivePtr],Buffer,Length);
	m_iReceivePtr += Length;

}

int CSerialComm::Receive(unsigned char *ReceiveBuffer, int Length)
{
	if(!ReceiveBuffer || !Length)
		return 0;

	if(Length>m_iReceivePtr)
		Length = m_iReceivePtr;
	
	memcpy(ReceiveBuffer,m_ReceiveBuffer,Length);
	m_iReceivePtr -= Length;

	return Length;
}

int CSerialComm::Send(unsigned char *SendBuffer, int Length)
{
    if(!SendBuffer || !Length)
		return 0;

	int Ret = sio_write(m_iCommNumber,(char*)SendBuffer,Length);

	if(Ret >=0 )
		return Ret;

	return 0;
}

void CSerialComm::Close()
{
    sio_close(m_iCommNumber);
	sio_flush(m_iCommNumber,2);
	bComOpened = false;
}

BOOL CSerialComm::SendFile(LPCSTR pszFileName, BYTE ProtocolType)
{

	 CFile File;
	 CFileException e;
	 if(!File.Open(pszFileName,CFile::modeRead,&e))
	 {
         
		 return FALSE;
	 }
     
	 DWORD Length = File.GetLength();
     
	 WORD  TimeOut = (WORD)(Length /(GetCommBaut()/8)*1.5)+10;

	 int Ret;

	 
	 
	 switch(ProtocolType)
	 {
	 case 0://asc
         Ret = sio_FtASCIITx(m_iCommNumber,(char*)pszFileName,CommSendFillWatcher,27);
		 break;
	 case 1://kermit
		 Ret = sio_FtKermitTx(m_iCommNumber,(char*)pszFileName,CommSendFillWatcher,27);
		 break;
     case 2://xmodem1kcrc
		 Ret = sio_FtXmodem1KCRCTx(m_iCommNumber,(char*)pszFileName,CommSendFillWatcher,27);

		 break;
	 case 3://xmodemchecksum
		 Ret = sio_FtXmodemCheckSumTx(m_iCommNumber,(char*)pszFileName,CommSendFillWatcher,27);

		 break;
     case 4://xmodemcrc
		 Ret = sio_FtXmodemCRCTx(m_iCommNumber,(char*)pszFileName,CommSendFillWatcher,27);

		 break;
	 case 5://ymodem
		 Ret = sio_FtYmodemTx(m_iCommNumber,(char*)pszFileName,CommSendFillWatcher,27);

		 break;
     case 6://zmodem
		 Ret = sio_FtZmodemTx(m_iCommNumber,(char*)pszFileName,CommSendFillWatcher,27);

		 break;
     default:break;
	 }

	 if(Ret>=0)
	    return TRUE;

	 return FALSE;
}

BOOL CSerialComm::RecFile(LPCSTR pszFileName, BYTE ProtocolType)
{
	int Ret;
     char*  pFileArray[16];
     pFileArray[0]  = (char*)pszFileName;
	 
	 switch(ProtocolType)
	 {
	 case 0://asc
         Ret = sio_FtASCIIRx(m_iCommNumber,(char*)pszFileName,CommSendFillWatcher,27,5);
		 break;
	 case 1://kermit
		 Ret = sio_FtKermitRx(m_iCommNumber,&(pFileArray[0]),MAX_FILESIZE,CommSendFillWatcher,27);
		 break;
     case 2://xmodem1kcrc
		 Ret = sio_FtXmodem1KCRCRx(m_iCommNumber,(char*)pszFileName,CommSendFillWatcher,27);

		 break;
	 case 3://xmodemchecksum
		 Ret = sio_FtXmodemCheckSumRx(m_iCommNumber,(char*)pszFileName,CommSendFillWatcher,27);

		 break;
     case 4://xmodemcrc
		 Ret = sio_FtXmodemCRCRx(m_iCommNumber,(char*)pszFileName,CommSendFillWatcher,27);

		 break;
	 case 5://ymodem
		 Ret = sio_FtYmodemRx(m_iCommNumber,&(pFileArray[0]),MAX_FILESIZE,CommSendFillWatcher,27);

		 break;
     case 6://zmodem
		 Ret = sio_FtZmodemRx(m_iCommNumber,&(pFileArray[0]),MAX_FILESIZE,CommSendFillWatcher,27);

		 break;
     default:break;
	 }

	 if(Ret>=0)
	    return TRUE;

	 return FALSE;
}

bool CSerialComm::EnableRTS(bool bSetRTS)
{
	int nRtn = sio_RTS(m_iCommNumber,bSetRTS?0:1);
	if(nRtn == SIO_OK)
		return true;
	return false;
}

⌨️ 快捷键说明

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