📄 serialcomm.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 + -