高手帮我看一下这个线程的源码!
无理蛇 2005-09-20 10:40:32 我现在是用两个串口去监视另一个串口与仪器的通讯,一个监视读的数据,一个监视写的数据。
现在有两个问题:
1、我在线程中用下面的代码实现停止线程,关闭串口,可是为什么我用COM1和COM2来进行监视的时候没有问题,可用COM1和COM5进行监视就有问题,停止后要再打开串口进行监视,发现打不开串口,COM1
和COM5都打不开?
if (Terminated)
{
PurgeComm(m_hComm1, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
PurgeComm(m_hComm2, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
if (m_hComm1 != NULL)
{
if (!CloseHandle(m_hComm1))
ShowMessage("CloseHandle1 Error!");
m_hComm1 = NULL;
}
if (m_hComm2 != NULL)
{
if (!CloseHandle(m_hComm2))
ShowMessage("CloseHandle1 Error!");
m_hComm2 = NULL;
}
break;
}
2、为什么有的长的数据要分好几次收?
比如我发了两次数据“ksdjflsajfd"和”ldsajfldsajfd",可是在监视的数据中可能变成“ksdj”、“flsajfdldsajfld”、“sajfd”这样子三段数据,为什么?
线程源码(主要的循环)
for(;;)
{
OVERLAPPED os,READ_OS;
memset(&os,0,sizeof(os));
os.hEvent =CreateEvent(NULL,TRUE,FALSE,NULL);
WaitCommEvent(m_hComm1,&dwEvtMask, &os);
if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)
{
COMSTAT ComStat ;
DWORD dwLength ;
DWORD dwErrorFlags;
DWORD dwBytesRead;
DWORD dwError;
ClearCommError(m_hComm1,&dwErrorFlags,&ComStat );
dwLength = ComStat.cbInQue ;
READ_OS.hEvent =CreateEvent(NULL,TRUE,FALSE,NULL);
if (dwLength>0)
{
BOOL fReadStat;
int i,iCount=0;
for (i=1;i<=dwLength;i++)
{
fReadStat =ReadFile(m_hComm1, lpBuffer,1,&dwBytesRead,&READ_OS);
if (StrLen(lpBuffer)==0)
lpData[iCount]='\0';
else
lpData[iCount]=lpBuffer[0];
iCount++;
}
if (fReadStat)
{
HANDLE hWndMain=FindWindow(NULL, "Port MonitorII V1.0");
COPYDATASTRUCT cdsMain;
cdsMain.dwData=sizeof(COPYDATASTRUCT);
cdsMain.cbData=dwLength;
cdsMain.lpData=(char *)lpData;
SendMessage(hWndMain,WM_COPYDATA,1,(LPARAM)&cdsMain);
}
else
{
if (GetLastError() == ERROR_IO_PENDING)
{
while(!GetOverlappedResult(m_hComm1,&READ_OS,& dwBytesRead, TRUE ))
{
dwError = GetLastError();
if (dwError == ERROR_IO_INCOMPLETE) continue;
}
}
}
}
}
WaitCommEvent(m_hComm2,&dwEvtMask, &os);
if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)
{
COMSTAT ComStat ;
DWORD dwLength ;
DWORD dwErrorFlags;
DWORD dwBytesRead;
DWORD dwError;
ClearCommError(m_hComm2,&dwErrorFlags,&ComStat );
dwLength = ComStat.cbInQue ;
READ_OS.hEvent =CreateEvent(NULL,TRUE,FALSE,NULL);
if (dwLength>0)
{
BOOL fReadStat;
int i,iCount=0;
for (i=1;i<=dwLength;i++)
{
fReadStat =ReadFile(m_hComm2, lpBuffer,1,&dwBytesRead,&READ_OS);
if (StrLen(lpBuffer)==0)
;
else
lpData[iCount]=lpBuffer[0];
iCount++;
}
if (fReadStat)
{
HANDLE hWndMain=FindWindow(NULL, "Port MonitorII V1.0");
COPYDATASTRUCT cdsMain;
cdsMain.dwData=sizeof(COPYDATASTRUCT);
cdsMain.cbData=dwLength;
cdsMain.lpData=(char *)lpData;
SendMessage(hWndMain,WM_COPYDATA,2,(LPARAM)&cdsMain);
}
else
{
if (GetLastError() == ERROR_IO_PENDING)
{
while(!GetOverlappedResult(m_hComm2,&READ_OS,& dwBytesRead, TRUE ))
{
dwError = GetLastError();
if (dwError == ERROR_IO_INCOMPLETE) continue;
}
}
}
}
}
if (Terminated)
{
PurgeComm(m_hComm1, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
PurgeComm(m_hComm2, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_TXABORT);
if (m_hComm1 != NULL)
{
if (!CloseHandle(m_hComm1))
ShowMessage("CloseHandle1 Error!");
m_hComm1 = NULL;
}
if (m_hComm2 != NULL)
{
if (!CloseHandle(m_hComm2))
ShowMessage("CloseHandle1 Error!");
m_hComm2 = NULL;
}
break;
}
Sleep(1);
Application->ProcessMessages();
}