高手帮我看一下这个线程的源码!

无理蛇 无理蛇 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我现在是用两个串口去监视另一个串口与仪器的通讯,一个监视读的数据,一个监视写的数据。

现在有两个问题:
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();
}
...全文

相关推荐

评论 4
收藏 已收藏
分享
返回顶部