如何用SetupAPI获取并修改端口设置?

最近在用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;
}

https://jingyan.baidu.com/article/d8072ac45b286eec94cefd4f.html