📄 serialcomm.cpp
字号:
////////////////////////////////////////////////////////////////////////////
// class CSerialComm
//
// This class is used for serial link communication.
////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SerialComm.h"
CSerialComm::CSerialComm()
{
m_bConnected = FALSE;
}
// 器飘 sPortName阑 dwBaud 加档肺 楷促.
// ThreadWatchComm 窃荐俊辑 器飘俊 公攫啊 佬躯阑 锭 MainWnd俊 舅府扁
// 困秦 WM_COMM_READ皋矫瘤甫 焊尘锭 鞍捞 焊尘 wPortID蔼阑 傈崔 罐绰促.
BOOL CSerialComm::OpenPort(WORD wPortID, DWORD dwBaud)
{
// Local 函荐.
COMMTIMEOUTS timeouts;
DCB dcb;
//DWORD dwThreadID;
//CString strTemp;
// 函荐 檬扁拳
m_bConnected = FALSE;
m_wPortID = wPortID; // COM1-> 0, COM2->1,,,,,
// overlapped structure 函荐 檬扁拳.
m_osRead.Offset = 0;
m_osRead.OffsetHigh = 0;
if(!(m_osRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL)))
return FALSE;
m_osWrite.Offset = 0;
m_osWrite.OffsetHigh = 0;
if(!(m_osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL)))
return FALSE;
// 器飘 凯扁
m_sPortName.Format("\\\\.\\COM%d", wPortID);
m_hComm = CreateFile(m_sPortName,
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
NULL);
if(m_hComm == (HANDLE) -1) return FALSE;
// 器飘 惑怕 汲沥.
// EV_RXCHAR event 汲沥
SetCommMask(m_hComm, EV_RXCHAR | EV_TXEMPTY);
// InQueue, OutQueue 农扁 汲沥.
//SetupComm(m_hComm, 4096, 4096);
//SetupComm(m_hComm, 65536, 65536);
SetupComm(m_hComm, 1024 * 8, 1024 * 8);
// 器飘 厚快扁.
PurgeComm(m_hComm, PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR);
// timeout 汲沥.
//timeouts.ReadIntervalTimeout = 0xFFFFFFFF;
timeouts.ReadIntervalTimeout = 0x00005000;
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.ReadTotalTimeoutConstant = 0;
timeouts.WriteTotalTimeoutMultiplier = 2*CBR_9600 / dwBaud;
timeouts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts(m_hComm, &timeouts);
//if (!SetDCB(9600)) return FALSE;
// dcb 汲沥
dcb.DCBlength = sizeof(DCB);
GetCommState(m_hComm, &dcb); // 抗傈 蔼阑 佬澜.
dcb.BaudRate = dwBaud;
dcb.ByteSize = DATABITS_8;
dcb.Parity = 0;
dcb.StopBits = ONESTOPBIT;
//dcb.fDtrControl = DTR_CONTROL_ENABLE;
//dcb.fRtsControl = RTS_CONTROL_ENABLE;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
//dcb.fInX = dcb.fOutX = FALSE;
//dcb.XonChar = ASCII_XON;
//dcb.XoffChar = ASCII_XOFF;
//dcb.XonLim = 100;
//dcb.XoffLim = 100;
//dcb.fOutxCtsFlow = TRUE;
//dcb.fOutxDsrFlow = TRUE;
//dcb.fRtsControl = RTS_CONTROL_ENABLE; //RTS_CONTROL_HANDSHAKE;
if(!SetCommState(m_hComm, &dcb))
{
AfxMessageBox("Fail!!");
return FALSE;
}
EscapeCommFunction(m_hComm, CLRDTR);
// 器飘 皑矫 静饭靛 积己.
m_bConnected = TRUE;
/*m_hThreadWatchComm = CreateThread( NULL, 0,
(LPTHREAD_START_ROUTINE)ThreadWatchComm, this, 0, &dwThreadID);
if (! m_hThreadWatchComm)
{
ClosePort();
return FALSE;
}*/
return TRUE;
}
// 器飘甫 摧绰促.
void CSerialComm::ClosePort()
{
m_bConnected = FALSE;
SetCommMask( m_hComm, 0);
PurgeComm( m_hComm,
PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR);
CloseHandle( m_hComm);
}
// 器飘俊 pBuff狼 郴侩阑 nToWrite父怒 敬促.
// 角力肺 静咯柳 Byte荐甫 府畔茄促.
DWORD CSerialComm::WriteComm(void *pBuff, DWORD nToWrite)
{
DWORD dwWritten, dwError, dwErrorFlags;
COMSTAT comstat;
if (! WriteFile( m_hComm, pBuff, nToWrite, &dwWritten, &m_osWrite))
{
if (GetLastError() == ERROR_IO_PENDING)
{
// 佬阑 巩磊啊 巢酒 乐芭唱 傈价且 巩磊啊 巢酒 乐阑 版快 Overapped IO狼
// 漂己俊 蝶扼 ERROR_IO_PENDING 俊矾 皋矫瘤啊 傈崔等促.
// timeouts俊 沥秦霖 矫埃父怒 扁促妨霖促.
while (! GetOverlappedResult( m_hComm, &m_osWrite, &dwWritten, TRUE))
{
Sleep(0);
dwError = GetLastError();
if (dwError != ERROR_IO_INCOMPLETE)
{
//TRACE("(%d)WRITE_Error : ERROR_IO_INCOMPLETE\n", m_wPortID);
ClearCommError( m_hComm, &dwErrorFlags, &comstat);
break;
}
}
}
else
{
dwWritten = 0;
ClearCommError( m_hComm, &dwErrorFlags, &comstat);
}
}
Sleep(0);
return dwWritten;
}
// 器飘肺何磐 pBuff俊 nToWrite父怒 佬绰促.
// 角力肺 佬囚柳 Byte荐甫 府畔茄促.
DWORD CSerialComm::ReadComm(void *pBuff, DWORD nToRead)
{
DWORD dwRead, dwError, dwErrorFlags;
COMSTAT comstat;
//----------------- system queue俊 档馒茄 byte荐父 固府 佬绰促.
ClearCommError( m_hComm, &dwErrorFlags, &comstat);
dwRead = comstat.cbInQue;
if (dwRead > 0)
{
if (! ReadFile( m_hComm, pBuff, nToRead, &dwRead, &m_osRead))
{
if (GetLastError() == ERROR_IO_PENDING)
{
//--------- timeouts俊 沥秦霖 矫埃父怒 扁促妨霖促.
while (! GetOverlappedResult( m_hComm, &m_osRead, &dwRead, TRUE))
{
Sleep(0);
dwError = GetLastError();
if (dwError != ERROR_IO_INCOMPLETE)
{
ClearCommError( m_hComm, &dwErrorFlags, &comstat);
break;
}
}
}
else
{
dwRead = 0;
ClearCommError( m_hComm, &dwErrorFlags, &comstat);
}
}
}
Sleep(0);
return dwRead;
}
BOOL CSerialComm::SetDCB(DWORD nBaud, UINT nByteSize,
UINT nParity, UINT nStop)
{
DCB dcb;
dcb.DCBlength = sizeof(DCB);
GetCommState( m_hComm, &dcb); // 抗傈 蔼阑 佬澜.
dcb.BaudRate = nBaud;
dcb.ByteSize = nByteSize;
dcb.Parity = nParity;
dcb.StopBits = nStop;
// 器飘 厚快扁.
PurgeComm( m_hComm,
PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR);
return SetCommState( m_hComm, &dcb);
}
BOOL CSerialComm::SetDTR(void)
{
return ::EscapeCommFunction(m_hComm,SETDTR);
}
BOOL CSerialComm::ClearDTR(void)
{
return ::EscapeCommFunction(m_hComm,CLRDTR);
}
DWORD CSerialComm::GetOutQLen()
{
DWORD dwErrorFlags;
COMSTAT comstat;
//----------------- system queue俊 措扁等 农扁甫 犬牢.
ClearCommError( m_hComm, &dwErrorFlags, &comstat);
return comstat.cbOutQue ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -