高手帮我看一下这个线程的源码!
我现在是用两个串口去监视另一个串口与仪器的通讯,一个监视读的数据,一个监视写的数据。
现在有两个问题:
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();
}
现在有两个问题:
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();
}
...全文
相关推荐
android 帮美女更衣源码
总的来说,"帮美女更衣"这个游戏的源码涵盖了Android开发的多个核心领域,包括UI设计、事件处理、动画制作、资源管理、数据存储、多线程和网络通信,以及性能优化。
(android源码)帮美女更衣
【标题】"(android源码)帮美女更衣"揭示了这是一个基于Android平台的游戏应用,其核心功能是允许用户操作游戏中的角色更换衣物。
大漠多线程范例源码
源码中可能会展示如何配置和使用线程池。9.
TOMCAT的线程池源码
《深入解析Tomcat线程池源码》Tomcat作为一款广泛应用的开源Servlet容器,其在性能优化上有着独到之处。
Linux 线程池源码分析
本文档深入剖析了Linux环境下C语言实现的线程池源码,主要关注于帮助初学者理解和掌握线程池的概念与使用方法。首先,文章介绍了线程池的基本概念,将其比喻为一家公司,由一组线程组成,它们在有任务时工作,


网络及通讯开发
