// SerialPort.cpp: implementation of the CSerialPort class.
//
//
//Author:horse_b
#include "stdafx.h"
#include "SerialPort.h"
#include /<stdlib.h/>
#include /<stdio.h/>
#include /<time.h/>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
extern CRoadSvrDlg* pRoadSvrDlg;
//LARGE_INTEGER lia, lib, lif, lis;
//int lin;
//串口类的初始化
CSerialPort::CSerialPort()
{
m_blIdle = false;
m_hCom = INVALID_HANDLE_VALUE;
m_hCommWatchThread = NULL;
m_fConnected = false;
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);
m_pEye = NULL;
mReceive = 1024000;
pReceive = new BYTE[mReceive];
m_bClearUntillEmpty = false;
/*#ifdef LPR_DOHERELARGE
memset(m_pEmptyID, 0, e_nIDLength);
m_nImageState = 0;
#endif*/
}
CSerialPort::~CSerialPort()
{
Disconnect();
if (m_osRead.hEvent)
CloseHandle(m_osRead.hEvent);
if (m_osWrite.hEvent)
CloseHandle(m_osWrite.hEvent);
delete pReceive;
}
/****************************************************************************************
* 函数名 : CSerialPort::Connect
* 说 明 : 连接一个串口,非Overlap方式
* 返回值 : BOOL - 是否连接成功
* 参 数 : HWND hWnd - 接收到数据之后,通知的窗口
* 参 数 : CString szCom - 串口名称 "Com1" or "Com2"
* 参 数 : DWORD BaudRate - 波特率 2400 9600 etc.
* 参 数 : BYTE ByteSize - 数据位 8
* 参 数 : BYTE StopBits - 停止位 0,1,2 = 1, 1.5, 2 stop bits
* 参 数 : BYTE Parity - 奇偶校验 0-4=no,odd,even,mark,space
****************************************************************************************/
BOOL CSerialPort::Connect(CString szCom, DWORD BaudRate, BYTE ByteSize, BYTE StopBits, BYTE Parity)
{
if (m_osRead.hEvent == NULL || m_osWrite.hEvent == NULL)
{
m_fConnected = false;
return false;
}
m_hCom = CreateFile(szCom, GENERIC_READ | GENERIC_WRITE,
0, // exclusive access
NULL, // no security attrs
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, // overlapped I/O
NULL);
if (m_hCom == INVALID_HANDLE_VALUE)
{
m_fConnected = false;
return FALSE;
}
SetCommMask(m_hCom, EV_RXCHAR|EV_CTS);
//SetupComm(m_hCom, 20480, 20480);
SetupComm(m_hCom, 512000, 512000);
PurgeComm(m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
DCB dcb;
GetCommState(&dcb);
dcb.BaudRate = BaudRate;
dcb.ByteSize = ByteSize;
dcb.Parity = Parity;
dcb.StopBits = StopBits;
dcb.fBinary = TRUE;
dcb.fParity = TRUE;
dcb.fOutxDsrFlow = false;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fOutxCtsFlow = false;
//#ifdef LPR_DOHERELARGE
// dcb.fRtsControl = RTS_CONTROL_ENABLE;
//#else
dcb.fRtsControl = RTS_CONTROL_DISABLE;
//#endif
dcb.fInX = false;
dcb.fOutX = false;
dcb.XonChar = ASCII_XON;
dcb.XoffChar = ASCII_XOFF;
dcb.XonLim = 100;
dcb.XoffLim = 100;
m_fConnected = SetCommState(&dcb);
if (!m_fConnected)
return false;
COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout = 0;
CommTimeOuts.ReadTotalTimeoutMultiplier = __max(1, 2 * CBR_9600 / BaudRate);
CommTimeOuts.ReadTotalTimeoutConstant = 10;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 0 ;
m_fConnected = ::SetCommTimeouts(m_hCom, &CommTimeOuts) ;
if (!m_fConnected)
return false;
m_hCommWatchThread = CreateThread((LPSECURITY_ATTRIBUTES) NULL,
0,
(LPTHREAD_START_ROUTINE)CommWatchProc,
(LPVOID) this,
0,
&m_dwThreadID);
if (m_hCommWatchThread == NULL)
m_fConnected = false;
SetThreadPriority(m_hCommWatchThread, THREAD_PRIORITY_ABOVE_NORMAL);//THREAD_PRIORITY_TIME_CRITICAL);//THREAD_PRIORITY_HIGHEST);//);
return m_fConnected;
}
BOOL CSerialPort::GetCommState(DCB* pDCB)
{
if (m_hCom == INVALID_HANDLE_VALUE)
return false;
return ::GetCommState(m_hCom, pDCB) ;
}
BOOL CSerialPort::SetCommState(DCB* pDCB)
{
if (m_hCom == INVALID_HANDLE_VALUE)
return false
//
//
//Author:horse_b
#include "stdafx.h"
#include "SerialPort.h"
#include /<stdlib.h/>
#include /<stdio.h/>
#include /<time.h/>
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
extern CRoadSvrDlg* pRoadSvrDlg;
//LARGE_INTEGER lia, lib, lif, lis;
//int lin;
//串口类的初始化
CSerialPort::CSerialPort()
{
m_blIdle = false;
m_hCom = INVALID_HANDLE_VALUE;
m_hCommWatchThread = NULL;
m_fConnected = false;
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);
m_pEye = NULL;
mReceive = 1024000;
pReceive = new BYTE[mReceive];
m_bClearUntillEmpty = false;
/*#ifdef LPR_DOHERELARGE
memset(m_pEmptyID, 0, e_nIDLength);
m_nImageState = 0;
#endif*/
}
CSerialPort::~CSerialPort()
{
Disconnect();
if (m_osRead.hEvent)
CloseHandle(m_osRead.hEvent);
if (m_osWrite.hEvent)
CloseHandle(m_osWrite.hEvent);
delete pReceive;
}
/****************************************************************************************
* 函数名 : CSerialPort::Connect
* 说 明 : 连接一个串口,非Overlap方式
* 返回值 : BOOL - 是否连接成功
* 参 数 : HWND hWnd - 接收到数据之后,通知的窗口
* 参 数 : CString szCom - 串口名称 "Com1" or "Com2"
* 参 数 : DWORD BaudRate - 波特率 2400 9600 etc.
* 参 数 : BYTE ByteSize - 数据位 8
* 参 数 : BYTE StopBits - 停止位 0,1,2 = 1, 1.5, 2 stop bits
* 参 数 : BYTE Parity - 奇偶校验 0-4=no,odd,even,mark,space
****************************************************************************************/
BOOL CSerialPort::Connect(CString szCom, DWORD BaudRate, BYTE ByteSize, BYTE StopBits, BYTE Parity)
{
if (m_osRead.hEvent == NULL || m_osWrite.hEvent == NULL)
{
m_fConnected = false;
return false;
}
m_hCom = CreateFile(szCom, GENERIC_READ | GENERIC_WRITE,
0, // exclusive access
NULL, // no security attrs
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, // overlapped I/O
NULL);
if (m_hCom == INVALID_HANDLE_VALUE)
{
m_fConnected = false;
return FALSE;
}
SetCommMask(m_hCom, EV_RXCHAR|EV_CTS);
//SetupComm(m_hCom, 20480, 20480);
SetupComm(m_hCom, 512000, 512000);
PurgeComm(m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
DCB dcb;
GetCommState(&dcb);
dcb.BaudRate = BaudRate;
dcb.ByteSize = ByteSize;
dcb.Parity = Parity;
dcb.StopBits = StopBits;
dcb.fBinary = TRUE;
dcb.fParity = TRUE;
dcb.fOutxDsrFlow = false;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fOutxCtsFlow = false;
//#ifdef LPR_DOHERELARGE
// dcb.fRtsControl = RTS_CONTROL_ENABLE;
//#else
dcb.fRtsControl = RTS_CONTROL_DISABLE;
//#endif
dcb.fInX = false;
dcb.fOutX = false;
dcb.XonChar = ASCII_XON;
dcb.XoffChar = ASCII_XOFF;
dcb.XonLim = 100;
dcb.XoffLim = 100;
m_fConnected = SetCommState(&dcb);
if (!m_fConnected)
return false;
COMMTIMEOUTS CommTimeOuts;
CommTimeOuts.ReadIntervalTimeout = 0;
CommTimeOuts.ReadTotalTimeoutMultiplier = __max(1, 2 * CBR_9600 / BaudRate);
CommTimeOuts.ReadTotalTimeoutConstant = 10;
CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
CommTimeOuts.WriteTotalTimeoutConstant = 0 ;
m_fConnected = ::SetCommTimeouts(m_hCom, &CommTimeOuts) ;
if (!m_fConnected)
return false;
m_hCommWatchThread = CreateThread((LPSECURITY_ATTRIBUTES) NULL,
0,
(LPTHREAD_START_ROUTINE)CommWatchProc,
(LPVOID) this,
0,
&m_dwThreadID);
if (m_hCommWatchThread == NULL)
m_fConnected = false;
SetThreadPriority(m_hCommWatchThread, THREAD_PRIORITY_ABOVE_NORMAL);//THREAD_PRIORITY_TIME_CRITICAL);//THREAD_PRIORITY_HIGHEST);//);
return m_fConnected;
}
BOOL CSerialPort::GetCommState(DCB* pDCB)
{
if (m_hCom == INVALID_HANDLE_VALUE)
return false;
return ::GetCommState(m_hCom, pDCB) ;
}
BOOL CSerialPort::SetCommState(DCB* pDCB)
{
if (m_hCom == INVALID_HANDLE_VALUE)
return false