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;
}