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

📄 serial.cpp

📁 uart configuration source based on PC com
💻 CPP
字号:
// Serial.cpp: implementation of the Serial class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "GTcfg.h"
#include "Serial.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
//m_bOpened=FALSE;
Serial::Serial()
{
m_bOpened=FALSE;
}

Serial::~Serial()
{
 if(m_hComDev != INVALID_HANDLE_VALUE)

              ClosePort(m_hComDev);


}

BOOL Serial::Open(int nPort, int nBaud)
{
	if( m_bOpened ) 
		return( FALSE );

	char szPort[15];
	DCB dcb;

	wsprintf( szPort, "COM%d", nPort );
	m_hComDev = CreateFile( szPort, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL );
	if( m_hComDev == NULL ) return( FALSE );

	memset( &m_OverlappedRead, 0, sizeof( OVERLAPPED ) );
	memset( &m_OverlappedWrite, 0, sizeof( OVERLAPPED ) );

	COMMTIMEOUTS CommTimeOuts;
	CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
	CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
	CommTimeOuts.ReadTotalTimeoutConstant = 0;
	CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
	CommTimeOuts.WriteTotalTimeoutConstant = 5000;
	//SetCommTimeouts(m_hComDev, &CommTimeOuts);
	SetCommTimeouts(m_hComDev,&CommTimeOuts);

	m_OverlappedRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
	m_OverlappedWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
   
	dcb.DCBlength = sizeof( DCB );
	GetCommState( m_hComDev, &dcb );
	dcb.BaudRate = nBaud;
	dcb.ByteSize = 8;
	if( !SetCommState( m_hComDev, &dcb ) ||
	!SetupComm( m_hComDev, 10000, 10000 ) ||
	m_OverlappedRead.hEvent == NULL ||
	m_OverlappedWrite.hEvent == NULL ){
	DWORD dwError = GetLastError();
	if( m_OverlappedRead.hEvent != NULL ) CloseHandle( m_OverlappedRead.hEvent );
	if( m_OverlappedWrite.hEvent != NULL ) CloseHandle( m_OverlappedWrite.hEvent );
	CloseHandle( m_hComDev );
	return FALSE;
	}

	m_bOpened = TRUE;

	return m_bOpened;
}

int Serial::InBufferCount()
{
   if( !m_bOpened || m_hComDev == NULL ) return( 0 );

DWORD dwErrorFlags;
COMSTAT ComStat;

//ClearCommError( m_hIDComDev, &dwErrorFlags, &ComStat );
ClearCommError( m_hComDev, &dwErrorFlags, &ComStat );
return (int)ComStat.cbInQue;
            

}

DWORD Serial::ReadData(char *buffer, DWORD dwBytesRead)
{
  if( !m_bOpened || m_hComDev == NULL ) return 0;

	BOOL bReadStatus;
	DWORD dwErrorFlags;
	COMSTAT ComStat;

	ClearCommError( m_hComDev, &dwErrorFlags, &ComStat );
	if( !ComStat.cbInQue ) return 0;

	dwBytesRead = min(dwBytesRead,(DWORD) ComStat.cbInQue);

	bReadStatus = ReadFile( m_hComDev, buffer, dwBytesRead, &dwBytesRead, &m_OverlappedRead );
	if( !bReadStatus ){
	if( GetLastError() == ERROR_IO_PENDING ){
	WaitForSingleObject( m_OverlappedRead.hEvent, 2000 );
	return dwBytesRead;
		}
	return 0;
	}
	return dwBytesRead;
}

DWORD Serial::SendData(const char *buffer, DWORD dwBytesWritten)
{
   if( !m_bOpened || m_hComDev == NULL ) return( 0 );

		BOOL bWriteStat;

		bWriteStat = WriteFile( m_hComDev, buffer, dwBytesWritten, &dwBytesWritten, &m_OverlappedWrite );
		if( !bWriteStat){
		if ( GetLastError() == ERROR_IO_PENDING ) {
		WaitForSingleObject( m_OverlappedWrite.hEvent, 1000 );
		return dwBytesWritten;
		}
		return 0;
		}
		return dwBytesWritten;
}
BOOL Serial::ClosePort(HANDLE hCommPort)

{

       if (hCommPort != INVALID_HANDLE_VALUE)

       {

              //设置连接属性为FALSE

              m_bOpened=FALSE;

 

              //结束线程中WaitCommEvent的等待

              SetCommMask(hCommPort,0);

              

              //阻塞至线程停止

             if(hReadThread)

              {

                     TerminateThread(hReadThread,0);

                     CloseHandle(hReadThread);

              }
    
              

              //清除端口上指定信号的状态

              EscapeCommFunction(hCommPort,CLRDTR);

              EscapeCommFunction(hCommPort,CLRRTS);

              //清除驱动程序内部的发送和接收队列

              PurgeComm(hCommPort,PURGE_TXCLEAR|PURGE_RXCLEAR);

 

              //关闭串口

              CloseHandle (hCommPort);

              hCommPort = INVALID_HANDLE_VALUE;

 

              return TRUE;

       }

       else

       {

              return TRUE;

       }

}

BOOL Serial::setClosePort()

{

     /*  if (m_hComDev != INVALID_HANDLE_VALUE)

       {

              //设置连接属性为FALSE

              m_bOpened=FALSE;

 

              //结束线程中WaitCommEvent的等待

              SetCommMask(m_hComDev,0);

              

              //阻塞至线程停止

            if(hReadThread)

              {

                     TerminateThread(hReadThread,0);

                     CloseHandle(hReadThread);

              }
 
              

              //清除端口上指定信号的状态

              EscapeCommFunction(m_hComDev,CLRDTR);

              EscapeCommFunction(m_hComDev,CLRRTS);

              //清除驱动程序内部的发送和接收队列

              PurgeComm(m_hComDev,PURGE_TXCLEAR|PURGE_RXCLEAR);

 

              //关闭串口

              CloseHandle (m_hComDev);

              m_hComDev = INVALID_HANDLE_VALUE;

 

              return TRUE;

       }

       else

       {

              return TRUE;

       }*/
	if (m_hComDev != INVALID_HANDLE_VALUE)

       {

              //设置连接属性为FALSE

              m_bOpened=FALSE;
 CloseHandle (m_hComDev);
	}
return TRUE;
}

⌨️ 快捷键说明

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