topmax501 2020-09-08 11:22 采纳率: 50%
浏览 94
已结题

如何用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;
}

  • 写回答

1条回答 默认 最新

  • dabocaiqq 2020-09-08 12:52
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值