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

📄 serialport.cpp

📁 解开压缩包
💻 CPP
字号:

SerialPort::SerialPort()
{
    memset(&mstcCycBufSpRecv,0,sizeof(mstcCycBufSpRecv));
    mstcCycBufSpRecv.iBufSize=CPSP_MAXBUFSIZE_RECV;
    //
 	mhCom=INVALID_HANDLE_VALUE;
    //
    mbRcvEnable=FALSE;
    mhEvtThdCpSpRecv=NULL;
    //
    mpucBufRecv=NULL;
    mdwWaitRecvRslt=WAIT_OBJECT_0;
    mdwRecvLen=0;
}

SerialPort::~SerialPort()
{
}


//
BOOL SerialPort::Open(LPCTSTR lpstrName, DWORD dwBaudRate, UCHAR ucDataBits, UCHAR ucStopBits, UCHAR ucParity, DWORD dwRdIntervTmout, DWORD dwBufSize)
{
	DCB           stcDcbCom;
	COMMTIMEOUTS  stcTmout;


	mhCom=CreateFile(lpstrName,GENERIC_READ|GENERIC_WRITE,0,NULL,
                     OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
	if (mhCom==INVALID_HANDLE_VALUE)
		return FALSE;

	GetCommState(mhCom,&stcDcbCom);
	stcDcbCom.BaudRate =dwBaudRate;
	stcDcbCom.ByteSize =ucDataBits;
	stcDcbCom.StopBits =ucStopBits;
	stcDcbCom.Parity   =ucParity;
	stcDcbCom.fBinary  =TRUE;
	stcDcbCom.fParity  =TRUE;
	stcDcbCom.fOutX    =FALSE;
	stcDcbCom.fInX     =FALSE;
	stcDcbCom.ErrorChar=63;
	SetCommState(mhCom,&stcDcbCom);
	SetupComm(mhCom,dwBufSize,dwBufSize);  //指定串口的内部输入/输出缓冲区的大小

	stcTmout.ReadIntervalTimeout        =dwRdIntervTmout;
	stcTmout.ReadTotalTimeoutMultiplier =0;
	stcTmout.ReadTotalTimeoutConstant   =0;
	stcTmout.WriteTotalTimeoutMultiplier=0;
	stcTmout.WriteTotalTimeoutConstant  =0;
	SetCommTimeouts(mhCom,&stcTmout);

	return TRUE;
}

//
void SerialPort::Close()
{
    //停止串口接收线程
    mbRcvEnable=FALSE;
    if (mhEvtThdCpSpRecv!=NULL)
    {
        WaitForSingleObject(mhEvtThdCpSpRecv,INFINITE);
        CloseHandle(mhEvtThdCpSpRecv);
        mhEvtThdCpSpRecv=NULL;
    }
    //
    if (mstcOvLpRecv.hEvent!=NULL)
    {
        CloseHandle(mstcOvLpRecv.hEvent);
        mstcOvLpRecv.hEvent=NULL;
    }
    //关闭串口
    if (IsOpen())
	    CloseHandle(mhCom);
    mhCom=INVALID_HANDLE_VALUE;
}


//
BOOL SerialPort::StartReceive()
{
    //赋值串口接收OVERLAPPED结构
    memset(&mstcOvLpRecv,0,sizeof(mstcOvLpRecv));
    if ( (mstcOvLpRecv.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL))==NULL )
        return FALSE;
    //启动串口接收线程
    if ( (mhEvtThdCpSpRecv=CreateEvent(NULL,FALSE,FALSE,NULL))==NULL )
        return FALSE;
    mbRcvEnable=TRUE;
	AfxBeginThread(ThdCpSpReceiving,(LPVOID)this);  //启动接收线程
    return TRUE;
}

//
BOOL SerialPort::Send(UCHAR ucarrBuf[], DWORD dwSndLn,  LPDWORD pdwSndLnAct)
{
	OVERLAPPED stcOverLapped;
    DWORD      dwSndLnAct;

	memset(&stcOverLapped,0,sizeof(stcOverLapped));
	if ( (stcOverLapped.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL))==NULL )
        return FALSE;
    WriteFile(mhCom,ucarrBuf,dwSndLn,&dwSndLnAct,&stcOverLapped);
    GetOverlappedResult(mhCom,&stcOverLapped,&dwSndLnAct,TRUE);
    if (pdwSndLnAct!=NULL)
        *pdwSndLnAct=dwSndLnAct;

    return TRUE;
}

//
BOOL SerialPort::Receive(UCHAR ucarrBuf[], DWORD dwRcvLn, LPDWORD pdwRcvLnAct)
{
    DWORD  dwRcvLnAct;
    BOOL   bRetVal;
    DWORD  dwCnt;

    dwRcvLnAct=0;
    bRetVal=FALSE;
    if (mdwWaitRecvRslt==WAIT_OBJECT_0)
    {
        mpucBufRecv=new UCHAR[dwRcvLn+1];
        memset(mpucBufRecv,0,sizeof(*mpucBufRecv)*(dwRcvLn+1));
        ReadFile(mhCom,mpucBufRecv,dwRcvLn,&dwRcvLnAct,&mstcOvLpRecv);
    }
    mdwWaitRecvRslt=WaitForSingleObject(mstcOvLpRecv.hEvent,0);
    if (mdwWaitRecvRslt==WAIT_OBJECT_0)
    {
        GetOverlappedResult(mhCom,&mstcOvLpRecv,&dwRcvLnAct,FALSE);
        if (dwRcvLnAct>0)   //读到数据
        {
            for (dwCnt=0;dwCnt<dwRcvLnAct;dwCnt++)
                ucarrBuf[dwCnt]=mpucBufRecv[dwCnt];
            delete mpucBufRecv;
            mpucBufRecv=NULL;
            bRetVal=TRUE;
        }
    }
    if (pdwRcvLnAct!=NULL)
        *pdwRcvLnAct=dwRcvLnAct;

    return bRetVal;
}


//
BOOL SerialPort::IsOpen()
{
	if(mhCom==INVALID_HANDLE_VALUE)
        return FALSE;
    else
	    return TRUE;
}





//用户定义函数
//串口接收线程
UINT ThdCpSpReceiving(LPVOID pParam)
{
    SerialPort*  pclsSp;
    UCHAR          ucarrBufSp[2];    //串口接收缓冲区

    pclsSp=(SerialPort*)pParam;
    while (pclsSp->mbRcvEnable)
    {
        if ( pclsSp->Receive(ucarrBufSp,1) )
        {
            pclsSp->mstcCycBufSpRecv.ucarrBuf[pclsSp->mstcCycBufSpRecv.iWrtPt]=ucarrBufSp[0];
            pclsSp->mstcCycBufSpRecv.iWrtPt=(pclsSp->mstcCycBufSpRecv.iWrtPt+1)
                                            % pclsSp->mstcCycBufSpRecv.iBufSize;
        }
        else
            Sleep(1);
    }
    //give sem
    SetEvent(pclsSp->mhEvtThdCpSpRecv);
    AfxEndThread(0);
    return 0;
}

⌨️ 快捷键说明

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