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