1. 程式人生 > >MFC自動識別串列埠

MFC自動識別串列埠

 1.新建COMMTEST3工程,新增一個combobox到介面,id設定為IDC_COMBO。

(注意:組合框(ComboBox),執行時點選其右邊的小箭頭拉不下來(即不出現下拉列表)。需如下設定:
這是使用VC++的人最初常遇到的問題,實際上是下拉列表的高度設定不當。組合框的高度是不能修改的,它是由系統決定的,但下拉部分的高度(即在下拉框中顯示多少行)是可以設定的。在VB和Delphi中預設的高度是8行,但在VC++中預設為0。你需要在設計時,用滑鼠在下拉箭頭上(必須是這個位置)點一下,這時出現下圖所示的方框,拉住下方的藍塊向下移動,直到一個滿意的高度為止。)

2.新增如下程式碼到COMMTEST3Dlg.cpp    

1 void CCOMMTEST3Dlg::GetCom()
2 {
3 //程式啟動時獲取全部可用串列埠
4 HANDLE hCom;
5 int i,num,k;
6 CString str;
7 BOOL flag;

9 ((CComboBox *)GetDlgItem(IDC_COMBO))->ResetContent();
10 flag = FALSE;
11 num = 0;
12 for (i = 1;i <= 16;i++)
13 {//此程式支援16個串列埠
14 str.Format("\\\\.\\COM%d",i);
15 hCom = CreateFile(str, 0, 0, 0, 
16 OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

17 if(INVALID_HANDLE_VALUE != hCom )
18 {//能開啟該串列埠,則新增該串列埠
19 CloseHandle(hCom);
20 str = str.Mid(4);
21 ((CComboBox *)GetDlgItem(IDC_COMBO))->AddString(str);
22 if (flag == FALSE)
23 {
24 flag = TRUE;
25 num = i;
26 }
27 }
28 }
29 i = ((CComboBox *)GetDlgItem(IDC_COMBO))->GetCount();
30 if (i == 0)
31 {//若找不到可用串列埠則禁用“開啟串列埠”功能

32 ((CComboBox *)GetDlgItem(IDC_COMBO))->EnableWindow(FALSE);
33 }
34 else
35 {
36 k = ((CComboBox *)GetDlgItem((IDC_COMBO)))->GetCount();
37 ((CComboBox *)GetDlgItem(IDC_COMBO))->SetCurSel(k - 1);
38 //mCom.BindCommPort(num);
39 }
40 }

  3.OnInitDialog()中加入GetCom();

  4.標頭檔案中加入void GetCom();

  5.執行程式,獲取可用串列埠

附錄:VC中如何開啟Com10及以上的串列埠(轉載)

    今天用以前的一個串列埠程式,發現串列埠怎麼也打不開。因為用的串列埠不是常規的COM1、COM2而是大於Com10的埠,想著是很簡單的增加幾個選項就可以輕鬆搞定的,結果加上後測試,發現總是初始化失敗,除錯發現在CreateFile裡總是失敗,找到MSDN一看果然這裡有區別。

   Win32 API函式CreateFile()除了可開啟普通檔案外,還可以開啟裝置,比如可用於開啟串列埠,獲得串列埠控制代碼。使用CreateFile()函式開啟串列埠時檔案共享模式應設定為0(表示獨佔),建立引數設定為OPEN_EXISTING,模板必須設定為NULL。

   如果為COM1至COM9,可使用“COM1”-“COM9”作為檔名傳遞給CreateFile()函式,函式可成功返回。但是,如果操作物件為COM10及以上的埠,以此方式命名檔名呼叫CreateFile()函式會返回INVALID_HANDLE_VALUE,表示埠無法開啟。

   產生這種奇怪現象的原因是:微軟預定義的標準裝置中含有“COM1”-“COM9”。所以,“COM1”-“COM9”作為檔名傳遞給函式時作業系統會自動地將之解析為相應的裝置。但對於COM10及以上的串列埠,“COM10”之類的檔案名系統只視之為一般意義上的檔案,而非序列裝置。

   為了增加對COM10及以上串列埠的支援,微軟規定,如果要訪問這樣的裝置,應使用這樣的檔名(以COM10為例):\\.COM10
   所以,對於COM10及以上的串列埠,CreateFile()的呼叫樣式應調整如下:

CreateFile(
"\\\\.\\COM10",           // 定義串列埠名
fdwAccess,                // 存取模式(讀寫)
0,                               // 共享模式:必須設定為0,表示裝置獨佔使用
NULL,                        // 保密性
OPEN_EXISTING,      // 必須設定為OPEN_EXISTING
0,                               // 檔案屬性,如果是非同步模式,可設定為
NULL                         // 模版,串列埠裝置必須設定為NULL
);