串口调试器显示串口并没有关闭 HANDLE _hCommHandle = ::CreateFile(
"\\\\.\\COM3",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
NULL );
if(!::SetCommMask(_hCommHandle, EV_RXCHAR | EV_ERR))
return ; COMSTAT Stat;
DWORD dwError; DWORD dwMask=EV_RXCHAR | EV_ERR;
DWORD dwLength;
for(;;)
{
if(!::WaitCommEvent(_hCommHandle, &dwMask, NULL))
{
if(dwMask & EV_ERR) // == EV_ERR
::ClearCommError(_hCommHandle, &dwError, &Stat); if(dwMask & EV_RXCHAR) // == EV_RXCHAR
{
::ClearCommError(_hCommHandle, &dwError, &Stat);
//recv
}
}
"\\\\.\\COM3",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
NULL );
if(!::SetCommMask(_hCommHandle, EV_RXCHAR | EV_ERR))
return ; COMSTAT Stat;
DWORD dwError; DWORD dwMask=EV_RXCHAR | EV_ERR;
DWORD dwLength;
for(;;)
{
if(!::WaitCommEvent(_hCommHandle, &dwMask, NULL))
{
if(dwMask & EV_ERR) // == EV_ERR
::ClearCommError(_hCommHandle, &dwError, &Stat); if(dwMask & EV_RXCHAR) // == EV_RXCHAR
{
::ClearCommError(_hCommHandle, &dwError, &Stat);
//recv
}
}
正常关闭程序没有问题,可是在任务管理器-〉进程-〉结束进程 会看到线程少了一个但还保留一个,程序界面几经消失,可进程依然存在,必须禁用串口再起用,进程才消失。
OVERLAPPED _WaitOverlapped; memset(&_WaitOverlapped, 0, sizeof(_WaitOverlapped));
_WaitOverlapped.hEvent = ::CreateEvent(NULL, true, false, NULL);
HANDLE _hCommHandle = ::CreateFile(
"\\\\.\\COM3",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
NULL );
if(!::SetCommMask(_hCommHandle, EV_RXCHAR | EV_ERR))
return ; COMSTAT Stat;
DWORD dwError; DWORD dwMask=EV_RXCHAR | EV_ERR;
DWORD dwLength;
for(;;)
{
if(!::WaitCommEvent(_hCommHandle, &dwMask, &WaitOverlapped))
{
if(::GetLastError() == ERROR_IO_PENDING)
{//线程会一直阻塞在这里
::GetOverlappedResult(hCommHandle, &_WaitOverlapped, &dwLength, TRUE);
}
if(dwMask & EV_ERR) // == EV_ERR
::ClearCommError(_hCommHandle, &dwError, &Stat); if(dwMask & EV_RXCHAR) // == EV_RXCHAR
{
::ClearCommError(_hCommHandle, &dwError, &Stat);
//recv
}
}