📄 serial.cpp
字号:
// ComAPI.cpp: implementation of the CSerial class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Serial.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CSerial::CSerial()
{
memset( &m_osRead, 0, sizeof( OVERLAPPED ) );
memset( &m_osWrite, 0, sizeof( OVERLAPPED ) );
m_osRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
m_osWrite.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL );
}
CSerial::~CSerial()
{
}
HANDLE CSerial::OpenSerial( int comno, DCB _dcb )
{
COMMTIMEOUTS TimeOuts;
char InitComNo[32];
DCB dcb;
HANDLE m_hCom = INVALID_HANDLE_VALUE;
sprintf( InitComNo, "\\\\.\\COM%d", comno );
m_hCom = CreateFile(
InitComNo,
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL );
if( m_hCom == INVALID_HANDLE_VALUE ) return INVALID_HANDLE_VALUE;
SetupComm( m_hCom, 4096, 4096 );
SetCommMask( m_hCom, EV_RXCHAR );
TimeOuts.ReadIntervalTimeout = MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier = 0;
TimeOuts.ReadTotalTimeoutConstant = 0;
TimeOuts.WriteTotalTimeoutMultiplier = 50;
TimeOuts.WriteTotalTimeoutConstant = 2000;
SetCommTimeouts( m_hCom, &TimeOuts );
GetCommState( m_hCom, &dcb );
dcb.BaudRate = _dcb.BaudRate;
dcb.ByteSize = _dcb.ByteSize;
dcb.Parity = _dcb.Parity;
dcb.StopBits = _dcb.StopBits ;
dcb.fBinary = TRUE ;
dcb.fParity = FALSE;
if( !SetCommState( m_hCom, &dcb ) ) {
CloseHandle( m_hCom );
return INVALID_HANDLE_VALUE;
}
return m_hCom;
}
DWORD CSerial::ReadSerialData( HANDLE m_hCom, PVOID pData, DWORD dwLength, DWORD dwTimeOut /* = 20 */)
{
DWORD length=0;
COMSTAT ComStat;
DWORD dwErrorFlags;
Sleep( dwTimeOut );
ClearCommError( m_hCom, &dwErrorFlags, &ComStat );
length = min( dwLength, ComStat.cbInQue );
ReadFile( m_hCom, pData, length, &length, &m_osRead );
return length;
}
DWORD CSerial::WriteSerialData( HANDLE m_hCom, PVOID pData, DWORD dwLength )
{
BOOL fState;
DWORD length = dwLength;
COMSTAT ComStat;
DWORD dwErrorFlags;
ClearCommError( m_hCom, &dwErrorFlags, &ComStat );
fState = WriteFile( m_hCom, pData, length, &length, &m_osWrite );
if( !fState ) {
if( GetLastError() == ERROR_IO_PENDING ) {
GetOverlappedResult( m_hCom, &m_osWrite, &length, TRUE );
}
else length = 0;
}
return length;
}
void CSerial::CloseSerial( HANDLE m_hCom )
{
if( m_hCom != INVALID_HANDLE_VALUE ) CloseHandle( m_hCom );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -