自動搜算串口

https://blog.csdn.net/sinat_35728816/article/details/81632310  參考

 

Win32系統把文件的概念進行了擴展。無論是文件、通信設備、命名管道、郵件槽、磁盤、還是控制檯,都是用API函數CreateFile來打開或創建的。本程序串口類中打開串口的函數定義如下:

bool My_Com::Open_Com(LPCTSTR  Port)
{
    hCom = CreateFile(
        Port, //將要打開的串口邏輯名
        GENERIC_READ | GENERIC_WRITE, //允許讀和寫
        0, //指定共享屬性,由於串口不能共享,該參數必須置爲0,獨佔方式
        NULL,//引用安全性屬性結構,缺省值爲NULL
        OPEN_EXISTING, /創建標誌,對串口操作該參數必須置爲OPEN_EXISTING
        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, //屬性描述,此處指定該串口異步
        NULL //對串口而言該參數必須置爲NULL);
    if (hCom == INVALID_HANDLE_VALUE)
    {
        printf ("打開串口失敗!\n");
        return FALSE;
    }
    else
    {
        printf("打開串口成功!\n");
    }
    return TRUE;
}
注意:FILE_ATTRIBUTE_NORMAL 和 FILE_FLAG_OVERLAPPED 均代表異步通信。也可以借用CreateFile函數加上for循環實現對外設驅動的掃描以自動找出插入的串口號,其代碼實現如下:

GetCom()
{
    MyComm.hCom = INVALID_HANDLE_VALUE;
    BOOL ret = false;
    int j = 0;
    //逐一進行COM   端口檢測
    printf("正在搜尋當前可用端口...\n");
    for (int i = 1; i <= 10; i++)
    {
        string comname = "COM" + to_string(i);
        MyComm.hCom = CreateFile(stringToLPCWSTR(comname), // 打開串口
            GENERIC_READ | GENERIC_WRITE,  //讀寫方式
            0, //不能共享
            NULL, //安全屬性,一般不用設爲NULL
            OPEN_EXISTING,   //打開已存在的設備
            FILE_ATTRIBUTE_NORMAL,  //普通文件屬性
            NULL);       //無模板
        if (MyComm.hCom != INVALID_HANDLE_VALUE)
        {
            j++;
            printf("端口 COM %d 可用\n", i);
            ret = CloseHandle(MyComm.hCom);
            if (!ret) printf("關閉串口失敗!!");
        }
    }
    if (!j)
    {
        printf("無可用端口!!\n");
        return FALSE;
    }
    else return TRUE;
}

發佈了166 篇原創文章 · 獲贊 87 · 訪問量 43萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章