📄 serial.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 + -