?? pserialport.cpp
字號(hào):
// 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
//////////////////////////////////////////////////////////////////////
static HANDLE hComport;
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("無(wú)法從串口讀取數(shù)據(jù)!"));
}
else
{
if(dwLength!=0)
{
//回送數(shù)據(jù)
if(m_pSerial->m_lpDataArriveProc!=NULL)
{
m_pSerial->m_lpDataArriveProc(buf,dwLength,m_pSerial->m_dwUserData);
}
}
}
}
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("無(wú)法打開端口!請(qǐng)檢查是否已被占用。"));
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;
//設(shè)置狀態(tài)參數(shù)
SetCommMask(m_hComm,EV_RXCHAR);
SetupComm(m_hComm,16384,16384);
if(!SetCommState(m_hComm,&dcb))
{
AfxMessageBox(_T("無(wú)法按當(dāng)前參數(shù)配置端口,請(qǐng)檢查參數(shù)!"));
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
ClosePort();
return FALSE;
}
//設(shè)置超時(shí)參數(shù)
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("無(wú)法設(shè)置超時(shí)參數(shù)!"));
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==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("無(wú)法打開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("無(wú)法向端口寫入數(shù)據(jù)!"));
}
delete[] buf;
}
cf.Close();
return dwBytesWritten;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -