最近在用winapi自带的串口函数在写应用,发现**不**事先在设备管理器的端口设置中配置一下波特率等的话PC可能会蓝屏……而且强调一下这个设置和串口函数的dcb貌似无关,因为蓝屏发生前已经在串口函数中配置过了。
在下已经会用setupAPI获取端口设备描述和串口名称等,但是不知道怎么利用这个库接着设置这个设备管理器中的端口配置。
另外贴上自己写的串口函数,有没有大神鉴定一下这些函数本身导致系统蓝屏的可能?
int CAutoCOMDlg::initCOM(HANDLE h)
{
DCB dcb;
GetCommState(h, &dcb);
dcb.BaudRate = CBR_115200;
dcb.ByteSize = 8;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
COMMTIMEOUTS ctout;
GetCommTimeouts(h, &ctout);
ctout.ReadIntervalTimeout = 1000;
ctout.ReadTotalTimeoutMultiplier = 500;
ctout.ReadTotalTimeoutConstant = 5000;
ctout.WriteTotalTimeoutMultiplier = 500;
ctout.WriteTotalTimeoutConstant = 2000;
if (!SetupComm(h, 1024, 64)) return 2;
if (!SetCommTimeouts(h, &ctout)) return 3;
if (!SetCommState(h, &dcb)) return 1;
if (!PurgeComm(h, PURGE_RXCLEAR | PURGE_TXCLEAR /*| PURGE_RXABORT | PURGE_TXABORT*/)) return 4;
return 0;
}
int CAutoCOMDlg::write2port(HANDLE h, char* buf, DWORD len)
{
DWORD dwErrorFlags;
COMSTAT cstat;
OVERLAPPED oWr;
if (ClearCommError(h, &dwErrorFlags, &cstat))
{
//PurgeComm(h, PURGE_TXABORT | PURGE_TXCLEAR);
}
if (!WriteFile(h, (LPCVOID)buf, len, &len, 0/*&oWr*/))
{
dwErrorFlags = GetLastError();// ERROR_IO_PENDING;
if (dwErrorFlags == ERROR_IO_PENDING)
{
WaitForSingleObject(oWr.hEvent, 1000);
return len;
}
wprintf(L"error flag:%x\n", dwErrorFlags);
return dwErrorFlags;
}
return len;
}
BOOL CAutoCOMDlg::shutPort(HANDLE h)
{
//PurgeComm(h, PURGE_RXCLEAR | PURGE_TXCLEAR | PURGE_TXABORT | PURGE_RXABORT);
return CloseHandle(h);
}
int CAutoCOMDlg::read4port(HANDLE h, char * buf, DWORD len)
{
DWORD dwErrorFlags;
COMSTAT cstat;
OVERLAPPED oWr;
if (ClearCommError(h, &dwErrorFlags, &cstat))
{
//PurgeComm(h, PURGE_RXABORT | PURGE_RXCLEAR);
}
if (!ReadFile(h, (LPVOID)buf, len, &len, 0/*&oWr*/))
{
dwErrorFlags = GetLastError();
if (dwErrorFlags == ERROR_IO_PENDING)
{
GetOverlappedResult(h, &oWr, &len, TRUE);
return len;
}
wprintf(L"error flag:%x\n", dwErrorFlags);
return dwErrorFlags;
}
return len;
}