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

📄 cserial.cpp

📁 通过创建串口类实现了windows ce下的串口通信
💻 CPP
字号:
// Serial.cpp: implementation of the CSerial class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "resource.h"
#include "CSerial.h"

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

CSerial::CSerial()
{
	m_hIDComDev = NULL;
	m_bOpened = FALSE;
}

CSerial::~CSerial()
{
	PortClose();
}

BOOL CSerial::Open( int nPort, int nBaud )
{

	if( m_bOpened ) return( TRUE );

	TCHAR szPort[15];
	DCB dcb;

	wsprintf( szPort, _T("COM%d:"), nPort );
	m_hIDComDev = CreateFile( szPort,
		GENERIC_READ | GENERIC_WRITE,
		0,
		NULL,
		OPEN_EXISTING,
		0,
		NULL 
		);

	if( m_hIDComDev == INVALID_HANDLE_VALUE)
	{
		DWORD dwError=GetLastError();
		//::MessageBox(0,_T("打开端口出错!请确定端口设备的使用情况后关闭重试."),_T("ERROR!"),MB_OK );
		return( FALSE );
	}
	else
	{
		m_bOpened = TRUE;
	}

	// Change the CommTimeOuts structure settings.
	COMMTIMEOUTS CommTimeOuts;
	GetCommTimeouts (szPort, &CommTimeOuts);

    CommTimeOuts.ReadIntervalTimeout = MAXDWORD;  
    CommTimeOuts.ReadTotalTimeoutMultiplier = 0;  
    CommTimeOuts.ReadTotalTimeoutConstant = 0;    
    CommTimeOuts.WriteTotalTimeoutMultiplier = 0;  
    CommTimeOuts.WriteTotalTimeoutConstant = 0;    

	if(!SetCommTimeouts( m_hIDComDev, &CommTimeOuts ))
	{
		//could not creatthe read thread;
		 //::MessageBox (NULL,_T("不能设置延时参数"),_T("ERROR"),MB_OK);
		 DWORD dwError=GetLastError();
		 return FALSE;
	}

	dcb.DCBlength = sizeof( DCB );
	GetCommState( m_hIDComDev, &dcb );
	dcb.BaudRate = nBaud;

    dcb.fBinary = TRUE;               // Binary mode; no EOF check 
    dcb.fParity = TRUE;               // Enable parity checking 
    dcb.fOutxCtsFlow = FALSE;         // No CTS output flow control 
    dcb.fOutxDsrFlow = FALSE;         // No DSR output flow control 
    dcb.fDtrControl = DTR_CONTROL_ENABLE; 
                                      // DTR flow control type 
    dcb.fDsrSensitivity = FALSE;      // DSR sensitivity 
    dcb.fTXContinueOnXoff = TRUE;     // XOFF continues Tx 
    dcb.fOutX = FALSE;                // No XON/XOFF out flow control 
    dcb.fInX = TRUE;                 // No XON/XOFF in flow control 
    dcb.fErrorChar = FALSE;           // Disable error replacement 
    dcb.fNull = FALSE;                // Disable null stripping 
    dcb.fRtsControl = RTS_CONTROL_ENABLE; 
                                      // RTS flow control 
    dcb.fAbortOnError = FALSE;        // Do not abort reads/writes on 
                                      // error
    dcb.ByteSize = 8;                 // Number of bits/byte, 4-8 
    dcb.Parity = 0;            // 0-4=no,odd,even,mark,space 
    dcb.StopBits = ONE5STOPBITS;        // 0,1,2 = 1, 1.5, 2 


	if( !SetCommState( m_hIDComDev, &dcb )||
	!SetupComm( m_hIDComDev, 1024, 1024 )/*||
										 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_hIDComDev );
		//::MessageBox(0,_T("初始化端口不正确!"),_T("ERROR!"),MB_OK );
		return( FALSE );
	}
	
	else
	{
	}
	
	m_bOpened = TRUE;
	
	return( m_bOpened );
}

//======================
BOOL CSerial::PortClose (void)
{
	if (m_bOpened)
	{
		// Close the communication port.
		if (!CloseHandle (m_hIDComDev))
		{
			DWORD dwError = GetLastError ();
			
		}
		else
		{
			//::MessageBox (NULL,_T("正常退出,谢谢使用!"),_T("RIGHT"),MB_OK);   }

			m_bOpened = FALSE;
		}
	}
	else
	{
		return(FALSE); 
	}
	return( TRUE );  
}

BOOL CSerial::SendData( const char *buffer, int size )
{
	DWORD dwNumByteWritten;
	if(!WriteFile(m_hIDComDev,buffer,size,&dwNumByteWritten,NULL))
	{
		DWORD dwError = GetLastError();
		return FALSE;
	}
	return TRUE;
}

int CSerial::ReadData( char *data )
{
	char Byte;
	DWORD dwCommModemStatus,dwBytesTransferred;
	int len = 0;
	
	SetCommMask (m_hIDComDev, EV_RXCHAR | EV_CTS | EV_DSR | EV_RLSD );
	
	if (m_hIDComDev!= INVALID_HANDLE_VALUE) 
	{
		WaitCommEvent (m_hIDComDev, &dwCommModemStatus, 0);
		
		
		SetCommMask (m_hIDComDev, EV_RXCHAR | EV_CTS | EV_DSR );
		
		if (dwCommModemStatus & EV_RXCHAR) 
		{
			// Loop for waiting for the data.
			do 
			{
				// Read the data from the serial port.
				ReadFile (m_hIDComDev,
					&Byte, 
					1, 
					&dwBytesTransferred,
					0
					);
				
				// Display the data read.
				if (dwBytesTransferred == 1)
				{
					data[len] = Byte;
					data[len+1] = 0;
					len++;
				}
			}
			while (dwBytesTransferred == 1);
		}   
	}
	return len;
}

⌨️ 快捷键说明

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