📄 commthread.cpp
字号:
#include "stdafx.h"
#include "CommThread.h"
extern HWND hCommWnd;
void CQueue::Clear()
{
m_iHead = m_iTail =0;
memset(buff,0,BUFF_SIZE);
}
CQueue::CQueue()
{
Clear();
}
int CQueue::GetSize()
{
return (m_iHead - m_iTail + BUFF_SIZE) % BUFF_SIZE;
}
BOOL CQueue::PutByte(BYTE b)
{
if(GetSize() == (BUFF_SIZE-1)) return FALSE;
buff[m_iHead++] =b;
m_iHead %= BUFF_SIZE;
return TRUE;
}
BOOL CQueue::GetByte(BYTE *pb)
{
if(GetSize() == 0) return FALSE;
*pb = buff[m_iTail++];
m_iTail %= BUFF_SIZE;
return TRUE;
}
//--- 努贰胶 积己磊
CCommThread::CCommThread()
{
//--> 檬扁绰 寸楷洒..器飘啊 凯府瘤 臼篮 惑怕咯具摆烈?
m_bConnected = FALSE;
}
CCommThread::~CCommThread()
{
}
// 器飘 sPortName阑 dwBaud 加档肺 楷促.
// ThreadWatchComm 窃荐俊辑 器飘俊 公攫啊 佬躯阑 锭 MainWnd俊 舅府扁
// 困秦 WM_COMM_READ皋矫瘤甫 焊尘锭 鞍捞 焊尘 wPortID蔼阑 傈崔 罐绰促.
BOOL CCommThread::OpenPort(WORD wPortID, CString strPortName, DWORD dwBaud )
{
// Local 函荐.
COMMTIMEOUTS timeouts;
DCB dcb;
DWORD dwThreadID;
int err;
m_wPortID = wPortID;
// overlapped structure 函荐 檬扁拳.
m_osRead.Offset = 0;
m_osRead.OffsetHigh = 0;
//--> Read 捞亥飘 积己俊 角菩..
if ( !(m_osRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL)) )
{
return FALSE;
}
m_osWrite.Offset = 0;
m_osWrite.OffsetHigh = 0;
//--> Write 捞亥飘 积己俊 角菩..
if (! (m_osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL)))
{
return FALSE;
}
//--> 器飘疙 历厘..
m_sPortName = strPortName;
//--> 角力利牢...RS 232 器飘 凯扁..
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)
{
AfxMessageBox("fail Port ofen");
return FALSE;
}
// dcb 汲沥.... 器飘狼 角力利牢..力绢甫 淬寸窍绰 DCB 备炼眉蔼 悸泼..
dcb.DCBlength = sizeof(DCB);
//--> 泅犁 汲沥等 蔼 吝俊辑..
err = GetCommState( m_hComm, &dcb);
if (err < 0)
{
AfxMessageBox("Could not get comm state", MB_OK|MB_ICONSTOP);
return FALSE;
}
///////////////////////////////////////////////////////////////////////////
// Need to se te baud seperately
dcb.BaudRate = (DWORD)dwBaud;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
dcb.ByteSize = 8;
dcb.fBinary = TRUE; // binary mode, no EOF check
dcb.fOutxCtsFlow = FALSE; // CTS output flow control
dcb.fOutxDsrFlow = FALSE; // DSR output flow control
dcb.fDtrControl = DTR_CONTROL_DISABLE; // DTR flow control type
dcb.fDsrSensitivity = FALSE; // DSR sensitivity
dcb.fOutX = FALSE; // XON/XOFF out flow control
dcb.fInX = FALSE; // XON/XOFF in flow control
dcb.fNull = FALSE; // enable null stripping
dcb.fRtsControl=RTS_CONTROL_DISABLE; // RTS flow control
dcb.fAbortOnError = FALSE; // abort reads/writes on error
err = SetCommState(m_hComm,&dcb);
if (err < 0)
{
AfxMessageBox(_T("Could not set communication state"),MB_OK|MB_ICONSTOP);
return FALSE;
}
//===== 器飘 惑怕 汲沥. =====
// EV_RXCHAR event 汲沥...单捞磐啊 甸绢坷搁.. 荐脚 捞亥飘啊 惯积窍霸阐..
SetCommMask( m_hComm, EV_RXCHAR);
// InQueue, OutQueue 农扁 汲沥.
SetupComm( m_hComm, BUFF_SIZE, BUFF_SIZE);
// 器飘 厚快扁.
PurgeComm( m_hComm,
PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR);
// timeout 汲沥.
timeouts.ReadIntervalTimeout = 0xFFFFFFFF;
timeouts.ReadTotalTimeoutMultiplier = 0;
timeouts.ReadTotalTimeoutConstant = 0;
timeouts.WriteTotalTimeoutMultiplier = 2*CBR_9600 / dwBaud;
timeouts.WriteTotalTimeoutConstant = 0;
SetCommTimeouts( m_hComm, &timeouts);
// 器飘 皑矫 静饭靛 积己.
m_bConnected = TRUE;
//--> 器飘 皑矫 静饭靛 积己.
m_hThreadWatchComm = CreateThread( NULL, 0,
(LPTHREAD_START_ROUTINE)ThreadWatchComm,
this, 0, &dwThreadID);
//--> 静饭靛 积己俊 角菩窍搁..
if (! m_hThreadWatchComm)
{
//--> 凯赴 器飘甫 摧绊..
ClosePort();
return FALSE;
}
check = FALSE;
return TRUE;
}
// 器飘甫 摧绰促.
void CCommThread::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 CCommThread::WriteComm(BYTE *pBuff, DWORD nToWrite)
{
DWORD dwWritten, dwError, dwErrorFlags;
COMSTAT comstat;
//--> 器飘啊 楷搬登瘤 臼篮 惑怕捞搁..
if( !m_bConnected )
{
return 0;
}
//--> 牢磊肺 甸绢柯 滚欺狼 郴侩阑 nToWrite 父怒 静绊.. 敬 肮荐甫.,dwWrite 俊 逞辫.
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))
{
dwError = GetLastError();
if (dwError != ERROR_IO_INCOMPLETE)
{
ClearCommError( m_hComm, &dwErrorFlags, &comstat);
break;
}
}
}
else
{
dwWritten = 0;
ClearCommError( m_hComm, &dwErrorFlags, &comstat);
}
}
//--> 角力 器飘肺 静咯柳 肮荐甫 府畔..
return dwWritten;
}
// 器飘肺何磐 pBuff俊 nToWrite父怒 佬绰促.
// 角力肺 佬囚柳 Byte荐甫 府畔茄促.
DWORD CCommThread::ReadComm(BYTE *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))
{
dwError = GetLastError();
if (dwError != ERROR_IO_INCOMPLETE)
{
ClearCommError( m_hComm, &dwErrorFlags, &comstat);
break;
}
}
}
else
{
dwRead = 0;
ClearCommError( m_hComm, &dwErrorFlags, &comstat);
}
}
}
//--> 角力 佬绢甸牢 肮荐甫 府畔.
return dwRead;
}
// 器飘甫 皑矫窍绊, 佬腮 郴侩捞 乐栏搁
// m_ReadData俊 历厘茄 第俊 MainWnd俊 皋矫瘤甫 焊郴绢 Buffer狼 郴侩阑
// 佬绢啊扼绊 脚绊茄促.
DWORD ThreadWatchComm(CCommThread* pComm)
{
DWORD dwEvent;
OVERLAPPED os;
BOOL bOk = TRUE;
BYTE buff[2048]; // 佬扁 滚欺
DWORD dwRead; // 佬篮 官捞飘荐.
// Event, OS 汲沥.
memset( &os, 0, sizeof(OVERLAPPED));
//--> 捞亥飘 汲沥..
if( !(os.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL)) )
{
bOk = FALSE;
}
//--> 捞亥飘 付胶农..
if( !SetCommMask( pComm->m_hComm, EV_RXCHAR) )
{
bOk = FALSE;
}
//--> 捞亥飘唱..付胶农 汲沥俊 角菩窃..
if( !bOk )
{
AfxMessageBox("Error while creating ThreadWatchComm, " + pComm->m_sPortName);
return FALSE;
}
while (pComm ->m_bConnected)//器飘啊 楷搬登搁 公茄 风橇俊 甸绢皑
{
dwEvent = 0;
// 器飘俊 佬阑 芭府啊 棵锭鳖瘤 扁促赴促.
WaitCommEvent( pComm->m_hComm, &dwEvent, NULL);
//--> 单捞磐啊 荐脚登菌促绰 皋技瘤啊 惯积窍搁..
if ((dwEvent & EV_RXCHAR) == EV_RXCHAR)
{
// 器飘俊辑 佬阑 荐 乐绰 父怒 佬绰促.
//--> buff 俊 罐酒初绊..
do
{
dwRead = pComm->ReadComm( buff, 2048); //甸绢柯 单捞磐 佬绢 坷扁
if(BUFF_SIZE - pComm->m_QueueRead.GetSize() > (int)dwRead)
{
for( WORD i = 0; i < dwRead; i++ )
{
pComm->m_QueueRead.PutByte(buff[i]);//钮 滚欺俊 甸绢柯 单捞磐 持扁
}
}
else
AfxMessageBox("buff full"); //钮滚欺狼 农扁甫 檬苞窍搁 版绊 皋矫瘤 焊晨
}while(dwRead);
::PostMessage(hCommWnd, WM_COMM_READ, 0, pComm->m_wPortID );//CSerialComDlg肺 单捞磐啊 甸绢吭促绰 皋矫瘤甫 焊晨
}
Sleep(0); // 罐篮 单捞磐甫 拳搁俊 焊咯临 矫埃阑 国扁 困秦.
// 单捞磐甫 楷加栏肺 罐栏搁 cpu痢蜡啦捞 100%啊 登绢 拳搁俊 谎妨林绰 累诀捞 肋 救登绊. 搬苞利栏肺
// 钮 滚欺俊 单捞磐啊 阶捞霸 凳
}
CloseHandle( os.hEvent);
//--> 静饭靛 辆丰啊 登摆烈?
pComm->m_hThreadWatchComm = NULL;
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -