📄 portreader.cpp
字号:
#include "StdAfx.h"
#include "PortReader.h"
//##ModelId=3D1671240398
const long BUFFER_SIZE = 256;
CPortReader::CPortReader()
{
m_bIsRun = false;
m_hPort = INVALID_HANDLE_VALUE;
m_hReadThread = NULL;
dwThreadID = 0;
m_bTrue = true;
}
CPortReader::~CPortReader()
{
}
bool CPortReader::ClosePort()
{
if(INVALID_HANDLE_VALUE != m_hPort)
CloseHandle(m_hPort);
return true;
}
//##ModelId=3D1AC4910149
bool CPortReader::ReadPort(char* strBuffer, long& lSize)
{
bool retValue = true;
long iLoop = 0;
long count = 0;
DWORD dwReceived;
BOOL bPortEnd;
DWORD errflag;
COMSTAT commst;
ClearCommError(m_hPort, &errflag, &commst);
DWORD lenrev = (BUFFER_SIZE < commst.cbInQue) ? BUFFER_SIZE : commst.cbInQue;
lSize = lenrev;
memset(strBuffer, 0, lSize);
bool bRemove = true;
// MessageBox(NULL,LPCTSTR("Read!"),LPCTSTR("Now is reading!"),MB_OK);
OVERLAPPED overlapped;
overlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL) ;
if(!(bPortEnd = ReadFile (m_hPort, strBuffer, lenrev, &dwReceived, &overlapped)))
{
AfxMessageBox("Read port error");
return false;
}
return TRUE;
}
//##ModelId=3D1AC4F901CB
DWORD WINAPI ReadPortProc(LPVOID pParam)
{
CPortReader* pReader;
DWORD dwCommStatus;
HANDLE hPort;
pReader = (CPortReader*)pParam;
hPort = pReader->m_hPort;
if((NULL == pReader)||(INVALID_HANDLE_VALUE == hPort))
return 0L;
char pszBuffer[256];
long lReadSize;
SetCommMask (hPort, EV_RXCHAR | EV_CTS | EV_DSR | EV_RLSD | EV_BREAK);
while (pReader->m_bTrue)
{
WaitCommEvent(hPort, &dwCommStatus, NULL);
SetCommMask(hPort, EV_RXCHAR | EV_CTS | EV_DSR | EV_RING | EV_BREAK);
if(dwCommStatus & EV_RXCHAR)
{
lReadSize = BUFFER_SIZE;
memset(pszBuffer, 0, BUFFER_SIZE);
pReader->ReadPort((char*)pszBuffer, lReadSize);
AfxMessageBox(pszBuffer);
}
}
return 0L;
}
bool CPortReader::SuspendGPS()
{
return(0 != SetCommBreak(m_hPort));
}
bool CPortReader::Open(string strDevice)
{
DCB portDCB;
COMMTIMEOUTS CommTimeouts;
bool retValue = false;
int iLoop;
for(iLoop = 0; iLoop < 1; iLoop++)
{
string strTmp = strDevice.substr(0, 3);
if(0 != strTmp.compare("COM"))
break;
m_strPort.assign(strDevice);
char lpszPortName[6];
memset(lpszPortName, 0, sizeof(char)*6);
strcpy(lpszPortName, m_strPort.c_str());
m_hPort = CreateFile(lpszPortName,
GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_FLAG_OVERLAPPED|FILE_ATTRIBUTE_NORMAL,
NULL);
if(INVALID_HANDLE_VALUE == m_hPort)
{
AfxMessageBox("Can't open COM2!");
break;
}
if(!SetupComm(m_hPort, BUFFER_SIZE, BUFFER_SIZE))
break;
if(!PurgeComm(m_hPort, PURGE_RXCLEAR))
break;
portDCB.DCBlength = sizeof(DCB);
GetCommState(m_hPort, &portDCB);
{
portDCB.BaudRate = 9600;
portDCB.ByteSize = 8;
portDCB.Parity = NOPARITY;
portDCB.StopBits = ONESTOPBIT;
portDCB.fDtrControl = DTR_CONTROL_ENABLE;
portDCB.fRtsControl = RTS_CONTROL_ENABLE;
portDCB.fBinary = TRUE;
portDCB.fDsrSensitivity = TRUE;
portDCB.XonChar = 0x10;
portDCB.XoffChar = 0x03;
}
if(!SetCommState(m_hPort, &portDCB))
break;
GetCommTimeouts(m_hPort, &CommTimeouts);
CommTimeouts.ReadIntervalTimeout = MAXDWORD;
CommTimeouts.ReadTotalTimeoutConstant = 0;
CommTimeouts.ReadTotalTimeoutMultiplier = 0;
CommTimeouts.WriteTotalTimeoutConstant = 1000;
CommTimeouts.WriteTotalTimeoutMultiplier = 10;
if(!SetCommTimeouts(m_hPort, &CommTimeouts))
break;
EscapeCommFunction (m_hPort, SETDTR);
EscapeCommFunction (m_hPort, SETRTS);
retValue = true;
}
if(!retValue)
{
if(INVALID_HANDLE_VALUE != m_hPort)
{
CloseHandle(m_hPort);
m_hPort = INVALID_HANDLE_VALUE;
}
}
m_hReadThread = CreateThread(NULL, 0, ReadPortProc, LPVOID(this), 0, 0);
return retValue;
}
bool CPortReader::GetDeviceStatus()
{
return m_bIsRun;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -