На счет переноса - не возражаю
Код выглядит следующим образом:
инициализация порта производится в функции:
BOOL CDesantDev::Initialize(LPCTSTR lpCommPort)
{
m_hComm=CreateFile(lpCommPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
if(m_hComm==INVALID_HANDLE_VALUE)
return FALSE;
DCB dcb;
dcb.BaudRate = 115200;
dcb.ByteSize = 8;
dcb.DCBlength = sizeof(DCB);
dcb.Parity = false;
dcb.fBinary = true;
dcb.fOutxCtsFlow = false;
dcb.fOutxDsrFlow = false;
dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcb.fDsrSensitivity = false;
dcb.fTXContinueOnXoff = false;
dcb.fOutX = false;
dcb.fInX = false;
dcb.ErrorChar = false;
dcb.fNull = false;
dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcb.fAbortOnError = false;
dcb.StopBits = 2;
COMMTIMEOUTS TimeOuts;
TimeOuts.ReadIntervalTimeout = 1;
TimeOuts.ReadTotalTimeoutConstant = 10;
TimeOuts.ReadTotalTimeoutMultiplier = 1;
TimeOuts.WriteTotalTimeoutConstant = 3;
TimeOuts.WriteTotalTimeoutMultiplier = 1;
SetCommTimeouts(m_hComm,&TimeOuts);
SetCommState(m_hComm,&dcb);
SetupComm(m_hComm,0x1000,0x1000);
SetCommMask(m_hComm,EV_RXCHAR|EV_TXEMPTY|EV_BREAK);
PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
return TRUE;
}
Чтение файла порта производится отдельным потоком, его функция выглядит следующим образом:
DWORD FrDsntInput(LPVOID lParam)
{
BYTE szBuffer[MAX_PACKAGE_SIZE+48];
BOOL bResult;
DWORD dwEvtMask;
DWORD dwError;
DWORD dwBytes;
COMSTAT csStat;
CTerminalDlg* pWnd=(CTerminalDlg*)lParam;
ASSERT(pWnd->IsKindOf(RUNTIME_CLASS(CTerminalDlg)));
CEvent& event=pWnd->m_Quit;
OVERLAPPED o;
o.hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);
HANDLE Handles[]={o.hEvent,event};
for(;
{
ResetEvent(o.hEvent);
if(!WaitCommEvent(pWnd->m_DesantDev.m_hComm,&dwEvtMask,&o))
{
if(WaitForMultipleObjects(2,Handles,FALSE,INFINITE)==WAIT_OBJECT_0+1)break;
}
if(dwEvtMask & EV_BREAK)break;
else if(dwEvtMask & EV_RXCHAR)
{
ClearCommError(pWnd->m_DesantDev.m_hComm,&dwError,&csStat);
ResetEvent(o.hEvent);
if(!ReadFile(pWnd->m_DesantDev.m_hComm, szBuffer, csStat.cbInQue, &dwBytes, &o))
{
if(WaitForMultipleObjects(2,Handles,FALSE,INFINITE)==WAIT_OBJECT_0+1)break;
}
for(UINT i=0;i<csStat.cbInQue;i++)
pWnd->m_DesantDev.m_InBuffer.WriteChar(szBuffer
);
}
}
return 0;
}