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

📄 rs232.cpp

📁 监控摄像头(高速球)的调节程序
💻 CPP
字号:
// Rs232.cpp: implementation of the CRs232 class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Rs232.h"

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

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

CRs232::CRs232(void)
{
	 memset(&m_osWrite,0,sizeof(OVERLAPPED));
	 memset(&m_osRead,0,sizeof(OVERLAPPED));
	 m_bConnected = FALSE;
	 m_hThreadTerm = CreateEvent(NULL,FALSE,FALSE,NULL);
	 m_osRead.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
	 m_osWrite.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
}
CRs232::~CRs232(void)
{
	 if(m_bConnected)//如果已打开串口
		CloseConnection();//关闭、释放串口
	 CloseHandle(m_hThreadTerm);
	 CloseHandle(m_osRead.hEvent);
     CloseHandle(m_osWrite.hEvent);
}
int CRs232::OpenConnection(LPCTSTR szComPort,DWORD dwBaudRate,BYTE cByteSize,BYTE cStopBits,BYTE cParity,BOOL bDTR_DSR,BOOL bRTS_CTS,BOOL bXON_XOFF)
{
	 BOOL e_InitializeComm = TRUE;
	 BOOL e_OpenComm = FALSE;
	 if(m_bConnected)//已经打开  
		return 0;    
	 SetEvent(m_osWrite.hEvent);
	 m_hComDev = CreateFile(szComPort,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
	 if(m_hComDev == INVALID_HANDLE_VALUE)
		return e_OpenComm;//返回不能打开串口错误代码
	 DCB dcb;
	 dcb.DCBlength = sizeof(DCB);
	 GetCommState(m_hComDev,&dcb);
	 dcb.BaudRate = dwBaudRate;
	 dcb.ByteSize = cByteSize;
	 dcb.Parity = cParity;   
	 dcb.StopBits = cStopBits;
	 //硬件流控制.  bDTR_DSR、bRTS_CTS一般取默认值0,有Modem时应取1  
	 dcb.fOutxDsrFlow = (bDTR_DSR!=0);
	 if(bDTR_DSR)
		dcb.fDtrControl = DTR_CONTROL_HANDSHAKE;
	 else
		dcb.fDtrControl = DTR_CONTROL_ENABLE;
	 dcb.fOutxCtsFlow = (bRTS_CTS!=0);
	 if(bRTS_CTS)
		dcb.fRtsControl = RTS_CONTROL_HANDSHAKE;
	 else
		dcb.fRtsControl = RTS_CONTROL_ENABLE;
	 dcb.fInX = dcb.fOutX = (bXON_XOFF!=0);//软件流控制
	 dcb.fBinary = TRUE;
	 dcb.fParity = TRUE;
	 if(SetCommState(m_hComDev,&dcb))
	 {
		  //配置串口参数成功    
		  SetCommMask(m_hComDev,EV_RXCHAR);
		  //设置接收、发送缓冲区大小
		  SetupComm(m_hComDev,RXQUEUE,TXQUEUE);
		  COMMTIMEOUTS CommTimeOuts;
		  CommTimeOuts.ReadIntervalTimeout = MAXDWORD;
		  CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
		  CommTimeOuts.ReadTotalTimeoutConstant = 10;
		  CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
		  CommTimeOuts.WriteTotalTimeoutConstant = 0;
		  SetCommTimeouts(m_hComDev,&CommTimeOuts);
		  m_bConnected = TRUE;
		  return TRUE;
	 }  
	 m_bConnected = FALSE;
	 CloseHandle(m_hComDev);
	 return FALSE;
}
int CRs232::ReadCommBlock(unsigned char* lpszBlock,int nMaxLength)
{  
	 COMSTAT ComStat;//串口状态结构
	 DWORD  dwLength,dwErrorFlags,m_dwLength;
	 ClearCommError(m_hComDev,&dwErrorFlags,&ComStat);
	 m_dwLength = min((DWORD)nMaxLength,ComStat.cbInQue);//将要读取的数据字节数
	 if(m_dwLength> 0)
	 {
		if(!ReadFile(m_hComDev, lpszBlock,m_dwLength,&dwLength,&m_osRead))//从串口读入数据
		{
			if(GetLastError() == ERROR_IO_PENDING)
			{
				if(!GetOverlappedResult(m_hComDev,&m_osRead,&dwLength,TRUE))//挂起,直到操作完成        
					ClearCommError(m_hComDev,&dwErrorFlags,&ComStat);			
					WaitForSingleObject(m_osWrite.hEvent,1000); 
					return  dwLength;//正在后台发送
				
			}
		}
	 }
	 return  dwLength;//返回已读入的数据字节数  
}
int CRs232::WriteCommBlock(LPCVOID lpByte,UINT nBytesToWrite)
{  
	int e_NotConnected =0;
	int  e_TransmitError =0;
	int e_TransmitNotFinished =0;
	DWORD   dwBytesWritten,  dwErrorFlags; 
	COMSTAT  ComStat;
	if(!m_bConnected)//串口没有打开      
		return e_NotConnected;
	if(WaitForSingleObject(m_osWrite.hEvent,0)  !=  WAIT_OBJECT_0)
		return  e_TransmitNotFinished;
	ResetEvent(m_osWrite.hEvent);
	if(!WriteFile(m_hComDev,lpByte,nBytesToWrite,&dwBytesWritten,&m_osWrite))
	{
	  //往串口发送数据
	  if(GetLastError() == ERROR_IO_PENDING)
	  {
		  WaitForSingleObject(m_osWrite.hEvent,1000); 
		  return  dwBytesWritten;//正在后台发送
	  }
	   
	  ClearCommError(m_hComDev,&dwErrorFlags,&ComStat);//出现错误,清除错误标志
		return e_TransmitError;//发送出错
	}
	return  0;//WriteFile返回1,发送成功}
}
BOOL CRs232::CloseConnection()
{ 
	 if(!m_bConnected) 
		return FALSE;
	 SetEvent(m_hThreadTerm);
	 m_bConnected = FALSE;
	 SetCommMask(m_hComDev,0);
	 EscapeCommFunction(m_hComDev,CLRDTR);
	 CloseHandle(m_hComDev);//关闭、释放串口 
	 return TRUE;
}

BOOL CRs232::IsConnected()
{
	 if(!m_bConnected)
		return FALSE;
	 else
		return TRUE;
}

⌨️ 快捷键说明

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