串口调试器显示串口并没有关闭 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
}
        }

解决方案 »

  1.   

    你打开串口时使用异步方式,而你等待串口事件是用同步方式。线程无限循环中,WaitCommEvent(...)无限等待中,没有终止。
      

  2.   

    即使异步也不行。请看代码。
    正常关闭程序没有问题,可是在任务管理器-〉进程-〉结束进程 会看到线程少了一个但还保留一个,程序界面几经消失,可进程依然存在,必须禁用串口再起用,进程才消失。
    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
    }
            }