工厂测试开发-SZ 2019-03-06 10:24 采纳率: 0%
浏览 721

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不?

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 Arduino红外遥控代码有问题
    • ¥15 数值计算离散正交多项式
    • ¥30 数值计算均差系数编程
    • ¥15 redis-full-check比较 两个集群的数据出错
    • ¥15 Matlab编程问题
    • ¥15 训练的多模态特征融合模型准确度很低怎么办
    • ¥15 kylin启动报错log4j类冲突
    • ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
    • ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序
    • ¥15 onvif+openssl,vs2022编译openssl64