s11092114
工厂测试开发-SZ
采纳率20%
2019-03-06 10:24 阅读 587

MFC中CloseHandle()卡住

MFC中调用CloseHandle()关闭串口句柄时,卡在这里有30s;
debug模式下的报错信息:

10:17:35:406   before close com:000003F0
The thread 0x3D4 has exited with code 0 (0x0).
10:18: 5:408   after close com:000003F0

关闭串口句柄的代码:

        dbg("before close com:%p\r\n",hd);
        if(hd) CloseHandle(hd);
        dbg("after close com:%p\r\n",hd);

代码中没有创建线程,直接用CreateFile打开的串口,为啥会等待这个线程结束才关闭串口呢?
打开串口的代码:

HANDLE com_port_open(const char *com, int baud_rate, int ByteSize, int Parity, int StopBits)
{
        char use_com[64] = {0};
        if(strlen(com) > 4) sprintf(use_com,"\\\\.\\%s",com);
        else memcpy(use_com,com,strlen(com));

    HANDLE hCom = CreateFile(use_com,           // 串口名称或设备路径
              GENERIC_READ|GENERIC_WRITE,       // 读写方式
              0,                    // 共享方式:独占
              NULL,                 // 默认的安全描述符
              OPEN_EXISTING,            // 创建方式
              0,                    // 不需设置文件属性
              NULL                  // 不需参照模板文件
              );
    if(hCom == INVALID_HANDLE_VALUE) return(NULL);      // 打开串口失败

    DCB dcb;                        // 串口控制块
    COMMTIMEOUTS timeouts = {               // 串口超时控制参数
        0,                      // 读字符间隔超时时间:不启用
        1,                      // 读操作时每字符的时间: 1 ms (n个字符总共为n ms)
        CUART_RX_TIMEOUT,               // 基本的(额外的)读超时时间: 200 ms
        2,                      // 写操作时每字符的时间: 2 ms (n个字符总共为n ms)
        2000                        // 基本的(额外的)写超时时间: 2000ms
    };

    GetCommState(hCom,&dcb);                // 取DCB

    dcb.fOutxCtsFlow = FALSE;               // 禁止硬流控, 因为本系统不需要 
    dcb.fOutxDsrFlow = FALSE;
    dcb.fDsrSensitivity = FALSE;
    dcb.fDtrControl = DTR_CONTROL_DISABLE; 
    dcb.fRtsControl = RTS_CONTROL_DISABLE;
    dcb.fAbortOnError = false;

    dcb.BaudRate = baud_rate;
    dcb.ByteSize = ByteSize;
    dcb.Parity = Parity;
    dcb.StopBits = StopBits;
    dcb.fBinary = true; 
    SetCommState(hCom,&dcb);                // 设置DCB

    SetupComm(hCom,64*4096,64*4096);            // 设置输入输出缓冲区大小
    SetCommTimeouts(hCom,&timeouts);            // 设置超时

    DWORD dwError;                      // ie:CE_RXOVER
    COMSTAT cs;
    ClearCommError(hCom,&dwError,&cs);
    PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
    return(hCom);
}

有大神清楚如何缩短这30s不?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

相关推荐